c - 正确读取 'int * ptr=&x' 的方法

标签 c pointers initialization declaration

下面的代码很容易理解为

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 作为 intp 作为指向 int) 的指针。该上下文中的 = 然后初始化声明的标识符。

关于c - 正确读取 'int * ptr=&x' 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66295844/

相关文章:

python - boost::python:如何调用需要指针的函数?

c++ - 指向不同类型的指针可以有不同的二进制表示吗?

c - 如何将数组中的字符串分配给 C 中的变量(来自函数)?

java - 从 LKM/kernel-space 启动 Android Activity

c++ - 声明 vector 的 protected 指针的问题

c - C 中未初始化的局部变量

python - FPDF __init__ 在Python中与页眉和页脚结合

c - 环形游的 Voronoi 图

c - 学生结构体的链表实现

c++ - C++中 vector 初始化的性能