关于函数传参--传指针,传引用
2014-08-09 21:55
381 查看
今天和同学讨论到指针和引用的传递问题,有些想法从推理上讲是正确的,但是因为是推理,说出自己观点的时候不是那么有底气,本着实践是检验真理的唯一标准的原则
,在电脑上敲了几段代码,验证了推理的正确性。 先上代码,再分析。
代码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:
运行结果:
关于f1(A *p),它传递的也是地址,在函数内部使用这个符号“->”它操作的是这个地址对应的内存中的数据,所以可以修改成员的值。f2(A *p)同样是解引用操作参见上面的Swap2。
如有错误,多谢指正。
,在电脑上敲了几段代码,验证了推理的正确性。 先上代码,再分析。
代码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。
如有错误,多谢指正。
相关文章推荐
- 关于const 与 引用 在函数传参的时候 区别
- 关于函数返回值为引用和指针的问题
- 【函数传参】值、指针和引用的区别
- 函数的传参方式有值传递和地址传递,地址传递又分为指针传递和引用传递。
- java-关于值传参和引用传参:c-值传递和指针传递
- 再开一篇关于C++程序设计基核心之一:引用,指针,符号优先级,函数参数传递
- 关于函数传参,传引用 以及编译器的优化问题
- 关于接口、变量、指针、函数名和引用之间的联系
- 2010.8.16 关于函数参数是指针、还是引用的区别
- 在为函数传参时, 何时用引用,何时用指针呢?
- 从一段经典错误代码说起——关于局部变量指针和函数传参的问题分析
- 关于函数不能返回局部对象的引用或者局部对象的指针
- 二级指针和指针引用函数传参(C++)
- C++指针与引用(一):函数传参,是该传对象,还是传指针,抑或是引用
- 函数传参、传引用、传指针时间复杂度分析
- 关于C中函数参数,指针-常量-引用解释的4个函数例子
- 时间复杂度_函数传参、传引用、传指针
- C/C++中关于地址、指针和引用变量的学习笔记(四) : 函数
- 关于c/c++ 中的函数指针
- C++学习笔记(13)——利用对象、引用、指针调用虚函数