C++ 澄清「;说";指针声明

C++ 澄清「;说";指针声明,c++,c,C++,C,我一直在研究指针。我发现在声明诸如int*x或int*x之类的指针时有一些细微的差别。然而,我一直认为*x是指向内存的实际值。因此,当我阅读int*x=&a时,我将其理解为“将x的指向地址处的值赋给&a”,这显然不是正在发生的事情。变量amem地址被分配给指针x。我该怎么读呢?每当我看到*x,我就认为它是x所指向地址的文本值。这是因为在任何指针声明中,无论它首先用什么值初始化,都会被视为指向的指定mem地址吗 我发现声明int*x或int*x之类的指针有一些细微的区别 这两者完全相同,空间没有区

我一直在研究指针。我发现在声明诸如
int*x
int*x
之类的指针时有一些细微的差别。然而,我一直认为
*x
是指向内存的实际值。因此,当我阅读
int*x=&a
时,我将其理解为“将
x
的指向地址处的值赋给
&a
”,这显然不是正在发生的事情。变量
a
mem地址被分配给指针
x
。我该怎么读呢?每当我看到
*x
,我就认为它是
x
所指向地址的文本值。这是因为在任何指针声明中,无论它首先用什么值初始化,都会被视为指向的指定mem地址吗

我发现声明int*x或int*x之类的指针有一些细微的区别

这两者完全相同,空间没有区别

指针只是一个存储内存地址的整数,就像指向房子的门号一样

现有变量前面的符号基本上是询问变量内存地址。例如:

int var =8;
int* ptr = &var;
这里,我获取变量var的内存地址,并将其分配给一个名为ptr的新变量

现在我不能百分之百确定你的问题是什么,但希望这能有所帮助

编辑: 我强烈建议大家观看这个视频系列,它非常长,但前两个视频非常好地解释了指针、引用和运算符,如果可以,请记下笔记

将“a”的地址分配给“x”

如果生成一个称为“和”的整数:

#包括
int main(){
整数和=57;
标准::cout
我发现在声明int*x或int*x之类的指针时有一些细微的区别

没有语义上的区别。两者都是相同的,
int*x
int*x

我应该如何阅读[
int*x=&a
]

x
初始化为指向
a
”。或者,“…存储
a
”的地址。”


此外,您还应该了解到,
x
被声明为具有类型
int*
,即指向
int
的指针。根据上下文,声明的不同方面可能比其他方面更重要。例如,如果我们已经知道
a
是一个整数,那么从上下文中可以明显看出,一个变量除非另有说明,否则指向它的e是指向整数的指针。

根据上下文,
*x
的发音非常不同

int *x;
它的发音是:将
x
声明为指向int的指针

y = *x;
这是发音:取
x
指向的值,并将其复制到
y

拥有这两种完全不同的发音一开始可能看起来很奇怪。但它有更深的含义。C编程语言的发明者希望为上述声明提供一种替代发音

int*x;
的另一种发音是:声明一个变量,使表达式
*x
的类型为
int


此替代发音规则也适用于非常复杂的类型,例如返回函数的函数,因此值得学习。

当您看到以下声明时:

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;
就是我们所拥有的。

右边的东西被分配给左边的变量。
int*x
int*x
之间没有区别。两者都将
x
定义为指向
int
的指针。一旦定义了变量,
*x
获取
x
@user4581301处的值
x*y+z
x*y+z
之间没有区别,但是第二个选项的排版很奇怪。我怀疑您对这些选项的不适是因为我们同时编写
int*x=&a;
int*x;x=&a;
,这意味着我们有时会看到
*x=&a
有时是
x=&a
。后者是“为x分配某物”的主要代表。出现问题的原因是声明
int*x;
和赋值
x=&a;
组合在同一类型上。这使语法混乱,导致出现
int*x=&a;
,而不是将
&a
赋值给
*x
。它正在初始化
x
,而不是
*x
*x
>之所以出现,是因为它是声明的一部分。谢谢,为了澄清我关于小差异的陈述,我的意思是:使用int*x,y可能会令人困惑,因为这将创建一个指针x
int *x : x = &a;