下面的代码很容易理解为
int x=4;
int *ptr; // ptr is a pointer to an int
ptr=&x; // the address of x is assigned to the pointer ptr
但是下面的等价代码,读起来可能像这样误导
int *ptr=&x; // the address of x is assigned to *ptr, which is an integer
这似乎被解释为将 x 的地址分配给指向的值 *ptr (int *ptr )= &x
正确的解释是当声明和初始化分开时应该写成类似 int *(ptr = &x)
的东西,以表明赋值是指向指针而不是指向的位置,但这报错,这是为什么呢?阅读和思考 int *ptr=&x
的最佳方式是什么?
最佳答案
诚然,这是 C 的一个奇怪部分,主要是由于 C 的演变。
在 C 的语法中,声明旨在镜像使用,因此在 int *x;
之后,*x
解析为 int
和 *x=42
分配给那个 int
。但是在声明的 specifiers declarator
部分之后以 =
开始的初始化在句法和语义上与赋值不同。
(初始化可以“赋值”给静态/文件范围变量,这样的赋值不会生成代码:它只是有助于生成二进制文件的构成。赋值总是生成代码,除非优化可以删除它)
在史前 C 语言中,初始化和赋值看起来非常不同,在 C 语言中,您可以在没有 =
符号的情况下进行初始化,就像在 int x 42;
中一样。 (即使在 =
被添加到初始化语法之后,很长时间以来都不可能初始化局部的、非静态的变量,这意味着 int *p = &x;
这样的情况没有经常出现。)
旧的语法有问题(int x (42);
还会声明和初始化 x
还是函数声明?)这就是它被替换的原因,但我喜欢它强调初始化不同于赋值的方式。
不幸的是,在新语法中(如 int x, *p = &x;
),这种区别并不那么明显,你只需要记住,当你有类型说明符时(int
) 在左端,那么 =
并不表示您可以只查看 *p = &x
的赋值,而是它是一个 < strong>initialization 你必须查看整个声明并查看声明的内容(x
作为 int
和 p
作为指向 int
) 的指针。该上下文中的 =
然后初始化声明的标识符。
关于c - 正确读取 'int * ptr=&x' 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66295844/