|
|
10鱼币
本帖最后由 湮汐 于 2012-3-23 12:54 编辑
我这有三个关于指针交换数据的问题,一直搞不懂
1,指针做形参传递给函数,交换地址。- # include <stdio.h>
- void fun(int *p,int *q);
- int main()
- {
- int x,y;
- int *p;
- int *q;
-
- x=3;
- y=5;
- p=&x;
- q=&y;
- printf("*p= %d, *q= %d\n",*p,*q);
- printf("p= %d, q= %d\n",p,q);
- fun(p,q);
- printf("*p3= %d,*q3= %d\n",*p,*q);
- printf("p3= %d, q3= %d\n\n",p,q);
- fun(&x,&y);
- printf("x = %d,y = %d\n",x,y);
- }
- void fun(int *p,int *q)
- {
- int m;
- printf("*p1= %d, *q1= %d\n",*p,*q);
- printf("p1= %d, q1= %d\n",p,q);
-
- m=p;
- p=q;
- q=m;
- printf("*p2= %d, *q2= %d\n",*p,*q);
- printf("p2= %d, q2= %d\n",p,q);
- }
复制代码 2.指针传递给函数,交换指针变量。- # include <stdio.h>
- void fun(int *p,int *q);
- int main()
- {
- int x,y;
- int *p;
- int *q;
-
- x=3;
- y=5;
- p=&x;
- q=&y;
- printf("*p= %d, *q= %d\n",*p,*q);
- printf("p= %d, q= %d\n",p,q);
- fun(p,q);
- printf("*p3= %d,*q3= %d\n",*p,*q);
- printf("p3= %d, q3= %d\n\n",p,q);
- fun(&x,&y);
- printf("x = %d,y = %d\n",x,y);
- }
- void fun(int *p,int *q)
- {
- int m;
- printf("*p1= %d, *q1= %d\n",*p,*q);
- printf("p1= %d, q1= %d\n",p,q);
-
- m=*p;
- *p=*q;
- *q=m;
- printf("*p2= %d, *q2= %d\n",*p,*q);
- printf("p2= %d, q2= %d\n",p,q);
- }
复制代码 3.指针不传递给函数,直接在main函数中交换地址- # include <stdio.h>
- int main()
- {
- int x,y;
- int *p;
- int *q;
- int *m;
- x=3;
- y=5;
- p=&x;
- q=&y;
- printf("*p= %d, *q= %d\n",*p,*q);
- printf("p= %d, q= %d\n",p,q);
- m=p;
- p=q;
- q=m;
- printf("*p3= %d,*q3= %d\n",*p,*q);
- printf("p3= %d, q3= %d\n\n",p,q);
- printf("x = %d,y = %d\n",x,y);
- }
复制代码 为什么第一个不能交换,第二个和第三个可以交换啊?这是为啥啊?
请大家仔细阅读这三个程序,搞清楚其中的不同点,我现在都晕了,到底用指针传递给函数,为什么必须用指针变量交换而不能交换地址呢?
对于指针,我不好描述我的问题,总而言之,为什么第一个无法交换主函数中*p 和 *q的值;第二个和三个可以当然可以,我是懂的。
总之,为什么函数里面改变了 pq的值,不影响主函数,;而在函数里改变pq指向的变量 *p *q,却对主函数有影响呢?
|
最佳答案
查看完整内容
本质上说,是由于C语言函数参数的值传递机制.
值传递,就是相当于说在函数调用的时刻,给实参拍了一张照片,把照片传到函数里去,(不管照片如何被人蹂拧,实参还是不变的).
根据以上原理,我们可以知道:
int a=1, b= 2;
f(a,b);
以上函数调用f(a,b)后,无论f是如何定义的,a和b的值都不可能改变.因为传进f的不是a和b,而是a和b的照片
同理:
int* pa=...;
int* pb=...;
f(pa,pb);
以上函数调用f(pa,pb)后,无论f是如何定义的,pa和 ...
|