言简意赅+图解 函数传参问题(传值、传地址 500字解决战斗)

1、传值

2、传地址

        不论是传值,还是传地址,形参都是对于实参的一份拷贝

下图为按值传递进行交换:

形参left拷贝一块新空间,形参right拷贝一块新空间

 下图为按指针传递进行交换

形参left拷贝一块新的空间,形参right拷贝一块新的空间

通过上面发现,形参就是实参的一份拷贝,不论你是按值传递还是按指针传递。

那么知道了形参就是实参的一份拷贝之后,那么就要继续探索拷贝的这块空间中存的啥??

值传递:显而易见的,存放的就是10 和 20 这俩个数值,值传递就是拷贝一块空间,然后把内容放入新的空间中。   进行交换,函数退出,形参释放,实参不变……额 没有交换

那么传地址呢?

其实也一样,也是创建一块空间,把内容放入我的新空间中,只是不同的是这次放的不是一个简单的数据,而是一个地址,通过对这个地址就可以访问实参中的数据,我能访问到实参,那么就与实参空间内容产生联系,我对你进行解引用交换修改岂不是一步到位?

所以为什么说传地址就能修改实参的值呢?原因就是上面这段话。

 进行交换,对形参解引用,访问实参中的数据

函数退出、形参释放、完成修改!!!

void Swap1(int *left, int *right)
{
	cout << "形参的值:" << endl;
	cout << "left 的地址:" << left << endl;
	cout << "right 的地址:" << right << endl;
	cout << "形参的地址:" << endl;
	cout << "left 的地址:" << &left << endl;
	cout << "right 的地址:" << &right << endl;

	int *temp = left;
	*left = *right;
	right = temp;
	
}

void Swap2(int left, int right)
{
	cout << "形参的值:" << endl;
	cout << "left 的地址:" << left << endl;
	cout << "right 的地址:" << right << endl;
	cout << "形参的地址:" << endl;
	cout << "left 的地址:" << &left << endl;
	cout << "right 的地址:" << &right << endl;

	int temp = left;
	left = right;
	right = temp;

}

int main()
{
	int a = 10;
	int b = 20;
	cout << "交换前:" << endl;
	cout << "a 的实参地址为" << &a << endl;
	cout << "b 的实参地址为" << &b << endl;
	Swap2(a, b);
	cout << "交换后:" << endl;
	cout << "a = " << a << " b = " << b << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_66151870/article/details/129109469