具有空终止符的指针 - 数组交互

时间:2011-08-19 19:27:27

标签: c++ arrays pointers pointer-arithmetic

我在处理数组时只是尝试使用指针而且我对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,否则。这是正确的推理吗?有人可以解释我是否在数组和指针之间得到这种关系?

1 个答案:

答案 0 :(得分:6)

cout operator<<重载char*以打印整个字符串(即打印每个字符,直到遇到0)。相比之下,char cout的{​​{1}}重载仅打印一个字符。这基本上就是这里的差异。如果您需要更多解释,请继续阅读。

如果在递增指针后取消引用指针,则会发送operator<<一个coutchar,因此会打印一个字符。< / 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++;

我很高兴你用这种方式试验指针,它会让你真正知道发生了什么,不像许多程序员会做任何事情来摆脱不得不处理指针。