繁体   English   中英

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

[英]Confusion in data types in a 2D array

这是一个代码,用于打印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 

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

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

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

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

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

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

array[0] + 1指向第二intarray[0]

&array[0]类型为3 int的数组对象的地址

&array[0]+1 3个int数组数组的第2个元素

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]

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

#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])。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM