一道C的指针问题
main()
{int a[]={2,4,6},*pr=&a[0],x=6,y,z;
for(y=0;y<4;y++)
z=(*(pr+y)<x)?*(pr+y):x;
printf("%d\n",z);}
请问为什么z的结果为6,既pr+3地址指向了x,所以*(pr+3)的值为6。点解?
问题点数:0、回复次数:21Top
1 楼leafxx(因为音乐,所以自由)回复于 2003-08-03 20:11:40 得分 0
不是,是因为 pr是指向数组 a的, 在关于y的循环中,*(pr+0)就是a[0],*(pr+1)就是a[1];
当y=3时, *(pr+3)其实是a[3],也就是6,z取的是*(pr+y)的值(这时y为3),也就是a[3],并不是 pr+3地址指向了x,指针变量pr的值没变,始终指的是a[0]的地址Top
2 楼leafxx(因为音乐,所以自由)回复于 2003-08-03 20:13:16 得分 0
哦,看错了,z取得是x的值,x的值是6Top
3 楼Caoyu015(酷鱼一代)回复于 2003-08-03 20:19:08 得分 0
数组越界了,访问到了int a[3]之后x的地址,因为C/C++的局部变量的内存都是在栈中分配。Top
4 楼Caoyu015(酷鱼一代)回复于 2003-08-03 20:19:53 得分 0
这种程序还是少写的好。:)Top
5 楼airtraffic(free flight)回复于 2003-08-03 21:17:52 得分 0
当y=3时,数组不是越界了吗?pr是a[2]后面一个元素的地址,所以题目有问题!Top
6 楼riverboat(诸葛不亮)回复于 2003-08-03 22:09:05 得分 0
pr+3 应该指向pr本身吧。
这种语句的执行结果可能在不同编译器上每次都不一样,
应该说是错误的用法。Top
7 楼Areslp(努力ING)回复于 2003-08-03 22:14:57 得分 0
数组越界了,访问了数组a之后的xTop
8 楼MaiCle(原来小日本连畜生都不如)回复于 2003-08-03 22:20:21 得分 0
呵,都是数组越界惹得祸。Top
9 楼zhaolinyu2001(风中浪子)回复于 2003-08-03 22:26:01 得分 0
main()
{int a[]={2,4,6},*pr=&a[0],x=6,y,z;
for(y=0;y<4;y++)
z=(*(pr+y)<x)?*(pr+y):x;
printf("%d\n",z);}
_______________________
printf()输出的是最后的值因此,你只要看for的最后一次循环结果就可以了
z=(*(pr+y)<x)?*(pr+y):x;
这是一个条件运算
Top
10 楼gzlsc(小壁虎)回复于 2003-08-03 23:05:38 得分 0
各位,我要知道的是为什么*(pr+3)的地址是x的地址呢?Top
11 楼hillyee(山之笛)回复于 2003-08-03 23:23:29 得分 0
这个问题肯定要个c的高手来看看才行,*(pr+3)的确有点问题,要根据编译器的特点而定的。不过可以这么理解。
当y=2的时候,z=(*(pr+y)<x)?*(pr+y):x; 输出的结果是z=(6<6)?6:6,所以z应该是等于后面的一个6。即z=6.
当y=3是,有些编译器里,虽然是错了,但是编译不报错。所以不执行了,结果就是z=6.
Top
12 楼hillyee(山之笛)回复于 2003-08-03 23:24:49 得分 0
PS:当y=3时,在TC里面输出的是一个不定值。Top
13 楼heyesuperman(中华之火)回复于 2003-08-03 23:32:12 得分 0
不是呀,你把for(y=0;y<4;y++)中y的终值改变一下,
如y<3,y<2,y<1
你再运行看看结果,不是*(pr+3)的地址是x的地址吧Top
14 楼shiningpolarstar(闪亮的北极星)回复于 2003-08-04 03:20:23 得分 0
main()
{int a[]={2,4,6},*pr=&a[0],x=6,y,z;
for(y=0;y<4;y++)
z=(*(pr+y)<x)?*(pr+y):x;
printf("%d\n",z);}
首先这个指针是指向数组a的首地址,数组a下标最大为2,当y=2的时候z=6,而for循环中没有包含printf("%d\n",z);所以z的值是从2变为4,又变为6,然后循环结束,执行打印语句,输出了最后z的值6,但是在y=3时,这个指针指向了一个数组的末端的下一个存储空间,所以这个值是不定的,但z=(*(pr+y)<x)?*(pr+y):x;中这个时候*(pr+y) 与x的值都是6,所以无论 *(pr+y)<x是真是假已经无所谓了Top
15 楼Yashmak(双层面纱)回复于 2003-08-04 04:34:09 得分 0
越界!
不能武断的认为 *(pr+3)最后指向x,
因为事实上,下一个可能的位置是pr的最高位,
也许pr最高位恰巧小于或等于6,最后z就等于6。
z的值其实是无法预料的,
试着打开几个大的应用程序,
再执行该程序,z的值可能让你莫名其妙。
Top
16 楼cxjddd(又是花开时)回复于 2003-08-04 08:32:20 得分 0
z的值只与数组(包括越界的)最后一个数有关。Top
17 楼bahanzo1(绯雨流烟)回复于 2003-08-04 09:20:15 得分 0
越界了的问题,*(pr+3)的值是不定的Top
18 楼MouseGod(客)回复于 2003-08-04 10:48:09 得分 0
这是可能是因为你在变量定义的时候在内存中分配的是连续的空间 即数组在先,x变量在后
然后你在使用指针的时候又越出了数组的界限 这样的话指针就指向了x变量了。
Top
19 楼smilewang(急速传说)回复于 2003-08-04 11:27:30 得分 0
可以下一个肯定的结论
pr+3怎么指也不会指向变量x的.
证据如下:
第一种方法:(与编译器无关)
z=(*(pr+y)>x)?*(pr+y):x;//将"<"改为">",重新看结果,结果再为6的概率趋近于0
第二种方法:(与编译器有关)
main()
{
int kkk=5; <======================添加一个变量
int a[]={2,4,6},*pr=&a[0],x=6,y,z;
for(y=0;y<4;y++)
z=(*(pr+y)<x)?*(pr+y):x;
printf("%d\n",z);
}
在vc6中,输出的结果实际上就是kkk的值Top
20 楼gzlsc(小壁虎)回复于 2003-08-04 12:21:04 得分 0
main()
{int a[]={2,4,6},*pr=&a[0],y,x,z;
/*for(y=0;y<4;y++)
z=(*(pr+y)<x)?*(pr+y):x;*/
printf("pr+3=%d x=%d y=%d z=%d\n",pr+3,&x,&y,&z);}
用TC运行后结果是pr+3=-48 x=-46 y=-48 z=-44
若把第二行改为int a[]={2,4,6},*pr=&a[0],x,y,z;
则结果是pr+3=-48 x=-48 y=-46 z=-44Top
21 楼Caoyu015(酷鱼一代)回复于 2003-08-04 15:57:24 得分 0
你将C文件编译成为ASM文件,如果你懂一点汇编的话应该很清楚了。 :)Top




