以下代碼中的&a
是什麼類型?C:&array_name的類型是什麼?
char a[100];
myfunc(&a)
這是有效的代碼嗎? gcc -Wall
抱怨缺少原型,但會以其他方式生成代碼,就像編寫了myfunc(a)
一樣。
以下代碼中的&a
是什麼類型?C:&array_name的類型是什麼?
char a[100];
myfunc(&a)
這是有效的代碼嗎? gcc -Wall
抱怨缺少原型,但會以其他方式生成代碼,就像編寫了myfunc(a)
一樣。
該代碼中&a
的類型是char (*)[100]
,意思是「指向100個字符數組的指針」。
要正確原型myfunc
採取這樣的說法,你會做它像這樣:
void myfunc(char (*pa)[100]);
或完全等同:
void myfunc(char pa[][100]);
附錄:
在回答評論中的附加問題:
是的,您可以在myfunc
內使用(*pa)[0]
或pa[0][0]
訪問陣列的第一個元素。
不,&a
(並因此pa
)包含陣列的地址。他們做而不是包含地址的地址。很明顯,數組的地址和第一個元素的地址是相同的 - 唯一的區別是類型。因此(void *)&a == (void *)a
是正確的,並且(void *)pa == (void *)pa[0]
也是如此,即使這看起來有點不直觀。
考慮這兩個聲明:
char (*pa)[100];
char **ppc;
現在,即使pa[0][0]
和ppc[0][0]
都是char
類型,該種pa
和ppc
是不等同。在第一種情況下,中間表達式pa[0]
的類型爲char [100]
,然後計算出指向該陣列中第一個元素的指針,類型爲char *
。在第二種情況下,中間表達式ppc[0]
已經是char *
。
所以在myfunc中,必須使用(* pa)[0]或pa [0] [0]來訪問數組的第一個元素?這意味着pa具有存儲[0]的地址的存儲器位置的地址。 – nimrodm 2009-11-30 09:33:58
我會更新我的答案來回答這個問題。 – caf 2009-11-30 09:36:42
+1爲附錄。 – int3 2009-11-30 10:24:26