C:&array_name的类型是什么?

nim*_*odm 3 c

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

char a[100];
myfunc(&a)
Run Code Online (Sandbox Code Playgroud)

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

caf*_*caf 15

&a代码的类型是char (*)[100],"指向100个字符数组的指针".

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

void myfunc(char (*pa)[100]);
Run Code Online (Sandbox Code Playgroud)

或完全等同的:

void myfunc(char pa[][100]);
Run Code Online (Sandbox Code Playgroud)

附录:

在回答评论中的其他问题时:

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

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

考虑这两个声明:

char (*pa)[100];
char **ppc;
Run Code Online (Sandbox Code Playgroud)

现在,即使pa[0][0]ppc[0][0]类型都是char,类型的pappc等价的.在第一种情况下,中间表达式pa[0]具有类型char [100],然后该类型计算为指向该数组中第一个元素的指针char *.在第二种情况下,中间表达式ppc[0]已经是a char *.