C编译器如何知道char**x指向一个数组?

Fel*_*ias 5 c arrays pointers

在C中,我读过这个char** x并且char* x[]意思完全相同.我理解第二个例子,但我不明白第一个例子.

对我来说,第一个例子是"指向指向字符的指针",但C会将其视为"指向字符数组的指针列表"?

有人能够以外行的方式向我解释这个问题,因为我一直有一个非常困难的时间把握它.

编辑:我承认我说的第一点是我认为人们想要听到的而不是我的实际解释.我也把它看作是指向char的指针,但是当我在这个问题上阅读最佳答案时,我的理解就下降了:char*argv []和char**argv之间的区别是main()的第二个参数

这表明当用作参数向量时,它被用作指向字符指针数组的指针...

use*_*738 3

长话短说 - 它没有区分这一点。编译器不知道它指向一个数组。它看到的只是一个指针。您所显示的方式(作为函数参数声明的一部分 - 传递给函数)char *[]表示char **相同的事物。这是什么?指向 a 的指针char*。仅此而已。

\n

编译器没有保存任何额外的信息来区分您传递的是数组char*还是 a char**,因为最终char*数组会衰减为指向第一个元素的指针 - 即char**

\n

试试这个,你就会明白:-

\n
char c = \'a\';\nchar *pc = &c;\nchar **ppc = &pc;\nf(ppc);\n
Run Code Online (Sandbox Code Playgroud)\n

....

\n
void f(char *ppc[]){\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这不会让编译器抱怨。因为它最终被编译器认为是char **ppc.

\n

为了证明数组在传递给函数时不会被编译器看到 - 你可以看到这句话(它基本上说存在衰减并且归结为指向第一个元素的指针。所以它看到一个指针全部)(这绝不意味着char**由于腐烂而在所有char*[]情况下都是相同的- 事实并非如此)

\n

\xc2\xa7 6.3.2.1 \xc2\xb63 标准 N1570

\n
\n

除非它是运算sizeof符、_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为 \'array of type\' 的表达式将转换为类型为 \' 的表达式指向数组对象的初始元素且不是左值的类型指针。如果数组对象具有寄存器存储类,则行为未定义。

\n
\n

进行编辑是为了消除导致某人不欣赏答案的误解。

\n