以下代码中&a
的类型是什么?
char a[100];
myfunc(&a)
这甚至是有效的代码吗? gcc -Wall
抱怨缺少原型,但会生成代码,就好像写了myfunc(a)
一样。
答案 0 :(得分:15)
该代码中&a
的类型为char (*)[100]
,表示“指向100个字符数组的指针”。
要正确地对原型myfunc
进行原型设计以获取该参数,您可以这样做:
void myfunc(char (*pa)[100]);
或完全等同的:
void myfunc(char pa[][100]);
<强>附录:强>
回答评论中的其他问题:
是的,您可以在(*pa)[0]
中使用pa[0][0]
或myfunc
来访问数组的第一个元素。
不,&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 *
。