2Darrays中数据类型的混淆

这是一个代码,它打印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 + 1是4个3个数组的数组的数组的第2个(实际上不存在)元素

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

array[0] + 1指向array[0] + 1中的第二个int

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

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

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


嗯……画很难:)

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


     int array [4] [3] ........ [aaabbbcccddd] ........
                              其中aaa,bbb,ccc,ddd是3个整数的数组'

     []代表对象本身;  {}代表指针。

     array(object)........ [AAABBBCCCDDD] ........ int [4] [3]
    数组(腐朽)==> ........ {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](腐朽)==> ........ {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  #include  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])。