C++ - int main 中的 argv[] 是否应始终为 char* 类型(如果使用 argv,则为 char** 类型)?

C++ - Should argv[] in the int main be always of the type char* (or char** if argv is used)?

我明白了,因为argc是参数个数,所以可以是int。但是为什么 argv 应该是 char pointer 类型呢?这是否意味着我不能传递整数参数并在数学运算中使用 argv[1]

编辑:为了更清楚,是否可以写类似int* argv[]的东西。 argv 是否已定义为 char* 类型以致无法更改?

实际上 main 有两个有效定义:

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

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

或同等学历。 (请注意,作为参数,char *argv[] 等同于 char **argv,这是更准确的表示,指向指向 char 的指针。)

实现可以但不要求支持其他形式;例如,某些系统支持额外的 char *envp[] 参数。

main 的不寻常之处不在于它没有一个有效的定义。就是这样,与其他 user-defined 函数不同,它没有无限多。例如,您可以任意定义一个名为 foo 的函数。 main 的定义受到限制,因为它是您程序的入口点,调用环境必须知道如何调用它。

这在 ISO C++ 标准的第 3.6.1 节中有更详细的介绍。 N4296 是 2014 版的草稿。

如果您想将整数作为 command-line 参数传递,请将它们作为字符串传递然后解析它们。 (atoi() 函数是执行此操作的最简单方法之一,但它不进行任何错误检查。std::stoi() 函数定义在 <string> header 开始使用 C++11 更好。)

main函数接受一个字符串列表(严格来说是一个char**指针指向一个char*指针数组的初始元素,每个指针指向一个字符串),因为它是一个非常灵活的数据结构,但它并不过分复杂。 (请注意,这里的 "string" 是一个 C-style 字符串,由 '[=26=]' 空字符终止的字符序列——不要与由 std::string 定义的类型混淆C++ 标准库。)

有多种 open-source 库用于解析 command-line 参数。例如,Unix-like 系统有一个 getopt() 函数;有关详细信息,请参阅其文档。

另见 this related question