C/C++中函数参数传递的三种情况(p *p &p)
1 #include <stdio.h> 2 void swap(int a,int b){ 3 int temp=a; 4 a=b; 5 b=temp; 6 } 7 int main(){ 8 int a=1,b=2; 9 swap(a,b); 10 printf("%d %d",a,b); 11 return 0; 12 }
方法一:
以上这种做法不能交换两个数。
这是因为函数在接受参数的过程中是单向一次性的值传递,即在调用swap(a,b)的时候将a b的值传进去了,相当于传进去一个副本,对副本进行操作不会影响main函数中的a b的值。
1 #include <stdio.h> 2 void swap(int* a,int* b){ 3 int temp=*a; 4 *a=*b; 5 *b=temp; 6 } 7 int main(){ 8 int a=1,b=2; 9 int* p1=&a;//指针不初始化很危险 10 int* p2=&b; 11 swap(p1,p2); 12 printf("%d %d\n",a,b); 13 printf("%d %d\n",*p1,*p2); 14 return 0; 15 }
方法二:
以上这种做法能交换两个数。
因为指针变量存放的是地址,那么使用指针变量作为参数时传进来的也是地址。在上式中,把&a和&b 作为参数传递进去,在swap函数中指针a存放&a,指针b存放&b,实现了直接对地址中存放的数据进行操作,因此交换操作会改变main函数中a与b的值。
只有在获取地址的情况下对地址指向的数据进行操作,才能真正地修改变量。
1 #include <stdio.h> 2 void swap(int* a,int* b){ 3 int *temp=a; 4 a=b; 5 b=temp; 6 } 7 int main(){ 8 int a=1,b=2; 9 int* p1=&a; 10 int* p2=&b; 11 printf("%d %d\n",*p1,*p2); 12 printf("%d %d\n",&a,&b); 13 swap(p1,p2); 14 printf("%d %d\n",*p1,*p2); 15 printf("%d %d\n",&a,&b); 16 return 0; 17 }
方法三:
以上这种做法不能交换两个数。
因为这种做法本质上和方法一一样,swap函数交换完地址之后main函数里的a和b的地址其实没有被交换。其实,main函数传给swap函数的“地址”是一个“无符号整数”,其本身也跟普通变量一样只是值传递。
1 #include <stdio.h> 2 void swap(int &x,int &y){ 3 int temp=x; 4 x=y; 5 y=temp; 6 } 7 int main(){ 8 int a=1,b=2; 9 printf("%d %d\n",a,b); 10 swap(a,b); 11 printf("%d %d\n",a,b); 12 return 0; 13 }
方法四:
以上这种方法能交换两个数。
使用C++中的“引用”,可以不产生副本,而是给原来的变量起一个别名。对引用变量的操作就是对原变量的操作,可以达到在函数中修改函数外部变量的效果。即在上式中x=a y=b,所以对x y进行修改其实也是对a b进行修改。
1 #include <stdio.h> 2 void swap(int* &x,int* &y){ 3 int* temp=x; 4 x=y; 5 y=temp; 6 } 7 int main(){ 8 int a=1,b=2; 9 int* p1=&a; 10 int* p2=&b; 11 printf("%d %d\n",*p1,*p2); 12 printf("%d %d\n",&a,&b); 13 swap(p1,p2); 14 printf("%d %d\n",*p1,*p2); 15 printf("%d %d\n",&b,&a); 16 return 0; 17 }
方法五:
以上这种做法能交换两个数。
因为对指针进行了引用,所以改变指针x y 就是改变指针p1 p2,即main函数中a b的地址互换了。程序运行见下图。
作者:PennyXia
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。