最近在重新學習《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到底有沒有被改變。