| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 383 人关注过本帖, 1 人收藏
标题:C问一道关于指针的题目 求友友帮助
只看楼主 加入收藏
方一鸣
Rank: 2
等 级:论坛游民
帖 子:74
专家分:13
注 册:2011-8-31
结帖率:100%
收藏(1)
 问题点数:0 回复次数:5 
C问一道关于指针的题目 求友友帮助
11.有以下程序
? void f(int y,int *x)
? { y=y+ *x; *x=*x+y; }
? main( )
? { int x=2,y=4;
?   f(y,&x);
?   printf("%d %d\n",x,y);
? }
? 执行后输出结果是__【11】__

我的理解很单纯  结果是6,8   请问错在哪儿呢?
2011-09-06 14:41
czsbc
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:469
专家分:1700
注 册:2008-12-13
收藏
得分:0 
y不变,x要变
输出应该是8 4
2011-09-06 14:47
kankanzaishu
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-9-6
收藏
得分:0 
输出结果是8 4

y传过去的值4  是一个形参  所以在函数体内改变   原来的y是不变的  所以y最终是不变的
形参就是  y的值被存储在另外的内存地址上 在f函数体内计算的时候  并不是使用y本身 是用另外的存储着y的值的副本的内存地址上的值

而x传过去的是内存地址

然后在f函数内改变指针x指向的这个内存地址上的值  就是改变x本身的值
所以x会变

形参y=4
那么y=y+ *x 就是 y=4 + 2;  所以形参y是6  他改变的是f函数内的y的副本 是另外的内存地址上的值 所以y本身不改变
然后 *x=*x+y 就是 *x=2+6   然后 *x改变的是 x指向的内存地址上的值 就是改变的是x的值
所以 x的值被改变为8



上面说的是思路
下面用代码讲
x=2;
y=4;

传过去的时候
f(y,&x);
在f函数体内
第一参数 y和f函数体外的y是2个内存地址  只不过把外部y的值4赋值给了f函数体内的y,
第二参数 是f函数外的x变量所在的内存地址

在使用y时候 用的是函数体内的y   这和原本的y是2个变量  所以改变f函数体内的y的值  
本身的y的值并不会改变 一直为4;

f函数体内的
y=y+*x;
*x是指针x指向的内存地址上的值 就是f函数外的x的本身地址上的值
就是y=4+2;
所以y的值为6 注意: 这个是f函数体内的y 不是原本的y的值

然后
*x是2
*x=*x+y;
就是 *x=2+y;   y的值为6
那么*x就是 2+6   
*x=8;

那么 printf("%d %d\n",x,y);
输出  x的值在f函数内被改变为8,
y的值并未改变 所以输出4

最终结果
8 4

[ 本帖最后由 kankanzaishu 于 2011-9-6 15:13 编辑 ]
2011-09-06 14:53
_改变自己_
Rank: 2
等 级:论坛游民
帖 子:21
专家分:39
注 册:2011-7-26
收藏
得分:0 
回复 楼主 方一鸣
y=y+*x的值是6;*x=*x+y的值是8
f函数调用完后Y的值不变,X的值变成8了,
 printf("%d %d\n",x,y);所以是8.4
2011-09-06 15:00
方一鸣
Rank: 2
等 级:论坛游民
帖 子:74
专家分:13
注 册:2011-8-31
收藏
得分:0 
Y 是形参  而X是实参
2011-09-16 16:40
y1026880306
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-10-3
收藏
得分:0 
指针传递可以和实参共内存地址,形参只能单值传递,且只有在形参数组中可以改变实参的值,故8,4
2011-10-03 09:14
快速回复:C问一道关于指针的题目 求友友帮助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025648 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved