2009-11-30 55 views
3

以下代碼中的&a是什麼類型?C:&array_name的類型是什麼?

char a[100]; 
myfunc(&a) 

這是有效的代碼嗎? gcc -Wall抱怨缺少原型,但會以其他方式生成代碼,就像編寫了myfunc(a)一樣。

回答

15

該代碼中&a的類型是char (*)[100],意思是「指向100個字符數組的指針」。

要正確原型myfunc採取這樣的說法,你會做它像這樣:

void myfunc(char (*pa)[100]); 

或完全等同:

void myfunc(char pa[][100]); 

附錄:

在回答評論中的附加問題:

  1. 是的,您可以在myfunc內使用(*pa)[0]pa[0][0]訪問陣列的第一個元素。

  2. 不,&a(並因此pa)包含陣列的地址。他們做而不是包含地址的地址。很明顯,數組的地址和第一個元素的地址是相同的 - 唯一的區別是類型。因此(void *)&a == (void *)a是正確的,並且(void *)pa == (void *)pa[0]也是如此,即使這看起來有點不直觀。

考慮這兩個聲明:

char (*pa)[100]; 
char **ppc; 

現在,即使pa[0][0]ppc[0][0]都是char類型,該種pappc等同。在第一種情況下,中間表達式pa[0]的類型爲char [100],然後計算出指向該陣列中第一個元素的指針,類型爲char *。在第二種情況下,中間表達式ppc[0]已經是char *

+0

所以在myfunc中,必須使用(* pa)[0]或pa [0] [0]來訪問數組的第一個元素?這意味着pa具有存儲[0]的地址的存儲器位置的地址。 – nimrodm 2009-11-30 09:33:58

+0

我會更新我的答案來回答這個問題。 – caf 2009-11-30 09:36:42

+0

+1爲附錄。 – int3 2009-11-30 10:24:26