[英]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.