更改指针所持有地址的变量的值

3

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

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

我理解指针的作用是保存变量的地址。因此,在我的示例中,指针b保存变量a的地址。

这一切都很好。

我的问题在于解引用的工作方式。据我所知,如果我在b之前添加一个cout语句,就会发生解引用。

*b = 100

例如:
cout << *b << endl;

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

我的问题是,当我看到这一行时:

*b = 100;

这只是让我理解为“将100存储在地址b中存储的值”的字面翻译,这实际上不是发生的情况。实际发生的是100将被存储在指针所持有的地址中。我的问题是我不能理解为什么。
我知道b = 100也没有意义,因为你会尝试将值10存储在变量b的地址中,这将替换存储在b中的变量 a 的地址。
也许是星号符号的选择,但对我来说它一直读作10 = 100,因为当b是一个指针时看到*b意味着“获取存储在b所持有的地址中的值”。
可以有人解释C ++中的解引用以及为什么* b = 100实际上并不意味着10 = 100吗?

5
一个赋值语句 a = 100; 会被理解为赋值操作,而不是把 10 赋值为 100 - 1201ProgramAlarm
1
"b = 100" 的意思是将值为100的数放在b所指向的地方。由于b指向a,因此“b = 100”与“a = 100”是等价的。换句话说,如果先执行“b=&a”,则“*b”的操作就和对“a”的操作一样,无论是读还是写。 - Support Ukraine
3
请确认你理解 int x = 10; x = 100; 的含义。为什么这不是 10 = 100?一旦你理解了这一点,同样适用于 *b = 100 - M.M
1
你可能的误解来自于这里:int* b = &a;。这等同于int* b; b = &a;(而不是int* b; *b = &a;),这很令人困惑,因为在指针声明期间进行赋值看起来像是对解引用指针进行赋值,但实际上并不是这样。 - isrnick
2个回答

7

这是:

*b = 100

可以理解为“将值100存储在指针b所指向的位置”。因为b包含了a的地址,以上操作实际上等同于:

a = 100;
< p>严格来说,解引用操作符*的结果是一个左值(lvalue),这基本上意味着它是一个对象,就像变量名本身可以被赋值一样,也可以被赋值。


1
你的语句“在b所指向的位置存储值100”是有意义的,但更准确的说法是解引用是访问变量(其地址存储在b中)的行为。它不仅返回存储在内存地址中的值,而且返回b所持有的内容。 - Vyres
2
@Vyres 是的,那是另一种表达方式。 - dbush
这对我来说更有意义。谢谢你的帮助。 - Vyres

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接