2017-01-21 115 views
2

如果我有下面的代碼行:指針和用C存儲器混亂

int* a[3]; 

是否意味着它是一個指向第一個項目中的3點的整數(因此陣列,給它一個尺寸的4字節)?或者它是否意味着它是一個3個指針的數組(給它一個12字節的大小)?

+1

將其插入到C聲明 - >英文翻譯器中:http://cdecl.org/ – user2357112

+0

它是一個由3個指向「int」的指針組成的數組:不管猜測大小,使用'sizeof a' 。 –

+1

爲什麼3個指針的數組是12個字節?什麼保證一個指針是4個字節?爲什麼不使用'sizeof a'來檢查呢?如果你想學習,那麼重要的是變量'a'的類型,它的大小不容易預測。 –

回答

4

它是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閱讀。

0

您可以用下面的代碼測試這個自己:

#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模式等。

+0

對於'size_t'值,使用''%zu「',而不是''%d」'。 – aschepler

+0

@aschepler謝謝! –

1

爲了理解表達式和聲明,您必須知道運算符優先級。網上有很多,例如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的指針。