2015-09-05 61 views
3

我明白为什么这不起作用:关于指针数组为char

int main(int argc, char *argv[]) { 
    char *names[] = {"name1", "name2", "name3", "name4"}; 
    int i = 0; 
    while (i++ <= 3) { 
     printf("%s\n", *names++); 
    } 
} 

错误:

a.c: In function 'main': 
a.c:16: error: wrong type argument to increment 
shell returned 1 

这是因为我想增加一个数组变量(而不是指针)。请不要介意错误消息中的行号,我有很多评论代码,上面和下面是我在这里提出的。

不过,我不明白为什么这段代码的工作:

void myfunc(char *names[]) { 
    int i = 0; 
    while (i++ <= 3) { 
     printf("%s\n", *names++); 
    } 
} 


int main(int argc, char *argv[]) { 
    char *names[] = {"name1", "name2", "name3", "name4"}; 
    myfunc(names); 
} 

我们怎样才能增加在myfunc()names?它仍然是一个局部数组变量,在myfunc()。 有人可以帮忙吗?

谢谢。

+3

在第二种情况下,它衰减为指针并且指针可以增加。 – ameyCU

+0

你声明你知道第一个例子的问题的根源。那么,你是否明白代码需要以'#include '语句作为前缀?如果编译时启用了所有的警告,编译器会告诉你有关1)警告:未使用的argc参数2)警告:未使用的argv参数3)错误:作为增量运算符需要左值。如果你解决了这些问题,代码就可以正常工作。 – user3629249

回答

5

在1 st示例names是一个数组。数组不能增加

在2 nd示例names是一个指针。指针可以增加

背景为何2 第二示例编译:

在函数声明的变量定义中的[]是一样的(另一个)*

所以这

void myfunc(char * names[]); 

相当于

void myfunc(char ** names); 

后者使得它很明显,这里names不是一个数组而是一个指针。

1

当您将一个数组作为函数参数传递时,它会将其转换为指向数组中第一个元素的指针。这意味着当你声明一个数组并试图直接增加数组时,你试图增加一个数组。另一方面,当您将数组作为参数传递时,它会作为指针传递,因此您可以将其增加。

如果您希望将数组作为数组传递而不是指针,那么可以考虑使用std::array,它是一个固定大小的容器。

编辑:我道歉。 std::array仅在C++中可用。

+0

你可以在C中使用'std :: array'吗? – ameyCU

+0

没有抱歉。我以为你是用C++编写的。我不知道如何在C中传递一个数组作为数组。 –

+0

不要道歉,我只是这样做,所以OP没有感到困惑。 – ameyCU

1

当您将数组传递给函数时,它会衰减为指针。 请参阅此处了解有关array-decaying