2D阵列中数据类型的混淆

时间:2011-03-03 13:21:11

标签: c pointers

这是一个代码,用于打印2D数组的第一个元素的地址,然后添加1.虽然所有4个基址都相同,但它们的加法显然不会给出相同的结果,因为它们不同“类型”。我可以找出一些类型(如果它们是正确的)但不是全部。

int main()
{
    int array[4][3];
    printf("array %u\n",array);   //of type int(*)[3]
    printf("array+1 %u\n",array+1);
    printf("&array %u\n",&array);   //....???
    printf("&array+1 %u\n",&array+1);
    printf("array[0] %u\n",array[0]);    //of type int*
    printf("array[0]+1 %u\n",array[0]+1);
    printf("&array[0] %u\n",&array[0]); //....???
    printf("&array[0]+1 %u\n",&array[0]+1);
} 

为了理解添加1后所涉及的指针算法,你能详细解释每个基地址的“类型”吗?下面给出了gcc机器的样本输出,以供快速参考。

array       3214383040 
array+1     3214383052 
&array      3214383040 
&array+1    3214383088 
array[0]    3214383040 
array[0]+1  3214383044 
&array[0]   3214383040 
&array[0]+1 3214383052 

2 个答案:

答案 0 :(得分:10)

以下int array[4][3];适用

array是一个包含4个元素的数组。每个元素都是一个包含3 int s的数组。在大多数情况下,使用名称本身会使数组衰减为指向其第一个元素的指针;然后array成为指向3 int s

数组的指针

array + 1是指向3个int的数组的指针。这里array衰减为指针而1指的是3 int

的数组

&array是整个数组的地址。它指向4个数组的数组的类型为3个int的对象

&array + 1是4个3个数组的伪 - 数组数组的第2个(实际上不存在)元素

array[0]是一个包含3个整数的数组。它通常衰减到指向第一个元素的指针

array[0] + 1指向int

中的第二个array[0] 数组为3 int的对象的

&array[0]地址

&array[0]+1 3个整数数组的第二个元素

PS。午饭后我会尝试画一幅画(ASCII)。


嗯...画画很难:)

在尝试之前,我想我可以做出更好的绘画。 这是我能想到的最好的......


    int array[4][3]        ........[aaabbbcccddd]........
                              where aaa, bbb, ccc, ddd are arrays of 3 ints'

    the [] represent the object itself; the {} represent pointers.

    array (object)         ........[AAABBBCCCDDD]........       int[4][3]
    array (decayed)    ==> ........{aaa}bbbcccddd........       int(*)[3]

    array + 1          ==> ........aaa{bbb}cccddd........       int(*)[3]

    &array             ==> ........{aaabbbcccddd}........       int(*)[4][3]
    &array + 1         ==> ........aaabbbcccddd{xxxxxxxxxxxx}........       int(*)[4][3]

    array[0] (object)      ........[AAA]bbbcccddd........       int[3]
    array[0] (decayed) ==> ........{a}aabbbcccddd........       int*

    array[0] + 1       ==> ........a{a}abbbcccddd........       int*

    &array[0]          ==> ........{aaa}bbbcccddd........       int(*)[3]
    &array[0] + 1      ==> ........aaa{bbb}cccddd........       int(*)[3]

答案 1 :(得分:3)

如果将其编译为C ++,则可以使用typeid STL库中的typeinfo运算符来获取此信息。例如,运行此

#include <stdio.h>
#include <typeinfo>

void main()
{
     int array[4][3];
     printf("array %s\n",typeid(array).name());   //of type int(*)[3]
     printf("array+1 %s\n",typeid(array+1).name());
     printf("&array %s\n",typeid(&array).name());   //....???
     printf("&array+1 %s\n",typeid(&array+1).name());
     printf("array[0] %s\n",typeid(array[0]).name());    //of type int*
     printf("array[0]+1 %s\n",typeid(array[0]+1).name());
     printf("&array[0] %s\n",typeid(&array[0]).name()); //....???
     printf("&array[0]+1 %s\n",typeid(&array[0]+1).name());
}  

给我以下结果

array int [4][3]
array+1 int (*)[3]
&array int (*)[4][3]
&array+1 int (*)[4][3]
array[0] int [3]
array[0]+1 int *
&array[0] int (*)[3]
&array[0]+1 int (*)[3]

这解释了为什么添加1可以将指针增加4个字节(单个int),12个字节(int [3])或48个字节(int [4] [3])。