argv
被定义为指针而不是数组,因为 C 中没有数组参数这样的东西。
你可以定义一些东西looks类似于数组参数,但它在编译时“调整”为数组类型;例如,这两个声明完全相同:
int foo(int param[]);
int foo(int param[42]); /* the 42 is quietly ignored */
int foo(int *param); /* this is what the above two declarations really mean */
和定义main
可以写成:
int main(int argc, char *argv[]) { /* ... */ }
or as
int main(int argc, char **argv) { /* ... */ }
两者完全相同(恕我直言,第二个更清楚地表达了实际情况)。
从某种意义上说,数组类型是 C 中的第二类类型。操作数组的代码几乎总是通过指向元素的指针来实现,执行指针算术来遍历元素。
第 6 条comp.lang.c 常见问题解答 http://www.c-faq.com/解释了数组和指针之间经常令人困惑的关系。
(如果您被告知数组是“真正的”指针,那么它们不是;数组和指针是不同的东西。)
至于为什么argv[0]
指向程序名称,那只是因为它有用。有些程序在错误消息中打印出它们的名字;其他人可能会根据调用它们的名称来改变它们的行为。将程序名称与命令行参数捆绑在一起是一个相当随意的选择,但它很方便并且有效。