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

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];