鱼C论坛

 找回密码
 立即注册
查看: 3691|回复: 9

关于指针的问题,纠结了很长时间啊!

[复制链接]
发表于 2012-3-23 12:09:56 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 湮汐 于 2012-3-23 12:54 编辑

我这有三个关于指针交换数据的问题,一直搞不懂


1,指针做形参传递给函数,交换地址。
  1. # include <stdio.h>
  2. void fun(int *p,int *q);
  3. int main()
  4. {        
  5.         int x,y;
  6.         int *p;
  7.         int *q;
  8.         
  9.         x=3;
  10.         y=5;
  11.         p=&x;
  12.         q=&y;
  13.         printf("*p= %d, *q= %d\n",*p,*q);
  14.         printf("p= %d, q= %d\n",p,q);
  15.         fun(p,q);

  16.         printf("*p3= %d,*q3= %d\n",*p,*q);
  17.         printf("p3= %d, q3= %d\n\n",p,q);

  18.         fun(&x,&y);
  19.         printf("x = %d,y = %d\n",x,y);
  20. }

  21. void fun(int *p,int *q)
  22. {
  23.         int m;
  24.         printf("*p1= %d, *q1= %d\n",*p,*q);
  25.         printf("p1= %d, q1= %d\n",p,q);
  26.         
  27.         m=p;
  28.         p=q;
  29.         q=m;
  30.         printf("*p2= %d, *q2= %d\n",*p,*q);
  31.         printf("p2= %d, q2= %d\n",p,q);
  32. }
复制代码
2.指针传递给函数,交换指针变量。
  1. # include <stdio.h>
  2. void fun(int *p,int *q);
  3. int main()
  4. {        
  5.         int x,y;
  6.         int *p;
  7.         int *q;
  8.         
  9.         x=3;
  10.         y=5;
  11.         p=&x;
  12.         q=&y;
  13.         printf("*p= %d, *q= %d\n",*p,*q);
  14.         printf("p= %d, q= %d\n",p,q);
  15.         fun(p,q);

  16.         printf("*p3= %d,*q3= %d\n",*p,*q);
  17.         printf("p3= %d, q3= %d\n\n",p,q);

  18.         fun(&x,&y);
  19.         printf("x = %d,y = %d\n",x,y);
  20. }

  21. void fun(int *p,int *q)
  22. {
  23.         int m;
  24.         printf("*p1= %d, *q1= %d\n",*p,*q);
  25.         printf("p1= %d, q1= %d\n",p,q);
  26.         
  27.         m=*p;
  28.         *p=*q;
  29.         *q=m;
  30.         printf("*p2= %d, *q2= %d\n",*p,*q);
  31.         printf("p2= %d, q2= %d\n",p,q);
  32. }
复制代码
3.指针不传递给函数,直接在main函数中交换地址
  1. # include <stdio.h>
  2. int main()
  3. {        
  4.         int x,y;
  5.         int *p;
  6.         int *q;
  7.         int *m;

  8.         x=3;
  9.         y=5;
  10.         p=&x;
  11.         q=&y;
  12.         printf("*p= %d, *q= %d\n",*p,*q);
  13.         printf("p= %d, q= %d\n",p,q);

  14.         m=p;
  15.         p=q;
  16.         q=m;

  17.         printf("*p3= %d,*q3= %d\n",*p,*q);
  18.         printf("p3= %d, q3= %d\n\n",p,q);


  19.         printf("x = %d,y = %d\n",x,y);
  20. }
复制代码
为什么第一个不能交换,第二个和第三个可以交换啊?这是为啥啊?
请大家仔细阅读这三个程序,搞清楚其中的不同点,我现在都晕了,到底用指针传递给函数,为什么必须用指针变量交换而不能交换地址呢?
对于指针,我不好描述我的问题,总而言之,为什么第一个无法交换主函数中*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和 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-23 12:09:57 | 显示全部楼层
本帖最后由 仰望天上的光 于 2012-3-23 13:50 编辑

本质上说,是由于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和pb的值都不可能改变.因为传f的是pa和pb的照片

但此时,你不能确定f调用完后pa,pb所指向的内容是否改变,虽然传f的是pa,pb的照片,但该照片上记录的是
两个地址,你可以通过这两个地址改变该地址上的内容.而地址上的内容正好也是pa,pb指向的内容.

总之,当你要通过条用一个函数改变一个变量的时候,首先你要把该变量的地址传进函数里,其次在函数内部要修改该地址上的值.

像LZ的第一个程序里:
void fun(int *p,int *q)
该函数内部没有修改p和q指向的值,居然企图修改p,q本身的值(p,q本身的值仅仅是实参的照片而已,修改了也没有用)

后面两个程序的道理是很简单的,就不作说明了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-23 12:31:32 | 显示全部楼层
第一个这样写不对:
因为 int  m ; //m是整型
30.        m=p;  //p  和 q是指针类型  不能这样赋值;

31.        p=q;

32.        q=m;

所以你要这样写的话 那只能传值 24. void fun(int  p,int  q){。。。。}
传值就是复制一份 所以你改变不了变量的值

第二个就是传址
也就是说把指针指向变量 所以改变指针指向的变量就相当于直接对变量进行修改

还有一种你这里面没写的
就是引用。。。
引用就是取别名  所以同样对别名的改变也就是对变量本身的改变。。。





小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-23 12:54:33 | 显示全部楼层
看图吧 未命名.JPG

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
湮汐 + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-3-23 12:57:39 | 显示全部楼层
本帖最后由 湮汐 于 2012-3-23 13:02 编辑


唉!没办法了,只能当作定理记了。被调函数里面改变了 pq的值,但是 不影响调用它的函数;如果被调函数里改变了 指针指向的变量 才会影响到调用它的函数。但还是很谢谢了!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-23 13:03:51 | 显示全部楼层
用p,q交换只是改变p,q的指向让,p指向y,q指向x所以改变不了x,y的值
*P,*q变换是交换x,y所在地址数据的值,能影响主函数x,y的值
第一题交换不成功是,p,q在函数中是临时变量,不影响主函数

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
湮汐 + 2 + 2 赞一个!谢谢了,在QQ里面为我解答那么长时间.

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-23 13:03:53 | 显示全部楼层
湮汐 发表于 2012-3-23 12:57
唉!没办法了,只能当作定理记了。被调函数里面改变了 pq的值,但是 不影响调用它的函数;如果被调函数 ...

等楼主学会汇编就可以知道他们实质的区别了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-3-23 13:07:59 | 显示全部楼层
wAterLoo 发表于 2012-3-23 13:03
等楼主学会汇编就可以知道他们实质的区别了

嗯嗯,正打算开始学习会变的,谢谢了!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-23 13:12:16 | 显示全部楼层
这是用函数交换主函数指针指向的方法
# 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);
                return 0;
}

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);
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-3-23 14:01:35 | 显示全部楼层
仰望天上的光 发表于 2012-3-23 13:45
本质上说,是由于C语言函数参数的值传递机制.
值传递,就是相当于说在函数调用的时刻,给实参拍了一张照片,把 ...

讲的太好了!太感谢了!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-14 19:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表