初始化指针后,是否必须使用*取消引用运算符在条件中调用指针?
示例:
int main()
{
int var = 10;
int *ptr = &var;
if(ptr) // does this need to be if(*ptr) ???
{.......}
}
我能简短解释为什么吗?
谢谢。
答案 0 :(得分:5)
if (ptr)
检查指针是否不是Null
if (*ptr)
检查其指向的值是否不为零(在此示例中为10)
因此,要检查该值,您应该添加*。
答案 1 :(得分:0)
这取决于您要做什么。
if(ptr)
检查指针值是否为nullptr
。请注意,这是if(ptr != nullptr)
的简写。
if(*ptr)
检查指针指向的指针是否为nullptr
(或0)-在这种情况下,由于取消引用(跟随)指针来回答问题,那么在这种情况下,指针本身最好 not 不为nullptr
。
答案 2 :(得分:0)
首先,指针只是一个变量。但是,您可以在不同的上下文中使用它。
与其他任何变量一样,您可以按如下方式访问指针内容(这是基础内存的地址):
int i = 1;
int * p = &i;
std::cout << p << std::endl
这将输出i
的地址,因为这是存储在p
中的内容
但是,如果您要访问基础内存的内容(i
的值),则需要首先使用*
运算符来取消引用指针:
std::cout << *p << std::endl;
这会打印i
的值,所以1
。
当然,您也可以访问指针的地址(因为i
的地址也是一个数字值,也需要存储在某个位置):
std::cout << &p << std::endl;
这将输出p
的地址,因此存储i
的地址的地址:)
作为一个小示例,请尝试运行以下代码:
#include <iostream>
int main() {
int i = 1;
int * p = &i;
std::cout << "Value of i(i): " << i << std::endl
<< "Adress of i(&i): " << &i << std::endl
<< "Value of p(p): " << p << std::endl
<< "Dereferenced p(*p): " << *p << std::endl
<< "Adress of p(&p): " << &p << std::endl
<< "Dereferenced adress of p(*(&p)): " << *(&p) << std::endl;
}