我理解因为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
有什么不寻常之处?是不是它没有一个有效的定义。就是这样,与其他用户定义的函数不同,它没有无限多。例如,您可以定义一个名为 foo
的函数任何你喜欢的方式。 main
的定义是受限制的,因为它是您程序的入口点,调用环境必须知道如何调用它。
这在 ISO C++ 标准的第 3.6.1 节中有更详细的介绍。 N4296是 2014 年版的草稿。
如果您想将整数作为命令行参数传递,请将它们作为字符串传递然后解析它们。 (atoi()
函数是执行此操作的最简单方法之一,但它不执行任何错误检查。在以 C++11 开头的 std::stoi()
header 中定义的 <string>
函数更好。)
main
函数接受一个字符串列表(严格来说是一个 char**
指针,指向一个 char*
指针数组的初始元素,每个指针都指向一个字符串的开头)因为它是一个非常灵活的数据结构,但它不是太复杂了。 (请注意,此处的“字符串”是 C 风格的字符串,由 '\0'
空字符终止的字符序列——不要与 C++ 标准库定义的 std::string
类型混淆。)
有各种用于解析命令行参数的开源库。例如,类 Unix 系统有一个 getopt()
功能;有关详细信息,请参阅其文档。
关于C++ - int main 中的 argv[] 是否应始终为 char* 类型(如果使用 argv,则为 char** 类型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40315273/