C语言,二维数组,指针。[Warning] assignment from incompatible pointer type [enabled by default]

程序很简单,如下。但语句 p=a,编译时,出现了warning:assignment from incompatible pointer type。这个意思是指针类型不匹配?但数组和指针都是 int 型啊。还有,我再次编译,warning就消失了。我用的DEV C++编译。
还有,同样的程序,我用VC++ 6.0,直接出现 error:error C2440: '=' : cannot convert from 'int [3][4]' to 'int *'

int main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
p=a;
printf("%d",*p);
return 0;
}

p=a[0]才正确!
a是二维数组,相当于二维指针
a[0]是第一行的地址,int *p,p是一维指针,只有p=a[0]才是合理的!追问

但是,a和a[0],是相同的。所以,既然 可以 p=a[0],那就应该可以 p=a

追答

从数值的角度上来说你说的是对的!
但编译器是要检查类型匹配的
a是二维数组首地址,也是第一行的首地址,也是第一个元素的地址
a[0]是第一行的地址,也是第一个元素的地址
a[0][0]是第一个元素
从数值上讲a a[0] 甚至&a &a[0] &a[0][0] 都是相同的,但其表示的意义是不同的,也就是编译器要检查的类型匹配问题。 编译器为了最大程序保证编译出来的代码可靠运行,所以会进行相应的检查!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-10-24
p =&a[0];这样子才是取到了第一行的数据。追问

但是,a和a[0],是相同的。所以,既然 可以 p=a[0],那就应该可以 p=a
而且,DEV C++编译时,是通过的,只有一个warning而已。

追答

呵呵,可能你说的是对的,但在vs2010里是通不过的。我不知道dev c++这么高级的编译器。

相似回答