簡體   English   中英

指向數組的sizeof指針

[英]sizeof pointer to an array

我已經編寫了程序來檢查指針表達式的大小。 我完全被指針弄糊塗了。 說明編譯器如何計算指針表達式的大小。

void main() {
    int (*p)[20][30];
    int (*q)[4];
    int a[2][4];
    int **r=a;
    printf("%d %d %d\n",  sizeof(**r),sizeof(*r),sizeof(r));
    printf("%d %d %d\n",  sizeof(a),sizeof(a[0]),sizeof(a[0][1]));
    printf("%d %d %d\n",  sizeof(q),sizeof(*q),sizeof(**q));
    printf("%d %d %d\n",  sizeof(p),sizeof(*p),sizeof(**p));
}

產量

4  4  4  
32 16 4
4  16 4
4 2400 120 
int a[2][4];
int **r=a;           

這意味着r是一個指針,該指針存儲着另一個指向數組“ a”的指針的地址。

  • **r包含一個整數變量,因此sizeof(**r)將為4個字節。

  • *r是一個整數指針,因此sizeof(*r)將為4個字節。

  • r也是一個整數指針,它指向另一個整數指針,因此sizeof(r)將為4字節。

  • a[2][4]是2D數組,可以存儲8個整數值,因此sizeof(a)將為(8 * 4)= 32bytes。

  • a[0]是能夠存儲4個整數值的子數組,因此sizeof(a[0])為(4 * 4)= 16字節。

  • a[0][1]只是一個整數,所以sizeof(a[0][1]) = 4個字節。

int (*q)[4];

此聲明表示q是指向4個整數的數組的指針,它的基本類型是4個整數的數組。

  • q是一個整數指針,因此sizeof(q)將為4個字節。

  • * q只是4個子數組,每個子數組包含4個整數值,因此sizeof(*q)為16字節。

  • ** q表示整數值,因此sizeof(**q)為4個字節。

int (*p)[20][30];

  • p是一個整數指針,因此sizeof(p)將為4個字節。

  • * p是由20行和30列組成的2D整數數組,因此sizeof(*p)將為(20 * 30 * 4)= 2400bytes。

  • ** p表示子數組由30列組成,因此sizeof(**p)將為(30 * 4)= 120bytes。

說明

for a => total 8 elements => 8*4 =32
for a[0]=> first sub array containing 4 elements => 4*4 =16
for a[0][1] => single element => 4 
for q => 4 
for *q => 4*4 =16
for **q => single element => 4
for p => 4
for *p => 20*30 =600 elements => 600 *4 =2400
for **p => first sub array => 30 elements => 30*4 =120
All **r,*r,r are integer pointers so occupy 4 bytes.
Here each integer occupies 4 bytes

我看到您的系統架構是32位的。

int a[2][4];
int **r=a;

不是有效的代碼。 a將衰減為int (*a)[4] ,這與int **r類型不同。 您沒有提供有關編譯器警告的信息。 這是與提到的代碼有關的我的:

警告:從不兼容的指針類型初始化[默認啟用]

因此,修復后(將r更改為int (*r)[4];我的輸出是:

4 16 8
32 16 4
8 16 4
8 2400 120

您應該知道指針存儲了特定的內存地址。 因此其大小可能會因系統架構而異。 如您所見,我的計算機的體系結構是64位。 地址是8字節長(1字節= 8位,8字節= 64位),因此sizeof指針類型等於8。其他大小您可以自己弄清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM