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;
}