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

时间:2016-10-29 01:47:29

标签: c++ char command-line-arguments main

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

修改:为了更清晰,可以编写类似int* argv[]的内容。 argv是否已定义为char*类型,以便无法更改?

1 个答案:

答案 0 :(得分:5)

实际上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()函数是执行此操作的最简单方法之一,但它不会执行任何错误检查。std::stoi()函数,在以{C}开头的<string>标头中定义++ 11,更好。)

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

有各种用于解析命令行参数的开源库。例如,类Unix系统具有{{1}}功能;有关详细信息,请参阅其文档。

另见this related question