为什么指针 (*) 和数组 ([]) 符号绑定到变量名而不是变量声明中的类型?

Noo*_*All 3 c arrays pointers language-design declaration

关于C(以及 C++ 的 C 子集)中指针和数组声明的细节,SO 上有很多问题。
我对为什么更感兴趣。当我们连续声明多个指针/数组时,
为什么必须将*,[]放在每个变量的前面?

int *a, *b;
int c[1], d[1];
Run Code Online (Sandbox Code Playgroud)

为什么我们必须在函数指针中的变量名之后/周围键入内容?

void (*foo_ptr)(int, int);
Run Code Online (Sandbox Code Playgroud)

为什么我们有这个让很多新手感到困惑的功能,甚至编译器也会识别并报告这些东西作为类型的一部分?前任:function foo accepts int** but it was given int*

我想我正在寻找它背后的直觉,导致它以这种方式被创建,以便我可以将它应用于我对语言的理解。现在我只是看不到它......

Eri*_*hil 8

Kernighan 和 Ritchie 在The C Programming Language 1978 年第 90 页中写道:

指针的声明px是新的。

int *px;

旨在作为助记符;它表示组合*px是 an int,也就是说,如果px出现在上下文中*px,则相当于一个类型为 的变量int。实际上,变量声明的语法模仿了变量可能出现的表达式的语法。这种推理在所有涉及复杂声明的情况下都很有用。例如,

double atof(), *dp;

表示在表达式中atof()并且*dp具有类型的值double

因此,我们看到,在声明中,例如int X, Y, ZXY,和Z给我们的表达式“图片”,比如b*bb[10]*b[10],等。声明的标识符的实际类型源自图片:既然*b[10]int,那么b[10]是指向 的指针int,因此b是指向 的 10 个指针的数组int