unsized数组声明如何充当指针?

时间:2016-07-01 11:04:53

标签: c

如果char s[]看起来像数组声明,它如何充当指针?

#include<stdio.h>

void test(char s[]);

int main()
{
    char s[10]="test";  
    char a[]=s;
    test(s);
    char p[]=s;
    return 0;
}

void test(char s[])
{
    printf(s);
}

3 个答案:

答案 0 :(得分:3)

您不能分配给数组,只能复制它们或使用有效的初始化程序初始化它们(而另一个数组不是有效的初始化程序)。

当你宣布像

这样的函数时
void test(char s[]);

它实际上与声明它相同

void test(char *s);

当你调用一个带“数组”的函数时会发生什么?数组衰减到指向第一个元素的指针,它就是传递给函数的指针。

所以电话

test(s);

相同
test(&s[0]);

关于函数声明,声明一个采用数组数组的函数与声明一个指向指针的函数的函数相同。参见例如this old answer of mine作为原因的解释。

所以如果你想要一个带有数组数组的函数,比如

void func2(char a[][X]);

相同
void func2(char **a);

相反,它与

相同
void func2(char (*a)[X]);

对于更多“尺寸”,它不会改变任何东西,例如

void func3(char a[][X][Y]);

相同
void func3(char (*a)[X][Y]);

答案 1 :(得分:1)

char a[]是一个数组而不是指针,初始化无效。 s也是一个数组,但在表达式的上下文中,它计算为指向其第一个元素的指针。

答案 2 :(得分:0)

char a[]仅在您拥有以下初始化列表时才有效。它必须是一个字符数组。作为字符串的特例,C允许您键入一个字符数组"str",而不是{'s','t','r','\0'}。初始化器都可以。

在代码char a[]=s;中,s是一个数组类型而不是有效的初始值设定项,因此代码将无法编译。

void test(char s[])是另一种特殊情况,因为作为参数传递的数组总是被编译器替换为指向第一个元素的指针。不要将此与数组初始化混淆,即使语法类似。