何时使用指针引用操作符C++ 我目前正在学习C++。不在学校。使用书籍、教程和练习

何时使用指针引用操作符C++ 我目前正在学习C++。不在学校。使用书籍、教程和练习,c++,pointers,if-statement,while-loop,C++,Pointers,If Statement,While Loop,有一件事让我很困惑,我一直无法找到答案,那就是什么时候使用解引用操作符*作为指针。例如,从我目前正在阅读的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而没有去引用操作符,然后在whi

有一件事让我很困惑,我一直无法找到答案,那就是什么时候使用解引用操作符*作为指针。例如,从我目前正在阅读的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循环中的混合用法,但这是本书中让我困惑的最新例子。提前感谢你的帮助


小结:什么时候只使用指针的变量名而不使用解引用,什么时候将其与解引用一起使用。指针是一个变量,其值是另一个变量或对象的地址。我们说指针指向另一个对象

编写表达式时,cp表示指针变量*cp表示指针变量所持有地址的变量或对象

试着在你的头脑中清楚地记住指针和被指向的东西之间的区别。这是两件截然不同的事情,每个都有自己的生命周期和存储需求

因此,为了解决问题中的代码,如果cp正在测试指针。它是if cp!=nullptr,即指针是否已设置为指向某个位置?换句话说,指针当前是否持有另一个对象的地址


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

区别很简单,但需要练习才能习惯。从本质上讲,当您想要处理指针实际指向的对象(即实际位于指针末尾的对象)时,可以使用解引用操作符

例如,如果我有一个char*cp=get_string;,然后cp是指向字符数组中第一个字符的指针

像ifcp这样的检查就是检查指针是否为0,即指针是否指向NULL。在这种情况下,这可能很有用,因为get_string在成功时返回一个指向字符串的指针,或者在出错时返回NULL

相反,执行类似while*cp所说的操作,而cp当前指向的字符不是空字符\0,然后继续循环。在此上下文中,while循环可能类似于:

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

这是遍历字符数组的常用习惯用法。

我认为这样编写这两个测试不是一个好的实践。为了清楚起见,这正是你要问的问题,他们应该是:

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

这幅图解释了这个概念。

指针变量始终存储另一个变量的地址。对于数组,它存储数组中第一个元素的地址

解引用运算符是指由特定指针变量存储的地址中的值。 在上述示例中,指针变量ptr中存储的地址是1001*ptr应给出存储在地址位置1001中的值,该值是变量var ie 50的内容

总之,当您想要检查指针变量是否指向某个地址位置时,您可以在不使用解引用运算符的情况下使用该变量;当您想要处理存储在指针变量中的地址位置中的值时,可以将其与解引用运算符一起使用

在您的示例中,首先检查指针是否通过语句指向字符串

if(cp)
然后,它检查变量的内容,如果指针为非空,则可能检查stringby语句的结尾

while(*cp)

答案在您的代码注释中。@HAG,我不在学校,我正在努力学习,所以我不完全理解它的意思,但感谢您因为我不理解而否决了一位初学者。我想在这里发帖的目的是为了我需要帮助。你可能很容易理解这些评论的意思,但我相信当你刚开始的时候,事情在某些方面也很混乱。我没有投反对票!然而,我认为你可以通过简单的在线搜索找到答案。。在你的要求上,有大量的辅导可以帮助你。这可能就是你的问题被否决的原因…@HAG,那么我道歉。我做了谷歌搜索。尝试了一段时间,但找不到我的具体要求。这只是关于为什么使用指针和指针而不是引用的问题。我不知道为什么我因为问问题而被否决了。你为什么把指针放在括号里,把后缀增量放在外面?所以不去引用就是看它是否真的指向一个对象,去引用就是比较这个对象的实际值?@Matt这是对的。@Matt好吧,这取决于你对表达式做了什么之后要理解的是cp指的是指针,
*cp指指向的对象。这两件事都是实际价值。然后,您可以继续将这些内容与其他内容进行比较,或分配给它们,或进行加法或其他操作else@Matt你会在那行的哪一行加一个?@Matt我猜你的意思是auto*pbeg=ia.begin?如果是,则该行中没有解引用运算符。运算符只出现在表达式中,但*pbeg是一个声明符。符号在陈述词中的含义与在表达式中的含义不同。试着查阅你的学习材料,了解它关于声明的部分。还可以查看它是如何工作的,因为它与声明中的其他类型不同。我只是在学习不尝试制作程序。我正试图阐明基本原理。避免ifcp==NULL的冗余是惯例。这就像写ifcondition==True;我的意思是,第一个大小写检查指针是否为空,第二个大小写检查指针字符是否为空。如果使用空指针执行*cp,则会导致分段错误,因为它不是有效的内存地址。@gowarth我认为这取决于上下文和个人风格。对于初学者或代码片段来说,测试的内容可能并不明显,但在我看来,这仍然是一种很好的做法。@gowrath确实是多余的。但他写作是为了清晰。把事情说清楚可以澄清它们。谢谢你的帮助。