【问题标题】:What's difference between "*variable" and "*variable[]" in C?C中的“*variable”和“*variable[]”有什么区别?
【发布时间】:2018-12-08 10:16:59
【问题描述】:

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

第一版:

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

第二版:

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

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

【问题讨论】:

  • main()函数的情况,第一个正确,第二个错误。 (参见What should main() return in C and C++?,它还涵盖了传入的参数以及返回类型)。区别在于指向某些字符的指针(第一种情况)和指向某些字符的指针(第二种情况)之间的区别。请注意,一些编译器会(正确地)抱怨第二种情况——这不是main() 的合法签名。
  • 第二个代码段错误。
  • 我推荐this main function reference。并且可能是一本关于指针和数组的好书或教程。
  • 请仔细检查您的问题是否有“错别字”。

标签: c arrays char


【解决方案1】:

来自 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 **'

【讨论】:

    【解决方案2】:

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

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

    另外,如果你使用gcc -Wall,第二个程序会产生一个警告,说main的第二个参数的类型应该是char**

    【讨论】:

    • 由于 C 中的“字符串”在不同情况下可以是 char 或 char[],那么我们可以将二维 char 数组表示为 char argv[ ] 或 char **argv- 字符串始终是 char 的数组,句点。您也可以使用char * 指向第一个字符,因为数组在几乎所有上下文中都会衰减。但是char *argv[]char **argv - 改变的是不是“字符串”而是“数组”。
    猜你喜欢
    • 2023-04-07
    • 2019-11-16
    • 2021-08-19
    • 1970-01-01
    • 2013-07-22
    • 2013-12-02
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    相关资源
    最近更新 更多