如一个二维数组int a[3][4];int *p;有人说p=a; 为什么int a[3][4],int(*p)[4] p=a ...

作者&投稿:刘傅 (若有异议请与网页底部的电邮联系)
呵呵,这是个难题。详细给你解释下。
a[3][4]那么a是一个2行3列的数组。也可以看成a是2个长度为3的数组组成的。
p=a的话,下面三种说法都是对的 :
1、把a的首地址给了p
2、把a[0]的首地址给了p 【强烈注意:a[0]可看成一个长度为3的一维数组】
3、把a[0][0]的地址给了p

好好琢磨下。是不是这个道理。
3维数组在内存里面还是线性存储的
a[0][0]
a[0][1]
a[0][2]
……
所以 a,a[0],a[0][0]都是相等的!
给个程序你看看

#include "stdio.h"
#include "conio.h"

main()
{
int a[2][2]={1,2,3,4};
printf("%d\n",a);
printf("%d\n",a[0]);
printf("%d\n",&a[0][0]);

getch();
}

DEV—C++调试结果:
2293600
2293600
2293600

这个要分c和c++的情况。
如果是c的话,这两个都对(其实a的首地址即是a,又是a[0])
如果是c++的话,这样赋值是非法的。编译不能通过。(int (*p)[4];p=a,这样才可以)

c语言规定数组名是首地址,也就是指针
二维数组名就相当于二级指针(指向指针的指针),
而你定义的int
*p;
这个p只是一级指针,
所以
p不能指向a
,

对于二维数组直接给数组名的话给的是一个指向一维数组的指针(也就是第一行)int a[3][4];int *p;
p=a;之后P是一个指向有4个元素的数组的指针。对p++的话也就是指向了第二排。我也是菜鸟

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)二级指针和一级指针的用法差不多,模糊点的说,只是二级指针使用时必须要先指向一级指针,不能直接指向某个变量(或数组);

二维数组名的本质是指向一维数组的指针常量,即a是一个int(*)[4]类型的指针,指向一个int[4]数组。int (*p)[4]也是同一类型的指针,可以令p=a。