[英]Why pointer (*) and array ([]) symbols are bound to variable name and not to type in variable declaration?
关于 C(以及 C++ 的 C 子集)中指针和数组声明的细节,SO 上有很多问题。
我对为什么更感兴趣。
当我们连续声明多个指针/数组时,为什么必须将*
, []
放在每个变量的前面?
int *a, *b;
int c[1], d[1];
为什么我们必须在函数指针中的变量名之后/周围键入内容?
void (*foo_ptr)(int, int);
为什么我们有这个让很多新手感到困惑的功能,甚至编译器也会识别并报告这些东西作为类型的一部分? 例如: function foo accepts int** but it was given int*
我想我正在寻找它背后的直觉,导致它以这种方式被创建,以便我可以将它应用于我对语言的理解。 现在我只是看不到它......
Kernighan 和 Ritchie 在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
指针的数组。
当我们连续声明多个指针/数组时,为什么必须在每个变量前面放置 *, [] ?
答案是:显式优于隐式。 在这种情况下,我们甚至可以在同一行上声明不同的类型, int *a, *b, c;
依此类推,在另一种情况下,它会太乱。 第二个问题同样如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.