读书人

C程序有关问题:哪个高手帮小弟我解释

发布时间: 2012-03-25 20:55:17 作者: rapoo

C程序问题:哪个高手帮我解释下下面的问题,主要是a[0]和&[0] 的区别 和编译器的问题??

#include "stdio.h"

int main()
{
int a[3][3] = {0,1,2,3,4,5,6,7,8};
int *p1 = a[0];
int *p2 = &a[0];
printf("*(p1+1) = %d \n",*(p1+1));
printf("*(p2+1) = %d \n",*(p2+1));
return 0;
}



/*
这个程序在vc++6.0中编译出错,原因在于 int *p2 = &a[0]; 这句赋值出错,
但是在linux gcc中不会 ???

[root@localhost test]# ./a.out
*(p1+1) = 1
*(p2+1) = 1
[root@localhost test]#

*/


[解决办法]
gcc加 -W你就会发现gcc也报warning
a[0]本来就是个数组名。特殊的是他也是一个地址。
所以 int *p = a[0]没问题

但是如果 &a[0],这种情况,就只能是数组的地址,在这一点检查上VC比gcc要严格一点而已。

[解决办法]
a[0]是一个一维数组 int [3]类型;所以,&a[0]返回的地址 int (*)[3]类型;因此,你的p应该声明为int (*p)[3]; p = &a[0];

读书人网 >UNIXLINUX

热点推荐