Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是char*argv[],它与char**argv有何相似之处_C_Pointers_Command Line Arguments - Fatal编程技术网

什么是char*argv[],它与char**argv有何相似之处

什么是char*argv[],它与char**argv有何相似之处,c,pointers,command-line-arguments,C,Pointers,Command Line Arguments,我无法理解char*argv[]与char**argv的相似之处。 另外,请让我知道何时使用指针?声明为具有数组类型的函数参数被静默调整为具有指针类型。因此,如果使用类型为int x[]的参数声明函数,则该参数实际上具有类型int*x。类似地,函数参数中的char*argv[]与char**argv相同,因为指针数组被调整为指向指针的指针。基本上char*argv[]是字符指针数组,而char**argv是指向字符指针的指针 当我们将其作为函数参数传递时,char*argv[]被调整为指向该数组

我无法理解char*argv[]与char**argv的相似之处。
另外,请让我知道何时使用指针?

声明为具有数组类型的函数参数被静默调整为具有指针类型。因此,如果使用类型为
int x[]
的参数声明函数,则该参数实际上具有类型
int*x
。类似地,函数参数中的
char*argv[]
char**argv
相同,因为指针数组被调整为指向指针的指针。

基本上
char*argv[]
是字符指针数组,而
char**argv
是指向字符指针的指针

当我们将其作为函数参数传递时,
char*argv[]
被调整为指向该数组初始元素的指针类型,
char**argv
,两者都是相同的东西

6.7.5.3功能声明器(包括原型)

7作为“类型数组”的参数声明应调整为“类型限定指针”,其中类型限定符(如有)是在数组类型派生的[和]中指定的。如果关键字static也出现在数组类型派生的[and]中,则对于每次调用函数,对应的实际参数的值应提供对数组第一个元素的访问,该元素的数量至少与大小表达式指定的元素数量相同

正如您所见,我们使用的
main
的两个定义是等效的-

int main(int argc, char ** argv)


那不是真的。编译器在代码生成过程中将数组名替换为其第0个元素的地址,使指向特定类型对象的指针的值与相同类型数组的名称相等。但是数组和指针是两个不同的实体!而且一直如此。(反正我不会投反对票。)@Frankie_C不,你错了。对于函数参数,有一个特殊的规则,即声明
T[]
T*
(甚至
T[N]
)是完全相同的。不过,这只适用于函数参数,fuzzxl没有断言任何其他内容。所以,他的答案是正确的。@Frankie_C我描述的规则适用于函数参数,参见ISO 9899:2011§6.7.6.3/7。@Frankie_C不,我不是说数组和指针是相同的,你不理解我的说法。我是说在函数声明中,
T*
T[]
的意思是一样的。@Frankie_C是的,数组和指针类型不一样。我要说的是,声明为具有数组类型的函数参数被调整为具有指针类型。这是函数参数的特殊规则,与正在进行的正常转换不同。下面是这种特殊行为的一个示例:fuz.su/~fuz/src/arrays.c。引用前面引用的第一节:将参数声明为“类型数组”应调整为“类型的限定指针”,其中类型限定符(如果有)是在数组类型派生的[and]中指定的。@Carcigenicate否,它不是数组数组。这是一个指向指针的问题。请每个问题问一个问题。你的意思是像main的参数一样吗
char*argv[]
在函数参数出现时,与在其他地方出现时不同。您将参数传递给函数(从调用方的角度),但您声明函数具有参数(从被调用方的角度)。这有点吹毛求疵,但了解这种衰退发生在哪里很重要。@fuzzxl是的,当这种衰退发生时很重要,而不仅仅是传递给函数时。但当数组被引用时会发生衰减。函数参数版本中没有“衰减”。衰变是发生在表达式上的事情,但这是一个声明器。它被调整了。@MattMcNabb请看答案。我已经编辑过了。
int main(int argc, char *argv[])