澄清“说”指针声明

时间:2019-01-05 03:11:50

标签: c++ c

我一直在寻找指针。我发现在声明int* xint *x之类的指针方面存在细微的差别。但是,我一直认为*x是指向内存的实际值。因此,当我读取int *x = &a时,我将其读取为“将x的指向地址的值分配给&a”,这显然没有发生。变量a的内存地址已分配给指针x。我应该如何阅读?每当我看到*x时,我只是认为这是x指向的地址处的文字值。是因为在任何指针声明中,首先用它初始化的任何值始终被视为要指向的已分配内存地址?

5 个答案:

答案 0 :(得分:1)

  

我发现在声明int * x或int * x之类的指针方面存在细微差别

没有语义上的区别。两者都与int*xint * 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

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