3

我只是在处理数组时尝试使用指针,我对 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 个字母再次写入。我的理由是,在写入 char 字符串后,增量运算符立即将索引带到下一个字母,然后才能到达空终止符。我不明白为什么在第一次输出字符串后空终止符不会导致循环返回 false 否则。这是正确的推理吗?如果我得到数组和指针之间的这种关系,有人可以解释一下吗?

4

1 回答 1

6

cout有一个operator<<用于打印整个字符串的重载char*(也就是说,打印每个字符直到遇到 a 0)。相比之下,'s的char重载只打印一个字符。这就是本质上的区别。如果您需要更多解释,请继续阅读。coutoperator<<

当您在递增指针后取消引用指针时,您发送cout的是char, not and 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++;

Randy\0
^ pszString points here

// this means increment pszString and pass the old pointer to cout's operator<<
cout << pszString++;

// so cout prints Randy, and now pszString points
Randy\0
 ^ here

cout << pszString++;

// cout prints andy, and now pszString points
Randy\0
  ^ here

// and so on

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

于 2011-08-19T19:31:32.770 回答