今天和同学讨论到指针和引用的传递问题,有些想法从推理上讲是正确的,但是因为是推理,说出自己观点的时候不是那么有底气,本着实践是检验真理的唯一标准的原则,在电脑上敲了几段代码,验证了推理的正确性。 先上代码,再分析。
代码1:
void Swap0(int a1,int b1){ int temp; temp=a1; a1=b1; b1=temp; } void Swap1(int *a1,int *b1){ //交换地址 int *temp; temp=a1; a1=b1; b1=a1; } void Swap2(int *a1,int *b1){ int temp; temp=*a1; *a1=*b1; *b1=temp; } void Swap3(int &a1,int &b1){ int temp; temp=a1; a1=b1; b1=temp; } int main(){ int a=1,b=2; Swap0(a,b); cout<<"Swap0 a:"<<a<<" b:"<<b<<endl; Swap1(&a,&b); cout<<"Swap1 a:"<<a<<" b:"<<b<<endl; Swap2(&a,&b); cout<<"Swap2 a:"<<a<<" b:"<<b<<endl; a=1;b=2; Swap3(a,b); cout<<"Swap3 a:"<<a<<" b:"<<b<<endl; return 1; }运行结果:
关于Swap0(int a1,int b1),当调用这个函数时,main函数中的a=1,b=2会把1和2,这两个值传递给Swap0()中的a1和b1,Swap0()中的a1和b1是这个函数的局部变量,他们只是接受了1和2这两个值,并在函数内部将这两个局部变量的值做了交换,和main()中的a,b不存在关联也就是对main()中的a,b的值没有影响,所有执行Swap0后输出的值还是a为1,b为2。
关于Swap1(int *a1,int *b1)和Swap2(int *a1,int *b1)它们的参数是一样的,不同的是Swap1的函数内部操作的是指针,而Swap2使用的是解引用*,有什么不同呢,从内存的角度来分析:main函数中定义了a和b,并且赋值为1和2,可以理解为系统为a分配了一块内存来存储1,为b分配了一块内存来存储2,我们可以先假设分配给a的内存的起始地址为1000,b的是1004,也就是&a=1000,&b=1004。调用Swap1(int *a1,int *b1),把这两个地址分别传递给a1,b1,也就是a1=1000,b1=1004,对指针变量的值进行交换,只不过是变成了a1=1004,b1=1000,变得只是a1,b1这两个指针变量的值,对a和b的内存没有影响,所以输出结果还是a=1,b=2。但是Swap2就不同了,它进行了解引用操作,*a1表示他获得了1000这个地址的值,并对这个地址上的数据进行操作(重点是要理解这个解引用操作,百度百科解释点击打开链接)它操作的是这块内存,所以它能成功修改a和b的值。
关于Swap3(int &a1,int &b1)它是传递引用,引用是变量的别名,和操作a,b这两个变量一样,所以能够改变a,b的值。
代码2:
typedef struct{ int a; }A; void f1(A *p){ p->a=p->a+1; } void f2(A *p){ (*p).a=(*p).a+1; } int main(){ A p; p.a=1; f1(&p); cout<<"f1 p.a="<<p.a<<endl; p.a=1; f2(&p); cout<<"f2 p.a="<<p.a; return 1; }
关于f1(A *p),它传递的也是地址,在函数内部使用这个符号“->”它操作的是这个地址对应的内存中的数据,所以可以修改成员的值。f2(A *p)同样是解引用操作参见上面的Swap2。
如有错误,多谢指正。
关于函数传参--传指针,传引用,布布扣,bubuko.com
原文:http://blog.csdn.net/littlebeat123/article/details/38458753