言简意赅+图解 函数传参问题(传值、传地址 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;
}