关于SO(和C ++的C子集)中的指针和数组声明的[[details,在SO上存在很多问题。我对why感兴趣。为什么当我们在一行中声明多个指针/数组时,是否必须将*
,[]
放在每个变量的前面?
int *a, *b;
int c[1], d[1];
为什么我们必须在函数指针中的变量名之后/周围输入内容?
void (*foo_ptr)(int, int);
,即使编译器也将这些内容作为类型的一部分识别并报告时,我们是否具有使许多新手感到困惑的功能?例如:为什么
function foo accepts int** but it was given int*
我想我正在寻找导致其以这种方式创建的直觉,以便可以将其应用于对语言的理解。现在我看不到...The C Programming Language],1978,第90页:指针
px
的声明是新的。
int *px;
用作助记符;它表示组合*px
是int
,也就是说,如果px
在上下文*px
中出现,则等效于类型int
的变量。实际上,变量声明的语法模仿了可能出现该变量的表达式的语法。这种推理在涉及复杂声明的所有情况下都是有用的。例如,
double atof(), *dp;
在表达式中表示atof()
和*dp
的值为double
类型。
因此,我们看到,在诸如int X, Y, Z
,X
,Y
和Z
的声明中,为我们提供了表达式的“图片”,例如b
,*b
,b[10]
, *b[10]
,依此类推。声明的标识符的实际类型是从图片得出的:由于*b[10]
是int
,所以b[10]
是指向int
的指针,因此b
是10个指向int
的指针的数组。
为什么我们在声明时必须在每个变量前面加上*,[]连续几个指针/数组?