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的地址互换了。程序运行见下图。

 

posted @ 2020-02-22 17:40  PennyXia  阅读(1285)  评论(1编辑  收藏  举报