2009-11-30 64 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