2016-09-30 139 views
-1

我目前正在学习C++。不在学校。使用书籍,教程和练习。何时使用解除引用运算符指针C++

有一件事让我感到困惑,而我一直无法追踪答案是何时使用解除引用操作符(*)作为指针。例如,从C++底漆,我目前正在读:

char *cp = get_string(); 
if (cp) /* ... */ // true if the pointer cp is not zero 

while (*cp) /* ... */ // true if *cp is not the null character 

我不明白为什么if语句是没有引用操作只是CP,然后在while语句,它使用了引用操作。还有其他一些例子,如for循环中的混合使用,但这是本书中最新的例子,使我感到困惑。在此先感谢您的帮助。总结:什么时候你只需要使用指针的变量名而不需要取消引用,以及何时使用它的引用。以及如何区分差异。

+4

答案就在你的代码中的注释.. – HazemGomaa

+0

@HAG ,我不在学校,我正在努力学习,所以我不完全理解它的含义,但是感谢对初学者的低调,因为我不明白。我认为这里张贴的目的是如果我需要帮助。你可能很容易理解这些评论意味着什么,但我确定当你第一次开始的时候,在某些方面也让人感到困惑。 – MKSnazzy

+0

我没有downvote!然而,我认为你可以通过简单的在线搜索找到答案..有大量的土族可以帮助你根据你的要求。这可能就是为什么你的问题是downvoted ... – HazemGomaa

回答

1

指针是一个变量,其值是另一个变量或对象的地址。我们说指针“指向”那个对象。

写入表达式时,cp表示指针变量。 *cp表示指针变量保存的变量或对象。

试着保持清晰的“指针”和“被指向的东西”之间的区别。这是两个截然不同的东西,每个都有自己的生命周期和存储需求。

因此,要解决您的问题中的代码,if (cp)正在测试指针。它是​​的简称,即指针是否设置为指向某处? (换句话说,指针当前是否保存另一个对象的地址?)

if (*cp)表示if (*cp != 0),它询问地址存储在指针中的对象的值(换句话说,对象被指向)。

+0

因此,没有取消引用就是看它是否实际指向一个对象,并且取消引用是比较该对象的实际值? – MKSnazzy

+0

@Matt这是正确的。 – gowrath

+1

@Matt好吧,这取决于你对表达式做了什么。要理解的是'cp'指向指针,'* cp'指向指向的对象。 (这两件事都是“实际价值”)。然后,你可以继续比较某些东西,或者分配给他们,或者添加或者其他任何东西 –

0

区别很简单,但需要习惯习惯。实质上,解引用操作符用于处理指针实际指向的内容(即实际位于指针末尾的内容)。

因此,例如,如果我有一个char *cp = get_string();,那么cp是一个指向字符数组中第一个字符的指针。

检查类似if(cp)的内容是检查指针是否为0(即指针是否指向NULL)。如果get_string()成功,则返回指向字符串的指针,如果出错则返回NULL

相比之下,类似while(*cp)这样的说法是,虽然cp指向的字符不是0(空字符\ 0),然后继续循环。在此背景下,while循环可能看起来像:

while(*cp) { 
    // process letter currently pointed to by cp 
    cp++; // advance cp to point to the next character. 
} 

这是一个常见的成语通过一个字符数组进行迭代。

+0

为什么你把指针放在括号里,后缀增量在外面? – MKSnazzy

0

我不认为像这样写这两个测试是好的做法。为了清楚起见(这是你问的问题)它们应该是:

if(cp == nullptr) // or `cp == NULL` 
    ... 
if(*cp == '\0') 
    ... 
+0

我只是在学习不想制作一个程序。我试图理解基本面。 – MKSnazzy

+0

约定避免'if(cp == NULL)'冗余。这就像写'if(condition == True)';它被认为是过度的。 – gowrath

+0

@Matt我的意思是,第一种情况检查指针_的无效性,第二种情况检查指向字符的无效性。如果你使用空指针来执行'* cp',你会导致分段错误,因为它不是有效的内存地址。 –

1

此图解释了这个概念。 enter image description here

指针变量总是存储另一个变量的地址。在数组的情况下,它将第一个元素的地址存储在数组中。

解引用操作符引用由特定指针变量存储的地址中的值。 在上面的例子中,存储在指针变量ptr中的地址是1001. *(ptr)应该给出存储在地址位置1001中的值,该地址位置是变量var的内容,也就是50.

总之,要检查指针变量是否指向某个地址位置,如果使用不带解除引用操作符的变量,并且想要处理存储在指针变量中存储的地址位置中的值,请将其与解除引用运算符

在你的例子中,首先检查指针是否通过语句指向一个字符串

if(cp) 

然后,它检查是否变量的内容它的指针是非零(可能是为了检查字符串的结尾)由语句

while(*cp) 
+0

谢谢你的帮助。 – MKSnazzy