使用指针编写条件的几种方法之间的差异

时间:2011-10-14 00:04:00

标签: c++

我想知道是否有人可以总结以下编写涉及指针的条件语句的方式之间的差异:

if(p)
if(p != 0)
if(p != NULL)

我经常对以下情况感到困惑(必须有更多,请补充你的)何时使用:

static char *p1;
char *p2 = new char();
const char *p3 = "hello"; /*then I repeatedly do p3++*/
char *p4 = 0;
char *p5 = NULL;

修改

此外,我想知道,对于char *p,我们是while(*p)还是while(*p!=0),可能等同于while(p)while(p!=0)或{在while循环中的while(p!=NULL)之后{1}}或while(*p!='\0')(或任何其他?)?

2 个答案:

答案 0 :(得分:5)

if(p)

在此上下文中,p已转换为bool,与p != 0实际上相同。

if(p!=0)

这是检查空指针的显式方法,与前一个指针相同。

if(p != NULL)

与此不同的是NULL是一个宏;在C中定义为(void*)0,而在C ++中定义为0。同样,它与前两个表达式相同。

基本上,它们都做同样的事情(除了NULL宏没有被定义或被重新定义为其他东西)。我倾向于使用p != 0,因为它与p相同,但明确说明。使用NULL的版本需要包含stddefcstddef,这通常不是问题。

在C ++ 11中,有一种检查空指针的新方法:nullptr这是一个新关键字。它是可用的理想选择,因为它清楚地表明p是一个指针:

if( p != nullptr )

答案 1 :(得分:-1)

这些都是检查p是否不是0的方法;他们做同样的事情:

if(p)            // Short and simple.
if(p != 0)       // Easier to understand.
if(p != NULL)    // POINTERS ONLY.

在C ++ 11中,您可以使用这种“更安全”的方式来check if the pointer is NULL

if(p != nullptr)

如果要制作char s的“动态分配”数组,请执行以下操作:

char *p2 = new char[4];
strcpy(p2, "abc");

// Don't forget to delete!
delete[] p2;

更好的选择是使用更安全的C ++:

std::array<char, 256> p2 = {'b', 'b', 'c', 0};
p2[0] = 'a'; // "abc"

或者:

std::string p2 = "bbc";
p2 = "abc";
p2[0] = 'c'; // "cbc"

这会将p3设置为字符串"hello"

const char *p3 = "hello";

这会增加内存中p3个位置的位置:

// *p3 = 'h';

p3++;
// *p3 = 'e';

p3++;
// *p3 = 'l';

p3++;
// *p3 = 'l';

要了解你的原因:

char *p4 = 0;
char *p5 = NULL;

查看此问题:Setting variable to NULL after free


我不会在C ++中使用static char*,但这是一个愚蠢的例子:

void sc(char *first = NULL)
{
    static char *p = NULL;

    if(p == NULL)
        p = &first;

    // p will never change (even when sc() ends) unless you set it to NULL again:
    // p = NULL;
}

char initial_value;
sc(&initial_value);
sc();
sc();
// ...