在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)?

本文关键字:char argv 类型 如果 则为 中的 main int 是否      更新时间:2023-10-16

我理解,因为argc是参数的数量,它可以是一个int。但是为什么argvchar pointer型的呢?这是否意味着我不能传递一个整数参数并在数学运算中使用argv[1] ?

Edit:为了更清楚,是否可以写int* argv[]argv是否已经定义为char*类型,因此不能更改?

实际上main有两种有效的定义:

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

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

或同等学历。(注意,作为形参,char *argv[]相当于char **argv,后者更准确地表示了它的含义,即指向指向char的指针的指针。)

实现可以(但不要求)支持其他表单;例如,一些系统支持额外的char *envp[]参数。

main的不寻常之处在于它没有一个有效的定义。它不像其他用户定义的函数,它没有无穷多个函数。例如,您可以随意定义一个名为foo的函数。main的定义是受限的,因为它是程序的入口点,调用环境必须知道如何调用它。

这在ISO c++标准的3.6.1节中有更详细的介绍。N4296是2014年版的草案。

如果要将整数作为命令行参数传递,请将其作为字符串传递,然后解析它们。(atoi()函数是最简单的方法之一,但它不做任何错误检查。在c++ 11开头的<string>头文件中定义的std::stoi()函数更好。)

main函数接受一个字符串列表(严格地说,一个指向char*指针数组初始元素的char**指针,每个指针都指向字符串的开头),因为它是一个非常灵活的数据结构,但它并不过于复杂。(注意这里的"string"是一个C风格的字符串,一个以'' null字符结束的字符序列——不要与c++标准库定义的std::string类型混淆。)

有各种用于解析命令行参数的开源库。例如,类unix系统有一个getopt()函数;详细信息请参见其文档。