为什么将指针(*)和数组([])符号绑定到变量名而不在变量声明中键入?

问题描述 投票:2回答:2

关于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*我想我正在寻找导致其以这种方式创建的直觉,以便可以将其应用于对语言的理解。现在我看不到...
c arrays pointers declaration language-design
2个回答
4
投票
Kernighan和Ritchie撰写,用

The C Programming Language],1978,第90页:

指针px的声明是新的。

int *px;

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

double atof(), *dp;

在表达式中表示atof()*dp的值为double类型。

因此,我们看到,在诸如int X, Y, ZXYZ的声明中,为我们提供了表达式的“图片”,例如b*bb[10]*b[10],依此类推。声明的标识符的实际类型是从图片得出的:由于*b[10]int,所以b[10]是指向int的指针,因此b是10个指向int的指针的数组。


0
投票
为什么我们在声明时必须在每个变量前面加上*,[]连续几个指针/数组?
© www.soinside.com 2019 - 2024. All rights reserved.