我在处理数组时只是尝试使用指针而且我对C ++处理数组的方式感到有点困惑。以下是我写的相关代码:
//declare a string (as a pointer)
char* szString = "Randy";
cout << "Display string using a pointer: ";
char* pszString = szString;
while (*pszString)
cout << *pszString++;
首先,当我尝试使用cout来编写“pszString”中的内容时(没有取消引用)我看到它给了我字符串时有点惊讶。我只是假设它是因为我给指针一个字符串而不是一个变量。
真正引起我注意的是,当我从行cout << *pszString++;
中删除星号时,它打印出“Randyandyndydyy”。我不确定为什么它会写入数组然后再用1个字母再写一次。我的理由是,在写入字符串后,增量运算符会立即将索引带到下一个字母,然后才能到达空终止符。我不明白为什么null终止符不会导致循环在第一次输出字符串后返回false,否则。这是正确的推理吗?有人可以解释我是否在数组和指针之间得到这种关系?
答案 0 :(得分:6)
cout
operator<<
重载char*
以打印整个字符串(即打印每个字符,直到遇到0
)。相比之下,char
cout
的{{1}}重载仅打印一个字符。这基本上就是这里的差异。如果您需要更多解释,请继续阅读。
如果在递增指针后取消引用指针,则会发送operator<<
一个cout
,不和char
,因此会打印一个字符。< / p>
所以char*
就像在做
cout << *pszString++;
当你不取消引用指针时,你发送的是cout << *pszString;
pszString = pszString + 1;
所以char*
打印整个字符串,你正在移动它的开头通过循环在每次迭代中用一个字符串起来。
所以cout
就像在做
cout << pszString++;
cout << pszString;
pszString = pszString + 1;
cout << *pszString++;
Randy\0
^ pszString points here
// this means increment pszString and send cout the character at which pszString *used* to be pointing
cout << *pszString++;
// so cout prints R and pszString now points
Randy\0
^ here
// this means increment pszString and send cout the character at which pszString *used* to be pointing
cout << *pszString++;
// so cout prints a and pszString now points
Randy\0
^ here
// and so on
cout << pszString++;
我很高兴你用这种方式试验指针,它会让你真正知道发生了什么,不像许多程序员会做任何事情来摆脱不得不处理指针。