C:指针函数一些误区

当我们学完指针,知道每个数在内存中都占有一定的字节,也就是地址,才有取地址符号&,所以要交换两个数必须把这两个数所对应的内存互换,比如a=2;b=3;要让它们互换且输出,我们用一个函数来试试

 1 #include "stdio.h"
 2 int temp(int x,int y)
 3 {
 4     int c;
 5     c=x;
 6     x=y;
 7     y=c;
 8     }
 9 void main()
10 {
11     int a,b;
12     a=2;
13     b=3;
14     temp(a,b);
15     printf("a=%d,b=%d",a,b);
16 }

很显然,这个方法并不行,它只是在表面互换a,b的值,并且函数只有在运行的时候是有内存的,当结束时,函数的内存便撤掉,让我们再看一个更让人误解的例子:

 1 #include "stdio.h"
 2 int temp(int x,int y)
 3 {
 4 int *p,*q,t;
 5 p=&x;
 6 q=&y;
 7 t=*p;
 8 *p=*q;
 9 *q=t;
10 }
11 void main()
12 {
13    int a,b;
14    a=2;
15    b=3;
16    temp(a,b);
17    printf("a=%d,b=%d",a,b); 
18 }

上面函数用了指针为什么还是不行?其实跟上一个例子差不多,在主函数main()中调用temp(a,b)作为实参传递给int temp(int x,int y)形参期间传递的是值2,3;并不是a,b的地址,然后取的是2,3的地址,结果就是2,3的地址互换,然而a=2,b=3还是没变,接下来看个正确是例子:

 1 #include "stdio.h"
 2 int temp(int *p,int *q)
 3 {
 4 int t;
 5 t=*p;
 6 *p=*q;
 7 *q=t;
 8 }
 9 void main()
10 {
11     int a,b;
12     a=2;
13     b=3;
14     temp(&a,&b);
15     printf("a=%d,b=%d",a,b); 
16 }

运行结果:,这时实参是temp(&a,&b);互换a,b的地址。

posted @ 2016-02-04 22:55  await  阅读(337)  评论(0编辑  收藏  举报