C/C++ 中的指针运算符约定背后是否有逻辑?

doe*_*367 2 c c++

*声明一个指针。我写的时候通常会想到“ int point aint *a

但接下来就变得令人困惑了:

int b = *a;代表“ int b是a的”,而不是“ a的指针”。有了int *a = &b混乱就完美了,因为新符号&现在再次代表“ b 的指针”。

有谁知道这个约定背后的秘密逻辑吗?为什么不简单*地代表“指针”和&”?或者可以将这两个符号视为其他词,以便更有意义吗?


编辑:这个问题与以下四个可能重复的问题有何不同,突出了相关问题和我的问题之间的区别

我的问题是关于

  1. 这两个符号背后的预期逻辑*&
  2. 如何用语言思考/说出 和*符号&

链接的则不然。除此之外,这些问题的答案都没有提到 1978 年 K&R 的第 90 页,其中指出指针的声明旨在作为助记符。这正是我一直在寻找的。

Eri*_*hil 7

逻辑是这样的:

\n
    \n
  • 一元*始终表示指针的取消引用。
  • \n
  • 当计算表达式时,一元*会导致指针被取消引用。
  • \n
  • 声明提供了 \xe2\x80\x9cpicture\xe2\x80\x9d 来说明如何在表达式中使用标识符。1因此*声明中的一元告诉我们取消引用标识符会产生声明的类型。(请参阅下面的更多内容。)
  • \n
\n

相反, the=在声明和表达式中具有不同的含义:

\n
    \n
  • 在声明中,=声明符之后引入了正在声明的对象的初始化。它适用于声明的特定对象,而不适用于所示的整个 \xe2\x80\x9cexpression\xe2\x80\x9d 。
  • \n
  • 在表达式中,=表示将新值分配给左侧的对象。
  • \n
\n

所以int *a;意味着 \xe2\x80\x9c*a当出现在表达式中时,它是一个int.\xe2\x80\x9d 因此,它告诉我们 的类型a是一个指向 的指针int

\n

一些额外的讨论在这里这里

\n
\n

int b = *a;代表“ int b是a的”,而不是“ a的指针”。

\n
\n

int b = *a;表示 \xe2\x80\x9cb是一个int,并使用.\xe2\x80\x9db的值进行初始化*a

\n

请注意,*a不是 的值a。这就是所a指向的。

\n
\n

有了int *a = &b混乱就完美了,因为新符号&现在再次代表“ b 的指针”。

\n
\n

int *a = &b说 \xe2\x80\x9c*a是一个int,因此 的类型a是指向 an 的指针int,并使用.\xe2\x80\x9da的地址进行初始化b

\n

此逻辑还有助于理解多个项目的声明。\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。所以这个类比并不完美。)

\n

(这也是为什么写作int *a比 C 和 C++ 语法更适合int* a;形式语法在*a绑定之前绑定int。)

\n

脚注

\n

1 Kernighan 和 Ritchie 在《C 编程语言》 ,1978 年,第 90 页中告诉我们这一点:

\n
\n

指针的声明px是新的。

\n

int *px;

\n

旨在作为助记符;它表示该组合*px是 an int,也就是说,如果px出现在上下文中*px,则相当于 类型的变量int。实际上,变量声明的语法模仿了该变量可能出现的表达式的语法。

\n
\n


归档时间:

查看次数:

261 次

最近记录:

3 年 前