首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个指针有关问题!请大家过来指点一下

2012-05-24 
一个指针问题!请大家过来指点一下!#includestdio.hvoid main(){int a2,*p&a,*q&aprintf(%d%d\n,*p

一个指针问题!请大家过来指点一下!
#include<stdio.h>
void main()
{
int a=2,*p=&a,*q=&a;
printf("%d %d\n",*p++,*(q++));
}
首先这个程序没有错,但是我就是不理解为什么输出的是2 2 请解释一下为什么都是2 2!
#include<stdio.h>
void main()
{
int a=2,*p=&a,*q=&a;
printf("%d %d\n",*p,(*)q++);
}
这个程序有错么?如果没有错误,那么输出的是什么?并且给我这个菜鸟解释一下为什么?
谢谢!

[解决办法]
首先上面段代码 ++优先级高于* 
printf("%d %d", *(p++), *(q++)); 从这里可以发现改变的是指针本身的值,而不是指针指向内容的值
而这里用的是后缀++ 即先使用p 与 q的地址在对其进行自增
在32位机上 如果 a的地址为 1000(打个比方) 
那么程序实际是这样的
printf("%d %d", *p, *q); 
p = 1000 + 4; // 这里只是便于楼主理解, a 的地址是1000的话 ,p变量里面存的就是1000,
// 由于是int型指针在32位机上自增加4
q = 1000 + 4;

于是程序输入2,2 p q 指针的值都变为1004
[解决办法]
第二段程序的话, 你把"*"符号单独用括号包括起来编译器是无法解析的,这是语法错误
完全可以等同于printf("%d %d", *p, ()q++); 楼主想想这样可以么
printf("%d %d", *p, (*q)++);这样是可以的让指针q优先进行取值运算,然后值自增,即a自增
[解决办法]
额……高手都没在我就趁机说说,
1L的,你说“只改了&a"?不能这么说吧,&a是不可以改的,真正改的其实是p、q指针指向的位置
2L的,这句“++优先级高于*”,你是不是再查表验证下?++跟*(取值运算符)优先级是一致的。

printf("%d %d\n",*p++,*(q++)); 这里不论有没有括号,对p、q的操作都是取值,所以得到2,至于++是语句运算结束后才进行的操作,即分别将p、q指向下一个int。

printf("%d %d\n",*p,(*)q++); 这里lz的意思应该是

printf("%d %d\n",*p,(*q)++); 
考虑到参数计算顺序是自右向左,首先由*q得到2,下一步据我所知是未定义行为(没看过标准,仅供参考),有的编译器会先完成(*q)自增,也就是a会变成3,然后再看下一个参数*p,这样就得到3,2。不过有的编译器貌似会最后自增,得到2,2。一般的建议是,不要让你的程序中出现这种由参数计算顺序决定结果的方式。

热点排行