鱼C论坛

 找回密码
 立即注册
查看: 1433|回复: 4

[已解决]这两个有什么区别

[复制链接]
发表于 2018-8-7 09:42:43 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<stdio.h>
  2. int *f(int *s,int *t)
  3. {
  4.         int *k;if(*s<*t){
  5.         k=s;s=t;t=k;        
  6.         }
  7.         return s;
  8. }
  9. int main()
  10. {
  11.          int i=3,j=5,*p=&i,*q=&j,*r;
  12.          r=f(p,q);
  13.          printf("%d,%d,%d,%d,%d,%d\n",i,j,*p,*q,*r);
  14.          return 0;
  15. }
复制代码
输出的结果是 3,5,3,5,3,5
但是。。。。。
  1. #include<stdio.h>
  2. int *f(int *s,int *t)
  3. {
  4.         int *k;if(*s<*t){
  5.                 k=*s;*s=*t;*t=k;
  6.         }
  7.         return s;
  8. }
  9. int main()
  10. {
  11.         int i=3,j=5,*p=&i,*q=&j,*r;
  12.         r=f(p,q);
  13.         printf("%d,%d,%d,%d,%d,%d\n",i,j,*p,*q,*r);
  14.         return 0;
  15. }
复制代码
这个的输出结果是5,3,5,3,5,3
求各位大佬能用通俗易懂的知识讲解一下这是为什么?感谢大佬

最佳答案
2018-8-7 16:01:05
llovenova 发表于 2018-8-7 10:09
也就是说,如果修改的是地址的话,函数在结束以后还会修改回来?

2楼正解,但楼主您明不明白??

您对函数的理解还不够清晰。如果是传值给函数,那么对函数而言,接收到的是一份副本。运算完后,把结果返回,所以对您手头上正本的资料是没有作用的。因此,您执行对调之后,却没有真正的对调。这是实参与形参的不同之处。

先不要管局部变量,或者最好不要管局部还是全局变量。就连 main() 里面的都是局部变量!吸收不了就先不要管~

如果是传址(指针),那是直接作用在正本上的。内存中的地址是独一无二的不能拷贝呀。

代码一:
(k = s) >> k == &i ; (s=t) >> &i == &j ; (t = k) >> &j == k == &i
输出结果应该是  3, 5, 3, 5, 5
您的 printf 多了一个 %d
您这个是互换地址。资料在内存中的地址被对调了,但相对应的资料还是一样的

代码二:
k = i , i = j , j = k == i
这个操作才是把值给对调

@无符号整形  << 好像弹不了
第二个没问题吧。只要没有访问 k 就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-7 10:05:00 | 显示全部楼层
第一个相当于:
  1. k=&i;s=&j;t=&i
复制代码

值不变
第二个相当于:
  1. 2.k=i i=j j=k
复制代码

但是!这个是有问题的,你强制地指定了一个地址给k。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-7 10:09:30 | 显示全部楼层
无符号整形 发表于 2018-8-7 10:05
第一个相当于:

值不变

也就是说,如果修改的是地址的话,函数在结束以后还会修改回来?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-7 10:18:25 | 显示全部楼层
llovenova 发表于 2018-8-7 10:09
也就是说,如果修改的是地址的话,函数在结束以后还会修改回来?

不是 是因为k是一个局部变量,然后你既没有写他,也没有读它,就不会出现访问错误。
你只是把它赋值了而已,然后输出了它的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-7 16:01:05 | 显示全部楼层    本楼为最佳答案   
llovenova 发表于 2018-8-7 10:09
也就是说,如果修改的是地址的话,函数在结束以后还会修改回来?

2楼正解,但楼主您明不明白??

您对函数的理解还不够清晰。如果是传值给函数,那么对函数而言,接收到的是一份副本。运算完后,把结果返回,所以对您手头上正本的资料是没有作用的。因此,您执行对调之后,却没有真正的对调。这是实参与形参的不同之处。

先不要管局部变量,或者最好不要管局部还是全局变量。就连 main() 里面的都是局部变量!吸收不了就先不要管~

如果是传址(指针),那是直接作用在正本上的。内存中的地址是独一无二的不能拷贝呀。

代码一:
(k = s) >> k == &i ; (s=t) >> &i == &j ; (t = k) >> &j == k == &i
输出结果应该是  3, 5, 3, 5, 5
您的 printf 多了一个 %d
您这个是互换地址。资料在内存中的地址被对调了,但相对应的资料还是一样的

代码二:
k = i , i = j , j = k == i
这个操作才是把值给对调

@无符号整形  << 好像弹不了
第二个没问题吧。只要没有访问 k 就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-25 18:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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