C++ 指针问题

Posted

技术标签:

【中文标题】C++ 指针问题【英文标题】:C++ pointer issue 【发布时间】:2009-07-16 00:21:29 【问题描述】:

所以我现在正在学习 C++,我正在尝试用指针解决问题。任何人都可以解释以下情况:

bool testFalse = false;  //testFalse = false
bool *thisIsFalse = &testFalse; //value of address of thisIsFalse shows that the address contains false
bool shouldBeFalse = &thisIsFalse; //shouldBeFalse = true is what I get here

shouldBeFalse(顾名思义)应该是假的,但事实并非如此。有人可以解释为什么它最终是真实的以及如何使它具有正确的价值吗?谢谢!

【问题讨论】:

【参考方案1】:

你正在使用 & 你应该在哪里使用 *:

bool shouldBeFalse = *thisIsFalse

【讨论】:

不客气。正如其他人所指出的,& 用于获取变量的地址(就像您对 &test 所做的那样),而 * 应用于变量时(如 *thisIsFalse)用于取消引用(例如,从地址获取值) 【参考方案2】:

目前尚不清楚您要做什么,但我的猜测是您实际上想要取消引用指针(即检索指向的值)。为此,您需要运营商*,而不是&

 bool shouldBeFalse = *thisIsFalse;

您的代码所做的是取而代之的是变量thisIsFalse 的地址,产生了一个指向指针的指针。现在在 C++ 中,如果指针为 NULL,则将其视为“假”,否则视为“真”;如果您传递一个预期为bool 的指针,编译器将在这些规则下将指针隐式转换为bool。由于那里有一个非 NULL 指针,它被转换为 true

【讨论】:

【参考方案3】:

thisIsFalse 是一个变量,&thisIsFalse 是该变量的地址。由于地址不为 0,因此将其转换为 bool 为 true。我不确定你用那条线的目的是什么。也许你是这个意思?

bool shouldBeFalse = *thisIsFalse;

【讨论】:

【参考方案4】:

您在这里所做的是将thisIsFalse 变量的地址分配给shouldBeFalse。你的意思是取消引用 thisIsFalse。具体来说,由于thisIsFalse 变量存储在非空(非零)内存位置,因此它的计算结果为true

bool shouldBeFalse = *thisIsFalse; // now it really is false

【讨论】:

【参考方案5】:

为了谈论布尔值,您应该取消引用您的指针 (*),而不是获取它的地址 (&)。

bool shouldBeFalse = *thisIsFalse;

【讨论】:

【参考方案6】:

testFalse 是一个布尔值,赋值为false

thisIsFalse 是一个指向布尔值的指针,并被分配了一个等于testFalse 地址的值(我假设您要输入&testFalse 而不是&test)。这意味着当使用*thisIsFalse 时,它将指向testFalse 存储的值,在本例中为false。如果将testFalse 的值更改为true,则*thisIsFalse 将变为true

shouldBeFalse 是一个布尔值,但您为其分配了一个等于thisIsFalse 地址的值。这个地址是一个非零值,在 C++ 中任何非零值都被认为是true,所以shouldBeFalse 现在是true

相反,您应该更改最后一行,将 thisIsFalse 的取消引用值而不是地址分配给 shouldBeFalse

bool shouldBeFalse = *thisIsFalse;

【讨论】:

【参考方案7】:

将符号翻译成单词会很有帮助,这样你就可以准确地理解你在写什么。

当在等号右侧时,将'*' 替换为“指向的值”,将'&' 替换为“地址”。

如果你这样做了,你会口头阅读你的代码如下:

#testFalse is False;
#thisIsFalse is **the address of** testFalse;
#shouldBeFalse is **the address of** thisIsFalse;

但你想要的是:

#shouldBeFalse is **the value pointed to by** thisIsFalse;

从那里很容易记住'*''&' 的角色,因此您可以将其翻译回:

bool shouldBeFalse = *thisIsFalse;

【讨论】:

以上是关于C++ 指针问题的主要内容,如果未能解决你的问题,请参考以下文章

带有空指针的 2D 指针数组 c++

将指针数组传递给函数指针数组的 C++ 问题

在 C++ 中使用指针和指向指针的指针读取和存储序列化对象的快速方法

C++ 智能指针性能

C++ 指针问题

C++多态与this指针问题