上海的水磨是什么服务:帮我看一看,这段代码为什么正确????谢谢(C语言)

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/03 00:19:23
main()
{
int a[3][3],*p,i;
p=&a[0][0];
for(i=p;i<9;i++)
p[i]=i+1;
printf("%d",a[1][2]);
}
这里为i赋的值居然是一个指针变量,而且代码居然是正确的,更加另人纳闷的是,就在这道题的5页之前,就在指针这一章,这一节的第一句还明确的写着“指针变量只能存放地址(指针),不能将一个常量赋给一个指针变量,同样也不能将一个指针变量的值赋给一个非指针变量”

可是这段代码就是“将一个指针变量赋给一个非指针变量”,而且居然还是正确的,我试过用i=*p和i=**p代替i=p,都无法通过编译,可是这道题里的i=p就正确,这是怎么回事?这段代码为什么正确????

学习应该灵活啊!书本上的东西不要轻易相信。“不能把指针变量赋给一个非指针变量”、“不能把非指针变量赋给一个指针变量”严格来讲,这两句话是错误的,不是不可以,而是容易犯错,而且通常没有这样附值的必要。
main()
{
int a[3][3],*p,i;
p=&a[0][0];
for(i=p;i<9;i++)
p[i]=i+1;
printf("%d",a[1][2]);
}
这里p取数a的基址,也就是a[0][0]的地址,那么p+1就是a[0][1]的地址,编译当然可以通过,而且结果正确。

不正确呀,编译不过。

在不同编绎器下C中会有不同结果,如Turbo C与VC:
int *p,i; //定义与 int *p,*i;意义相同,是定义了两个指针变量
//如果先定义了一个指针变量,跟在其后面的用“,”分隔的变量也是指针变量。
//但有的编绎器不会这样。
//所以为了区别起见,最好指针与普通变量分开定义,这样才不会引起误解

VC6.0下编译不能通过

2楼说的即使是正确的,把int *p,i;
换成
int *p,*i;
仍无法通过编译 i<9 i为地址的话几乎就铁定>9了

您的问题是:书本上说它正确,还是您确实可以编译通过得到正确结果?

我觉得这段代码不正确.