C语言中的“ * variable”和“ * variable []”之间有什么区别?

时间:2018-12-08 10:16:59

标签: c arrays char

我有两种不同版本的代码,它们使用C编程语言中的char数组。

第一版:

int main(int argc, char *argv[]) {
    return 0;
}

第二个版本:

int main(int argc, char *argv) {
    return 0;
}

所有代码编译时都没有警告或错误,因此这些代码之间有什么区别吗?

2 个答案:

答案 0 :(得分:5)

来自C标准#5.1.2.2.1p1

  

1在程序启动时调用的函数称为main。该实现没有为此函数声明任何原型。它应使用返回类型int且没有参数来定义:

    int main(void) { /* ... */ }
     

或具有两个参数(尽管可以使用任何名称,但在此处称为argc和argv,因为它们是声明它们的函数的局部名称):

    int main(int argc, char *argv[]) { /* ... */ }
     

或等效形式; 10)或以其他一些实现定义的方式。

根据标准,您的第二个版本不正确:

int main(int argc, char *argv) {
    return 0;
}

使用gcc编译器进行编译时,出现以下错误消息:

prg.c:1:5: error: second parameter of 'main' (argument array) must be of type 'char **'

答案 1 :(得分:-1)

对于main函数,最好将第二个参数argv定义为*argv[]**argv

如果您的程序不处理任何“命令行参数”,则此参数将无用。但是,如果需要它(例如-lR中的ls -lR字符串),您可能会注意到参数 s 将成为二维char数组,或者我们说(参数)字符串 s 的数组。由于C中的“字符串”在不同情况下可以为char*char[],因此我们可以将二维字符数组表示为char *argv[]char **argv

此外,如果您使用gcc -Wall,则第二个程序将产生警告,指出main的第二个参数的类型应为char**