鱼C论坛

 找回密码
 立即注册
查看: 1577|回复: 7

[已解决]关于指针的问题

[复制链接]
发表于 2017-10-17 21:27:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想将main函数中的a=1通过指针形式改成a=2
方法一

  1. #include<stdio.h>

  2. void f(int **);
  3. void f(int **ptr)
  4. {
  5.         int b = 2;
  6.         *ptr = &b;
  7. }

  8. int main()
  9. {
  10.         int a = 1;
  11.         int *p;
  12.         p = &a;
  13.         printf("*p= %d, p= %p\n", *p, p);
  14.        
  15.         f(&p);
  16.         printf("*p= %d, p= %p\n", *p, p);
  17.        
  18.         return 0;
  19. }
复制代码

方法二

  1. #include<stdio.h>

  2. void f(int *);
  3. void f(int *p)
  4. {
  5.         int b = 2;
  6.         p = &b;
  7. }

  8. int main()
  9. {
  10.         int a = 1;
  11.         int *p = &a;
  12.         printf("*p= %d, p= %p\n", *p, p);
  13.        
  14.         f(p);
  15.        
  16.         printf("*p= %d, p= %p\n", *p, p);
  17.        
  18.         return 0;
  19. }
复制代码


方法二是因为局部变量不成功,方法一就不知道为什么成功了?
我觉得方法一中的*ptr = &b与方法二中的p = &b是一样的,都是把b的地址赋值给指针啊!!(谢谢大家)
最佳答案
2017-10-18 09:52:18
wushi 发表于 2017-10-17 22:38
你好,我觉得方法一中的*ptr = &b与方法二中的p = &b是一样的,*ptr=p的啊,不就相当于*ptr=p=&b吗?怎么 ...

应该还没看懂我那个解释。
函数里的代码是局部作用域,第二个方法虽然传过去的是p指针,但是p在main里的参数包括地址信息都被保存在了栈中,传过去的只是一个叫p的指针,一个空壳并且指向a,也可以理解为重新生成的p(也可以叫t、c、d随便的),就是继承了main里p的属性,不是main里p的本体,改变 t 函数的p指向b,也值是属于 t 函数,回到了main函数里就消失了,代替它的是本体的 p。
再来说第一个方法,第一个方法穿进去的参数是 &p,这个意思是p的根本(地址),就算 t 函数里怎么描述(叫t、c、d)结果都是指向 p 的地址改变了参数指向 b 后那地址也就跟着被改变了。
就像跑得了和尚,跑不了庙。在外面怎么浪都行,回家的地址就在那,但是要是出去浪的时候被搬家了,那是不是只能被迫的去新家,老家就回不去了。就是这个意思,参数都是自己出去浪,第一个把它老家搬了,第二个只是把它样子改了(化妆啥的让人认不出),那回来的时候第一个就要去新家了,第二个还不是要回到原来的老家。
要是还有什么不明白的再问,明白了麻烦点下“最佳答案”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-17 22:12:27 | 显示全部楼层
这么说吧,你的两个方法都是改变指针的指向,而函数的变量你也说了是局部的,是局部作用域,原函数的数据会保存,当返回后该函数中的信息会被释放,重新继承了原函数里的参数。
第一个利用指针的指针去改变指针自身的值(指向的数据的地址),从而起到改变指针的作用;第二个是直接改变了指针的指向,但是没有改变自身的指向(前面说了,可以理解为外壳,改变了外壳的样子,但是本质没变),所以返回后依然指向了a。
对了,这两个函数改变的是p,而a依旧没变,可以打印看看。要想改变a,就要再对指针解引用直接赋值为2,比如第一个代码在 f 函数里直接:**ptr = 2;
还有,第一个程序的,return 0后面的;是中文了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-17 22:30:09 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-17 22:12
这么说吧,你的两个方法都是改变指针的指向,而函数的变量你也说了是局部的,是局部作用域,原函数的数据会 ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-17 22:38:48 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-17 22:12
这么说吧,你的两个方法都是改变指针的指向,而函数的变量你也说了是局部的,是局部作用域,原函数的数据会 ...

你好,我觉得方法一中的*ptr = &b与方法二中的p = &b是一样的,*ptr=p的啊,不就相当于*ptr=p=&b吗?怎么第一个就可以成功,第二就不可以,这里没搞懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-18 09:52:18 | 显示全部楼层    本楼为最佳答案   
wushi 发表于 2017-10-17 22:38
你好,我觉得方法一中的*ptr = &b与方法二中的p = &b是一样的,*ptr=p的啊,不就相当于*ptr=p=&b吗?怎么 ...

应该还没看懂我那个解释。
函数里的代码是局部作用域,第二个方法虽然传过去的是p指针,但是p在main里的参数包括地址信息都被保存在了栈中,传过去的只是一个叫p的指针,一个空壳并且指向a,也可以理解为重新生成的p(也可以叫t、c、d随便的),就是继承了main里p的属性,不是main里p的本体,改变 t 函数的p指向b,也值是属于 t 函数,回到了main函数里就消失了,代替它的是本体的 p。
再来说第一个方法,第一个方法穿进去的参数是 &p,这个意思是p的根本(地址),就算 t 函数里怎么描述(叫t、c、d)结果都是指向 p 的地址改变了参数指向 b 后那地址也就跟着被改变了。
就像跑得了和尚,跑不了庙。在外面怎么浪都行,回家的地址就在那,但是要是出去浪的时候被搬家了,那是不是只能被迫的去新家,老家就回不去了。就是这个意思,参数都是自己出去浪,第一个把它老家搬了,第二个只是把它样子改了(化妆啥的让人认不出),那回来的时候第一个就要去新家了,第二个还不是要回到原来的老家。
要是还有什么不明白的再问,明白了麻烦点下“最佳答案”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-19 00:53:32 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-18 09:52
应该还没看懂我那个解释。
函数里的代码是局部作用域,第二个方法虽然传过去的是p指针,但是p在main里的 ...

  1. #include<stdio.h>

  2. void f(int *);
  3. void f(int *p)
  4. {
  5.         *p = 2;
  6. }


  7. int main(void)
  8. {
  9.         int a = 1;
  10.         int *p = &a;
  11.         printf("*p= %d, p= %p\n", *p, p);
  12.        
  13.         f(p);
  14.        
  15.         printf("*p= %d, p= %p\n", *p, p);
  16.        
  17.        
  18.         return 0;
  19. }
复制代码

为什么这个又可以直接改成*p=2啊,这个传进去的参数难道不是“值传递”吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-19 10:15:05 | 显示全部楼层
wushi 发表于 2017-10-19 00:53
为什么这个又可以直接改成*p=2啊,这个传进去的参数难道不是“值传递”吗?

你这个不就是我说的那个嘛。
虽然你传进去的只是指针,但是你函数内部的操作是对指针指向的值的修改,而这个修改值的变量是属于main函数的,就是a变量,所以当函数返回的时候,p指针还是指向a没变,但是你改变了a的值,就改变了。
你一开始提问的代码,都是改变指针的指向,第一个代码是通过二次指针改变指针的指向,第二个是直接改变指针的指向,都没有去改变过指向的变量的值。这个能理解的话。
穿进去的是值传递吧,我不确定,因为我不懂这些名词的意思。反正就是传进去的不是改变量的地址就对了。要是地址,穿进去个整型变量a,然后改变了a的值,回来的时候a肯定就不是原来的值了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-20 18:49:09 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-19 10:15
你这个不就是我说的那个嘛。
虽然你传进去的只是指针,但是你函数内部的操作是对指针指向的值的修改,而 ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 11:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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