c++ - 澄清 "saying"指针声明

标签 c++ c

我一直在研究指针。我发现声明指针的细微差别,如 int* xint *x。但是,我一直认为 *x 是指向内存的实际值。所以当我读int *x = &a时,我把它读作“assign value at pointed address of x to &a”,这显然是不是正在发生的事情。变量 a 内存地址被分配给指针 x。我应该如何阅读它?每当我看到*x,我就认为它是x指向的地址的文字值。是不是因为在任何指针声明中,无论它首先用它初始化的值总是被视为要指向的分配内存地址?

最佳答案

当您看到如下声明时:

int *x = &a;

您应该将其解释为:

int *x;
x = &a;

声明语法在视觉上令人困惑。 int *x = &a; 的外观不是 *x = &a;。历史上发生的事情是我们有简单的赋值,比如 x = &a;,我们也有声明。在 C 风格的声明中,我们展示了我们希望如何使用变量:

int x;     // I want x to be an int. Therefore, x is an int.
int *x;    // I want *x to be an int. Therefore, x is a pointer to an int.
int x();   // I want x() to be an int. Therefore, x is a function that returns an int.
int x[3];  // I want x[i] to be an int. Therefore, x is an array of int.
int *x[3]; // I want *x[i] to be an int. Therefore, x is an array of pointers to int.

接下来,我们要将声明和赋值结合起来——部分是为了源代码的简洁,部分是为了强调这是对象的初始值,它在定义时具有的值。为此,声明和赋值被挤在一起,导致:

int *x = &a;

这导致 *x = &a 出现在语句中,但它&a 分配给 *x。它正在初始化 x,而不是 *x*x 出现只是因为它是声明的一部分。我想这可以通过将赋值部分和声明部分分开但将它们保持在同一个语句中来减少混淆,也许是这样的:

int *x : x = &a;

但是,不管可以做什么,int *x = &a; 就是我们所拥有的。

关于c++ - 澄清 "saying"指针声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54048645/

相关文章:

c++ - 创建属于另一个使用 Qt Designer 制作的小部件的 Qt 小部件

c++ - 无限模板递归,因为仅使用 gcc 没有 bool 表达式优化

c - 使用 mmap API 时内存映射长度的意义是什么?

c - C中函数指针在数据结构开发中的使用

c++ - 在 C++11(或更新版本)中创建 RAII 包装器而无需编写新类的最短路径是什么?

c++ - 将对象传递给具有参数作为引用类型的函数时以及当其类对象类型时得到不同的输出

c++ - 为什么 C++ 中长度为 n 的字符字符串在 [n] 索引上总是有一个空字符作为垃圾?

在 C 中创建线程并为函数提供参数

Python ctypes : how to pass row outputs from a C function into a pandas DataFrame?

c - C 中的刷新输入