C:& array_name的类型是什么?

时间:2009-11-30 09:06:31

标签: c

以下代码中&a的类型是什么?

char a[100];
myfunc(&a)

这甚至是有效的代码吗? gcc -Wall抱怨缺少原型,但会生成代码,就好像写了myfunc(a)一样。

1 个答案:

答案 0 :(得分:15)

该代码中&a的类型为char (*)[100],表示“指向100个字符数组的指针”。

要正确地对原型myfunc进行原型设计以获取该参数,您可以这样做:

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

或完全等同的:

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

<强>附录:

回答评论中的其他问题:

  1. 是的,您可以在(*pa)[0]中使用pa[0][0]myfunc来访问数组的第一个元素。

  2. 不,&a(以及pa)包含数组的地址 。他们包含地址的地址。很明显,数组的地址和第一个元素的地址是相同的 - 唯一的区别是类型。因此(void *)&a == (void *)a为真,(void *)pa == (void *)pa[0]也是如此,即使这看起来有点不直观。

  3. 考虑这两个声明:

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

    现在,即使pa[0][0]ppc[0][0]都属于char类型,pappc的类型也不是相当于。在第一种情况下,中间表达式pa[0]具有类型char [100],然后它将计算为指向该数组中第一个元素char *的指针。在第二种情况下,中间表达式ppc[0]已经是char *