如果要处理命令行参数,可以像下面一样定义main
函数。
int main(int argc, char **argv) { ... }
要么
int main(int argc, char *argv[]) { ... }
在许多网站中,解释了第一个argv
是指向指针的指针,第二个是指针数组。但是,这是真的吗?实际上,即使你使用第二个定义,你也可以将argv
设置为=
算子的LHS,如果argv
真的是一个数组,我认为是不允许的。在我看来,“当写成函数的参数”时,char **argv
和char *argv[]
完全相同。但是,我还没有找到证据。
谁能帮助我? (我想要的是严格或正式书面证据。)
注意:我已经阅读了下面的主题。我相信我的帖子不是他们的副本。
好吧,总有C标准:
5.1.2.2.1程序启动
1程序启动时调用的函数名为main。该实现声明此函数没有原型。它应该使用返回类型int并且没有参数来定义:int main(void){/ * ... /}或者有两个参数(这里称为argc和argv,尽管可以使用任何名称,因为它们是声明它们的函数的本地函数):int main(int argc,char * argv []){/ ... * /}或等价物; 9)或其他一些实现定义的方式。
9)因此,int可以被定义为int的typedef名称替换,或者argv的类型可以写为char ** argv,依此类推。
其中说 - 根据脚注(9) - char *argv[]
相当于char **argv
。
您链接的问题适用于在函数参数列表之外进行的数组声明。确实,在函数参数列表之外的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 */
在许多网站中,解释了第一个
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
据我所知,没有。在这两种情况下,argv都是char **
类型。这意味着它是一个pointer to pointer