为什么包含指针的条件总是返回 true?



例如,请考虑以下代码。指针p指向包含非零值的变量a。意思是,条件应该是真的。因此,如果程序返回 1,我对此没有问题。

#include <iostream>
int main()
{
int *p, a = 1;
p = &a;
if(p)
{
return 1;
}
return 0;
}

但是对于以下程序,结果也是相同的。尽管这次指针指向一个包含 0 的变量。所以,条件应该是假的,但事实并非如此。

#include <iostream>
int main()
{
int *p, a = 0;
p = &a;
if(p)
{
return 1;
}
return 0;
}

那么,我错过了什么?为什么条件总是返回 true?我假设指针与它指向的值无关。相反,它是根据其他东西评估条件,我想知道这个特定的原因。

空指针被隐式转换为布尔值 false,而非空指针被转换为 true。从 C++11 标准中,布尔转换部分:

算术、无作用域枚举、指针或指向成员类型的指针的 prvalue 可以转换为 bool 类型的 prvalue。零值、空指针值或空成员指针值将转换为 false;任何其他值都将转换为 True 。标准::nullptr_t 类型的 prvalue 可以转换为 bool 类型的 prvalue ;结果值为假

使用这个:

if(*p)

而不是

if(p)

*p取消引用指针,生成值。p只是一个保存另一个变量地址的对象。

这里的问题出在 if 语句的状况上:

if (p)

这是因为在p中,你存储值&a,这是存储值的变量a的地址,而不是变量本身。

a的地址,当我编译你的程序并运行它时,是0x7fff0d9fd274,这不是零。if 语句条件中的任何值将始终计算为true如果该值不为零。因此,即使更改了a中的值,您的条件也会得到验证,因为您的编译器甚至不查看a的值;它只是检查存储在p中作为值的地址是否为零,但事实并非如此。因此,您的 if 语句始终为真,因此程序终止时始终返回非零状态。

要解决此问题,您应该使用*p而不是p。此语法告诉编译器获取指针p存储的地址中的值,在第二个程序中为零。

将第二个程序中的 if 条件更改为:

if (*p)

将以零状态终止程序,就像您希望的那样。

希望这有帮助!

if (p)确实返回 true,因为if (p)if (p != nullptr)的快捷方式。

p包含变量a的内存地址。在我的机器上,0x29fef8.由于nullptr等价于0而 p 不0因此条件if (p != nullptr)计算为 true。因此,条件始终返回 true。

在 C 中,指针通过两个运算符与变量相关:takeaddress(由与号字符或&) 表示,以及取消引用(由星号字符表示)或 *****。

首先,您应该记住指针保存内存位置的地址。所以,你的线 p = &a; 正在将 int 变量的地址放入指针变量pa。该地址当然不为空,因为 a 是一个具有实际地址的现有变量。

这就是为什么您对p值的测试将始终成立的原因。

如果要测试p保存的地址的内容 - 即a的值,则应取消引用它。换句话说,您的代码应该是:

#include <iostream>
int main()
{
int *p, a = 0;
p = &a;
if(*p)
{
return 1;
}
return 0;
}

if (p)将始终评估为true,直到p不指向任何内容(地址0x)。我认为你真正想做的是if (*p)这样你就从p指向的地址评估值。*用于从地址访问信息。

请记住,指针保留地址而不是值,因此p = &a*p = a

最新更新