C语言的数组和指针问题,谢谢高手的解答!

首先定义一个三维数组:int A[2][3][4]={0};

1.数组名A是一个三级指针,指向的是一个3*4的二维int数据结构。
我的问题是:为什么是指向3*4的二维数据结构?这里的“3*4”是怎么得到的?

2.A[0]是一个2级常指针,指向一个大小为4的一维数组结构。
问题是:中括号 [ ]中的“0”怎么理解呢?
为什么又是指向大小为4的一维数组?
为什么说A,A[0],A[0][0]的值同为 &A[0][0][0]?

1)为了帮助你理解,我们先来看看最浅的例子:
int B[4]={0};
这个是什么意思?
首先,它是一个一维的数组,有四个元素,在内存中申请了一块连续的空间(数组的空间都是连续的),0是这组数的首地址。想象一把尺上面,0-4cm是这四个元素所在的空间,所以首地址为0(cm的位置),“也是第一个元素的地址”。.
如果我们 int * p=B; 会有什么情况? p与B的值一样,都是0,都是这个数组的第一个元素的地址,所以p是指向这个大小为4的数组的第一个元素是吧?(指针的定义是:值是某个东东的地址)
因此 ,我们看出,B的作用就相当于指针p作用..是吧?只是p的值可以变,B不可以,所以B是常指针。是一级的,指向一个int元素(第一个元素)。

2)同理,我们看 int B[3][4]={0}...这个是一个3*4的二维数组,B[0],B[1],B[2]都是一个一维数组是吧?可以想像成这个样子:
int (B[0])[4];
int (B[1])[4];
int (B[2])[4]; 这时,对比一下第一题,(B[0])或者B[1] 或者B[2] 代替了原来的B,而原来的B是一个指向大小为四的一维数组的第一个元素,所以这里的B[0],就是一个指向大小为四的一维数组的第一个元素,(其实不单只是0,B[1],B[2]也是的,只是[0],[1],[2]代表这个二维数组的第几行一维数组)。。所以B是一个2级常指针,同样指向二维数组的第一个元素B[0],而B[0]是一个一维数组。

总结,问题的关键在于,数组名相当于一个指向于这个数组第一个元素的指针。

3)所以,int A[2][3][4]={0};
A是一个三维数组,其中A[0]和A[1]都是它的元素,A[0]是第一个元素。
所以, A是一个三级指针,指向了这个数组的第一个元素A[0],而A[0]是一3*4的二维数组。
而A[0]是一个二维数组,也相当于一个二维数组名,它有A[0][0],A[0][1],A[0][2]三个元素,A[0]作为一个数组是指向它的第一个元素A[0][0]..而A[0][0]是一个大小为4的一维数组。。所以说,A[0][0]指向一个大小为4的一维数组结构。

为什么A,A[0],A[0][0]的值同为 &A[0][0][0]? 看看第1)点,这句话:“想象一把尺上面,0-4cm是这四个元素所在的空间,所以首地址为0(cm的位置),“也是第一个元素的地址”。 这把尺的首地址,当然是这把尺第一格1cm(0~1cm)空间的首地址,因为都是0刻度那里,。同理,一层层下去,无论多少维,都是最底层的那个元素的地址。你的头顶的位置是你整个人的顶部,当然也是你上身的顶部,也是你的头的顶部....

好累。。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-09
1,这里指向3*4表示一个一维数组A[2]指向一个二维数组A[3][4].
2.这里0代表首地址,
A[3][4]可以理解为一维数组A[3]指向一维数组A[4],也就是指向一个大小为4的一维数组
C语言规定AA[0],A[0][0]的值同为 &A[0][0][0],因为他们都是指向同一个内存地址.
第2个回答  2011-07-09
1.数组名本身就是一个指针常量,一维数组名存储的是一维数组的起始地址。二维数组名是指向一维数组的指针常量,比如int p[3][4],p就是指向拥有四个元素的一维数组的指针常量,同理,三维数组名就是指向二维数组的指针常量,A就是一个指向三行四列的二维数组的指针常量。
2.你的A[0]是怎么定义的,如果如你所说是指向大小为4的一维数组,则其定义应为int (*A)[4];
中括号中的0可以理解为:自起始位置偏移0个单元,第二个问题参考上一个问题的回答。
第三个问题貌似A不是二级指针,三级指针才能解释你的各种表述。
相似回答