以下代码中的&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