在C中,我读过这个char** x并且char* x[]意思完全相同.我理解第二个例子,但我不明白第一个例子.
对我来说,第一个例子是"指向指向字符的指针",但C会将其视为"指向字符数组的指针列表"?
有人能够以外行的方式向我解释这个问题,因为我一直有一个非常困难的时间把握它.
编辑:我承认我说的第一点是我认为人们想要听到的而不是我的实际解释.我也把它看作是指向char的指针,但是当我在这个问题上阅读最佳答案时,我的理解就下降了:char*argv []和char**argv之间的区别是main()的第二个参数
这表明当用作参数向量时,它被用作指向字符指针数组的指针...
长话短说 - 它没有区分这一点。编译器不知道它指向一个数组。它看到的只是一个指针。您所显示的方式(作为函数参数声明的一部分 - 传递给函数)char *[]表示char **相同的事物。这是什么?指向 a 的指针char*。仅此而已。
编译器没有保存任何额外的信息来区分您传递的是数组char*还是 a char**,因为最终char*数组会衰减为指向第一个元素的指针 - 即char**。
试试这个,你就会明白:-
\nchar c = \'a\';\nchar *pc = &c;\nchar **ppc = &pc;\nf(ppc);\nRun Code Online (Sandbox Code Playgroud)\n....
\nvoid f(char *ppc[]){\n\n}\nRun Code Online (Sandbox Code Playgroud)\n这不会让编译器抱怨。因为它最终被编译器认为是char **ppc.
为了证明数组在传递给函数时不会被编译器看到 - 你可以看到这句话(它基本上说存在衰减并且归结为指向第一个元素的指针。所以它看到一个指针全部)(这绝不意味着和char**由于腐烂而在所有char*[]情况下都是相同的- 事实并非如此)
\xc2\xa7 6.3.2.1 \xc2\xb63 c11标准 N1570
\n\n\n除非它是运算
\nsizeof符、_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为 \'array of type\' 的表达式将转换为类型为 \' 的表达式指向数组对象的初始元素且不是左值的类型指针。如果数组对象具有寄存器存储类,则行为未定义。
进行编辑是为了消除导致某人不欣赏答案的误解。
\n