簡體   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