我一直在寻找指针。我发现在声明int* x
或int *x
之类的指针方面存在细微的差别。但是,我一直认为*x
是指向内存的实际值。因此,当我读取int *x = &a
时,我将其读取为“将x
的指向地址的值分配给&a
”,这显然没有发生。变量a
的内存地址已分配给指针x
。我应该如何阅读?每当我看到*x
时,我只是认为这是x
指向的地址处的文字值。是因为在任何指针声明中,首先用它初始化的任何值始终被视为要指向的已分配内存地址?
答案 0 :(得分:1)
我发现在声明int * x或int * x之类的指针方面存在细微差别
没有语义上的区别。两者都与int*x
和int * x
相同。
我应该如何阅读[
int *x = &a
]?
“ x
初始化为指向a
” 。或者,选择“ ...存储a
” 的地址。
此外,您还应该阅读x
被声明为类型int*
,即指向int
的指针。根据上下文,声明的不同方面可能比其他方面更重要。例如,如果我们已经知道a
是整数,那么从上下文中可以明显看出,指向它的变量是指向整数的指针,除非另有说明。
答案 1 :(得分:1)
当您看到诸如以下内容的声明时:
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;
就是我们所拥有的。
答案 2 :(得分:0)
我发现在声明int * x或int * x之类的指针方面存在细微的差别。
这两个是完全相同的,空格没有区别。
指针只是一个存储内存地址的整数,例如指向房屋的门号。
现有变量前面的与号基本上是在询问变量您的内存地址是什么。例如:
int var =8;
int* ptr = &var;
在这里,我要获取变量var的内存地址,并将其分配给名为ptr的新变量。
现在我不是100%知道您的问题是什么,但希望这可能会有所帮助。
编辑: 我强烈建议您观看此视频系列,它很长,但是前几个视频很好地解释了指针,引用和运算符,请尽可能记下注释。 The Cherno C++ Tutorial
答案 3 :(得分:0)
“将'a'的地址分配给'x'”。
如果您创建一个称为“ sum”的整数:
#include <iostream>
int main(){
int sum = 57;
std::cout << &sum << std::endl; //Prints the address
std::cout << *(&sum) << std::endl; //Prints 57
std::cout << sum << std::endl; //Prints 57
return 0;
}
您将看到&符在询问变量的地址。指针只是另一个变量,它们包含地址,而不是我们所理解的“有用值”。
据我所知,it's just a question of style(“ int * x”与“ int * x”)。当您不声明变量而是调用它时,星号将充当取消引用,即,它进入变量中包含的地址以返回指针所指向的任何位置。
答案 4 :(得分:0)
根据上下文,*x
的发音有很大不同。
int *x;
这发音为:声明x
为一个指向int的指针。
y = *x;
这是发音:将x
指向的值复制到y
。
起初,这两种完全不同的发音可能看起来很奇怪。但是它有更深的含义。 C编程语言的发明者希望为上述声明提供其他发音。
int *x;
的替代发音是:声明一个变量,使得表达式*x
的类型为int
。
此替代发音规则也适用于非常复杂的类型,例如函数返回函数的函数,因此值得学习。