如果我有下面的代碼行:指針和用C存儲器混亂
int* a[3];
是否意味着它是一個指向第一個項目中的3點的整數(因此陣列,給它一個尺寸的4字節)?或者它是否意味着它是一個3個指針的數組(給它一個12字節的大小)?
如果我有下面的代碼行:指針和用C存儲器混亂
int* a[3];
是否意味着它是一個指向第一個項目中的3點的整數(因此陣列,給它一個尺寸的4字節)?或者它是否意味着它是一個3個指針的數組(給它一個12字節的大小)?
它是array of pointers to int
數據類型中的C
編程語言。因此,該數組的每個元素都可以容納一個變量的地址,數據類型爲int
。
int x=5, y=9, z=8;
int *a[3]; // Declare an array of pointers to int
a[0] = &x;
a[1] = &y;
a[2] = &z;
但是,下面的聲明將聲明一個指向array of 3 int
的指針。
int (*a)[3];
大小a
取決於您將編譯代碼的平臺。請使用sizeof
運算符來確定平臺中的大小。
int *a[3];
printf("Size of a: %zu\r\n", sizeof(a));
注:
要打印sizeof操作符的結果,使用%祖如果你的編譯器支持C99;否則,或者如果您希望獲得最大的可移植性,打印size_t值的最佳方法是將其轉換爲無符號長整型並使用%lu。你可以通過here閱讀。
您可以用下面的代碼測試這個自己:
#include <stdio.h>
int main()
{
int *a[3];
printf("%zu\n", sizeof(a));
return 0;
}
輸出爲12,其中,在機器上我測試它,顯然也是你從你在你的問題中寫道,是3*sizeof(int)
。
Type declaration precedence用C放「陣列」聲明[]
一個步驟的「指針」以上聲明(*
),所以聲明爲:
Declare 'a' as an array of 3 pointers to type 'int'
可以使用括號(()
)來更改順序其中類型聲明處理:
int (*a)[3];
sizeof(a)
給它的4的輸出,其在計算機上是一個指針的大小。
作爲一個方面說明,假設一個指針始終是4個字節,而且一個int
總是4個字節通常是不好的做法。這取決於架構,編譯器,CPU模式等。
對於'size_t'值,使用''%zu「',而不是''%d」'。 – aschepler
@aschepler謝謝! –
爲了理解表達式和聲明,您必須知道運算符優先級。網上有很多,例如here.
在該頁面上,您可以看到尖括號的優先級高於取消引用的星號,這意味着它們首先被應用。如果你喜歡你可以括號聲明的部分用括號,就像在表達式:
int *(a[10]); // brackets are redundant and show operator precedence
因此,可變a
必須是一個數組。數組元素由於索引產生,在應用瞭解引用運算符後產生一個int
,因此該元素必須是指向int的指針。
因此,該聲明聲明瞭一個int指針數組。
作爲一個額外的,你不能聲明一個沒有圓括號或typedefs的數組的指針,只是因爲運算符優先級是針對上面更常見的情況而做的。指向數組的指針將如下所示:
int (*a)[10]; // brackets are necessary to make "*" apply first
這裏,取消引用星號首先被應用;因此a
必須是一個指針。結果類型可以被索引,因此必須是一個數組,其元素聲明爲int
s。這使得a
成爲指向數組int
的指針。
將其插入到C聲明 - >英文翻譯器中:http://cdecl.org/ – user2357112
它是一個由3個指向「int」的指針組成的數組:不管猜測大小,使用'sizeof a' 。 –
爲什麼3個指針的數組是12個字節?什麼保證一個指針是4個字節?爲什麼不使用'sizeof a'來檢查呢?如果你想學習,那麼重要的是變量'a'的類型,它的大小不容易預測。 –