标签:
最近在重新学习《C和指针》,指针那一章里面的一个例子——在一串字符串中查找特定的字符:版本2中有一句看不太明白,*(*string)++,于是写程序测试、琢磨了一下。
测试程序这样:
#include <stdio.h> int main() { char str1[] = "ABCD"; char str2[] = "EFGH"; char *pStrArray[2] = { str1, str2 }; char **pStr1 = pStrArray; char **pStr2 = pStrArray; (*pStr1)++; *pStr2++; printf("%c ", **pStr1); printf("%c ", **pStr2); getchar(); }
VS编译运行,最后的打印效果:B E
第二个好理解,第一个结果却一下子想不明白,当时的思维误区是这样的:
执行(*pStr1)++之后只有*pStr1改变了,pStr1本身并没有改变,猜想**pStr1的输出应该是A才对。
现在想通了,pStr1确实没有被改变,pStr1里面存的是pStrArray[0]的地址,而pStrArray[0]存的是str1[0]的地址,当(*pStr1)++被执行的时候,即等价于pStrArray[0]++,此时pStrArray[0]指向str1[1],所以**pStr1的输出为B。
进入思维误区的原因是*Str1等价于&pStrArray[0]并不明显,以为只是个临时变量,没有被保存就被丢弃了,还有就是怀疑执行后pStr1到底有没有被改变。
标签:
原文地址:http://www.cnblogs.com/Junction/p/4715053.html