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

问题描述 投票:0回答:4

如果要处理命令行参数,可以像下面一样定义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?

c++ c
4个回答
6
投票

好吧,总有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


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 */

1
投票

在许多网站中,解释了第一个argv是指向指针的指针,第二个是指针数组。但是,这是真的吗?

将数组声明为函数的参数时,情况并非如此。在argv的签名中的mainchar **类型(指向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


0
投票

据我所知,没有。在这两种情况下,argv都是char **类型。这意味着它是一个pointer to pointer

© www.soinside.com 2019 - 2024. All rights reserved.