更改指针保存地址的变量的值

时间:2021-05-25 19:48:42

标签: c++

我有一个非常简单的程序:

int main() {
    int a = 10;
    int* b = &a;
    *b = 100;
    return 0;
}

我理解指针的作用,它保存一个变量的地址。所以在我的例子中,指针 b 保存了变量 a 的地址。

这一切都很好。

我的问题是解引用的工作原理。根据我的理解,如果我在之前添加一个 cout 语句

*b = 100

例如:

cout << *b << endl;

然后程序应该打印 10,因为 *b 将获取存储在指针所在地址中的值。

我的问题是,当我看到这条线时:

*b = 100;

这对我来说只是“在地址 b 中存储的值中存储 100”,字面意思是 10 = 100。现在显然这不是实际发生的情况,发生的是 100将存储在指针所持有的地址中。我的问题是我不明白为什么。

我知道 b = 100 也没有意义,因为您会尝试将值 10 存储在变量 b 的地址中,该地址将替换 {{1} }} 存储在 a 中。

也许这是星号符号的选择,但对我来说这只是连续读取为 b,因为当 10 = 100 是指向我的指针时看到 *b 意味着“获取存储的值在 b 持有的地址中”。

有人可以解释一下 C++ 中的解引用,为什么 b 实际上并不意味着 *b = 100

2 个答案:

答案 0 :(得分:7)

这个:

*b = 100

可以读作“将值 100 存储在 b 指向的位置”。并且因为 b 包含 a 的地址,所以上面的内容实际上等同于:

a = 100;

从形式上讲,解引用运算符 * 的结果是一个 lvalue,这基本上意味着它是一个可以赋值的对象,就像变量名本身可以分配给。

答案 1 :(得分:0)

您可以看到取消引用为 *b 给您一个 int& - 对它所指向的对象的引用。

以返回实际引用的函数为例:

int& dereference(int* ptr) {
    return *ptr;
}

int main() {
    int a = 10;
    int* b = &a;

    std::cout << dereference(b) << '\n';    // prints 10

    dereference(b) = 100;                   // assigns 100

    std::cout << dereference(b) << '\n';    // prints 100
}
相关问题