c – 具有空终止符的指针 – 数组交互
作者:互联网
我只是在处理数组时尝试使用指针,而且我对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,否则.这是正确的推理吗?有人可以解释我是否在数组和指针之间得到这种关系?
解决方法:
cout有一个运算符<< char *的重载以打印整个字符串(即,打印每个字符直到遇到0).相比之下,cout运算符的char重载<<只打印一个字符.这基本上就是这里的差异.如果您需要更多解释,请继续阅读. 当您在递增指针后取消引用指针时,您将向cout发送一个char而不是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
我很高兴你用这种方式试验指针,它会让你真正知道发生了什么,不像许多程序员会做任何事情来摆脱不得不处理指针.
标签:pointer-arithmetic,c,arrays,pointers 来源: https://codeday.me/bug/20190826/1734026.html