int a[3][4]; int **p; p=a; 合法吗

int a[3][4]; int **p; p=a; 合法吗
为什么啊????,帮忙详细解释下,真迷惑
详细解释下啊

嗯,不合法,第一:二级指针不能直接指向a,因为类型不同.第二:指针指向二维数组的方法不对。
如果要改可以这样改:int a[3][4]; int *t, **p;t=a[0],p=&t;,用一下(3)的方法会更简单,也是用的比较多的
给你说说常见指针和数组的用法吧,都很基础,不过还是有难度的,,不需要一下子全部弄懂,学到一定程度后再回来看看就很容易了:
(1)一般指针指向一维数组:例:int *p,a[3]; ,让p指向a数组的方法为:p=a;(或p=&a[0]),指向第i个元素的方法是:p+i;
(2)一般指针指向二维数组:例:int *p,a[3][4]; ,让p指向二维数组a的方法为:p=a[0];,指向数组第i行第j列元素的表示方法是p+i*4+j;
(3)数组指针指向二维数组:例:int (*p)[4],a[3][4];,指针指向二维数组的方法是:p=a;,指向数组第i行第j列元素的表示方法是:*(p+i)+j;
(4)指针数组指向二维数组:例:int *p[3],a[3][4];,指针指向二维数组的方法是:p[3]={a[0],a[1],a[2]};,指向数组第i行第j列元素的表示方法是:p[i]+j;
(5)二级指针和一级指针的用法差不多,模糊点的说,只是二级指针使用时必须要先指向一级指针,不能直接指向某个变量(或数组);
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-08-10
不合法
a的类型是int(*)[4],p的类型是int**,类型不同,不合法(可能有老旧的编译器能通过,目前的主流编译器肯定是会报错的)

int (*p)[4]; p=a; // 这样就可以
第2个回答  2012-08-10
int ia[3][4]={
{1,2,3,4},
{3,4,6,7},
{7,4,9,0}
}
int (*ip)[4]=ia;//定义一个指针ip,它指向一个含有四个元素的数组。此时,ia指向二维数组的第一个元素(也就是第一行),ip指向第一行的第一个元素。原因就是使用数组名时,会自动转换成指向数组第一个元素的指针。
由于解引用操作符的优先级底于下标操作符,所以要加括号本回答被网友采纳
第3个回答  2012-08-10
*p=a合法
a指向数组第一个元素
**p就能取出第一个元素的值