2014-06-07 118 views
5

我只是想確定C語言中的* a [5]和(* a)[5]之間的區別。定義char a [5]和char(* a)[5]之間有什麼區別?

我知道* a [5]意味着數組a可以有五個元素,每個元素都是指針。 so,

char *p = "ptr1"; 
char *p2 = "ptr2"; 
char *a[5] = { p , p2 }; 

確實有道理。

但是,當我將*a[5]更改爲(*a)[5]它不起作用。

char (*a)[5] = { p , p2}; 

(*a)[5]是什麼意思?


此外,

*a[5]a[5][],並(*a)[5]a[][5]之間有什麼區別?

回答

3
char *a[5];


創建5個指針數組爲char

printf("%c",*a[5])
a是指針
的陣列,使得該表達式意味着打印所述第六元件字符值a[5]指向。

char (*a)[5]
創建5字符數組和分配a這個創建的數組的第一個元素的地址

printf("%c",(*a)[5])
a
所以這個表達式裝置的字符數組的第一元素打印a指向的數組的第六個char元素值。

5

它們是不同的類型:

char *a[5]; // array of 5 char pointers. 
char (*a)[5]; // pointer to array of 5 chars. 

在你有一個指針數組,因爲括號在解析時優先考慮的第一個例子。通過將星號放在圓括號內,可以覆蓋它並明確地將指針放在更高的優先級上。

+0

請注意,OP沒有將第2條聲明作爲聲明寫入,而是作爲分配。 – user2485710

+0

@ user2485710是的,我認爲他的意思是。在我看來,這樣做更有意義。無論如何,埃米爾已經得到了另一個案件的答案。 –

5

您使用括號使指針標誌*「接近」的變量,它改變了聲明的含義是:而不是一個指針數組,你會得到一個指向數組的指針。

這裏是你如何使用它:

char x[5]={'a','b','c','d','e'}; 
char (*a)[5] = &x; 
printf("%c %c %c %c %c\n", (*a)[0], (*a)[1], (*a)[2], (*a)[3], (*a)[4]); 

注意,編譯器知道a指向數組:

printf("%z\n", sizeof(*a)); // Prints 5 

Demo on ideone.

6

一個偉大的網站存在解碼這樣的原型:http://cdecl.org/

char *a[5] --> declare a as array 5 of pointer to char 
char a[5][] --> declare a as array 5 of array of char 
char (*a)[5] --> declare a as pointer to array 5 of char 
char a[][5] --> declare a as array of array 5 of char 
相關問題