如果要处理命令行参数,可以像下面一样定义main
函数。
int main(int argc, char **argv) { ... }
或
int main(int argc, char *argv[]) { ... }
在许多网站中,解释说第一个argv
是指向指针的指针,第二个是指针数组。但是,这是真的吗?实际上,即使使用第二个定义,也可以将argv
设置为=
运算符的LHS,如果argv
确实是一个数组,我认为这是不允许的。在我看来,“当作为函数的参数写入时”,char **argv
和char *argv[]
完全相同。但是,我还没有找到证据。
有人能帮帮我吗? (我想要的是严格或正式的书面证据。)
注意:我已经阅读了下面的主题。我相信我的帖子不是他们的副本。
答案 0 :(得分:6)
嗯,总是C标准:
5.1.2.2.1程序启动
1程序启动时调用的函数名为main。实施宣布否 这个功能的原型。它应该使用返回类型int和no来定义 参数: int main(void){/ * ... /} 或者有两个参数(这里称为argc和argv,但任何名称都可以 使用,因为它们是声明它们的函数的本地): int main(int argc,char * argv []){/ ... * /} 或等效的; 9)或其他一些实施定义的方式。
9)因此,int可以被定义为int的typedef名称替换,或者argv的类型可以写为 char ** argv,等等。
其中说 - 根据脚注(9) - char *argv[]
相当于char **argv
。
答案 1 :(得分:1)
在许多网站中,解释说第一个
argv
是指向指针的指针,第二个是指针数组。但是,这是真的吗?
将数组声明为函数的参数时,情况并非如此。 argv
的两个签名中的main
都是char **
类型(指向char
的指针)。
在C中,数组不能传递给函数,而是指向它的指针。将函数的参数声明为数组类型时,编译器会将其视为指针类型。原型下面是等价的
int foo1(int a[10], int size);
int foo2(int a[], int size);
int foo3(int *a, int size);
与char *argv[]
相同,作为函数参数,它等同于char **argv
答案 2 :(得分:1)
您链接的问题适用于在函数参数列表 之外的数组声明。确实,函数参数列表char *argv[]
声明之外的声明与char **argv
声明非常不同。前者声明了一个数组,而后者声明了一个指针。
但是,函数参数声明的处理方式非常不同,您链接的问题不适用于函数参数声明。当数组声明语法用于声明函数参数时,数组类型会自动转换为指针类型。因此,在函数参数列表char *argv[]
中,声明被转换为char **argv
声明。从这个意义上讲,这些声明在该上下文中是完全等效的。在这两种情况下,你最终都会得到一个可以修改的指针。
从更一般的角度来看,在C中,即使在函数参数列表中,数组语法也不完全等同于指针语法,因为数组语法要求元素类型完整
struct S;
void foo(struct S s[]); /* invalid in C */
void bar(struct S *s); /* OK in C */
答案 3 :(得分:0)
据我所知,没有。在这两种情况下,argv都是char **
类型。这意味着它是pointer to pointer