我一直在研究指针。我发现声明指针的细微差别,如 int* x
或 int *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/