我有一个非常简单的程序:
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
?
答案 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
}