*声明一个指针。我写的时候通常会想到“ int point a ” int *a。
但接下来就变得令人困惑了:
int b = *a;代表“ int b是a的值”,而不是“ a的指针”。有了int *a = &b混乱就完美了,因为新符号&现在再次代表“ b 的指针”。
有谁知道这个约定背后的秘密逻辑吗?为什么不简单*地代表“指针”和&“值”?或者可以将这两个符号视为其他词,以便更有意义吗?
编辑:这个问题与以下四个可能重复的问题有何不同,突出了相关问题和我的问题之间的区别
我的问题是关于
*和&*符号&链接的则不然。除此之外,这些问题的答案都没有提到 1978 年 K&R 的第 90 页,其中指出指针的声明旨在作为助记符。这正是我一直在寻找的。
逻辑是这样的:
\n*始终表示指针的取消引用。*会导致指针被取消引用。*声明中的一元告诉我们取消引用标识符会产生声明的类型。(请参阅下面的更多内容。)相反, the=在声明和表达式中具有不同的含义:
=声明符之后引入了正在声明的对象的初始化。它适用于声明的特定对象,而不适用于所示的整个 \xe2\x80\x9cexpression\xe2\x80\x9d 。=表示将新值分配给左侧的对象。所以int *a;意味着 \xe2\x80\x9c*a当出现在表达式中时,它是一个int.\xe2\x80\x9d 因此,它告诉我们 的类型a是一个指向 的指针int。
\n\n\n
int b = *a;代表“ int b是a的值”,而不是“ a的指针”。
int b = *a;表示 \xe2\x80\x9cb是一个int,并使用.\xe2\x80\x9db的值进行初始化*a
请注意,*a不是 的值a。这就是所a指向的。
\n\n有了
\nint *a = &b混乱就完美了,因为新符号&现在再次代表“ b 的指针”。
int *a = &b说 \xe2\x80\x9c*a是一个int,因此 的类型a是指向 an 的指针int,并使用.\xe2\x80\x9da的地址进行初始化b
此逻辑还有助于理解多个项目的声明。\n考虑int a, *b, c[3];。这表示 \xe2\x80\x9c a、*b、 和c[i]都是一个int.\xe2\x80\x9d 由此,我们得出结论 type 的类型a是 an int, 的类型b是指向 an 的指针int, 的类型c是 的数组int。( \xe2\x80\x9cpicture\xe2\x80\x9d 逻辑被数组拉伸,因为 in3告诉c[3]我们数组的大小,而不是显示 的示例使用c。所以这个类比并不完美。)
(这也是为什么写作int *a比 C 和 C++ 语法更适合int* a;形式语法在*与a绑定之前绑定int。)
1 Kernighan 和 Ritchie 在《C 编程语言》 ,1978 年,第 90 页中告诉我们这一点:
\n\n\n指针的声明
\npx是新的。\n
int *px;旨在作为助记符;它表示该组合
\n*px是 anint,也就是说,如果px出现在上下文中*px,则相当于 类型的变量int。实际上,变量声明的语法模仿了该变量可能出现的表达式的语法。
| 归档时间: |
|
| 查看次数: |
261 次 |
| 最近记录: |