无论是值传递,指针传递,引用传递其实都是发生了一次赋值;不同的在于传递的数据类型不同而已;
首先分析“赋值”也就是 “=”的意义
我们分析下以下代码
1 void test(){
2 int a;
3 int b =10;
4 a = b;
5 int c = b;
6 }
在代码执行到方法内部的时候就为改方法内的所有局部变量分配了空间(Java则是执行到了才申请空间,这点很不同),
而无论是对 a, b,c的初始化,赋值;只要是使用了 “=”就是将一个值放在变量的所占用的空间中;无论这个变量是指针,还是引用;而变量名就是这个地址的一个名字;
1、值传递
void test2(int p, int q) {
p=11;
q=22;
}
int main()
{
int ma =10, mb =20;
test2(ma,mb);
}
在执行test2(ma,mb);时传参其实是 做了一件事,int p = ma;int q = mb;将ma,mb的值赋给p,q;准确的说是将ma,mb这个变量所代表地址中装的东西拷贝到p,q所代表的地址中;
所以以上代码等价于
int main()
{
int ma =10, mb =20;
int p = ma;
int q = mb;
p=11;
q=22;
printf("ma = %d",ma);//10
printf("mb = %d",mb);//20
}
2、指针传递
那么把值传递的想法放到指针传递中是否成立呢?
答案是成立!!
//指针传递验证
void test3(int* p, int* q) {
*p = 11;
*q = 22;
}
int main()
{
int ma = 10;
int mb = 20;
int* mtemp = &ma;
test3(mtemp, &mb);
printf("ma = %d\n ", ma);//11
printf("mb = %d\n ", mb);//12
}
说白呢就是做了 int* p =mtemp; int* q = &mb;而 “=” 其实就是将变量中的值,或者一个立即数赋给左边;
同理以上代码等价于
//指针传递验证
int main()
{
int ma = 10;
int mb = 20;
int* mtemp = &ma;
int* p =mtemp;
int* q = &mb;
p=11;
q=12;
printf("ma = %d\n ", ma);//11
printf("mb = %d\n ", mb);//12
}
3、引用传递
那么把以上想法放到想法放到引用传递中是否成立呢?
答案是成立!!
void test4(int &p, int&q) {
p = 11;
q = 22;
}
int main()
{
int a = 10;
int b = 20;
test4(a,b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;
}
依然能够使用 int& p =a; int& q = b;解释;
上面的代码等价于
int main()
{
int a = 10;
int b = 20;
int& p = a;
int& q = b
p = 11;
q = 22;
cout << "a=" << a << endl;//11
cout << "b=" << b << endl;//22
}
所以传参的过程中其实就是发生了一次赋值,讲什么立即数,深拷贝浅拷贝把人都绕晕了;