'char * args []'和'char ** argv'之间的区别作为参数

时间:2018-03-04 18:02:14

标签: c++ c

如果要处理命令行参数,可以像下面一样定义main函数。

int main(int argc, char **argv) { ... }

int main(int argc, char *argv[]) { ... }

在许多网站中,解释说第一个argv是指向指针的指针,第二个是指针数组。但是,这是真的吗?实际上,即使使用第二个定义,也可以将argv设置为=运算符的LHS,如果argv确实是一个数组,我认为这是不允许的。在我看来,“当作为函数的参数写入时”,char **argvchar *argv[]完全相同。但是,我还没有找到证据。

有人能帮帮我吗? (我想要的是严格或正式的书面证据。)

注意:我已经阅读了下面的主题。我相信我的帖子不是他们的副本。

What Is The Difference Between char**x and char*x[]

In C, are arrays pointers or used as pointers?

4 个答案:

答案 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