c++ 指標,char*[]c,char**cp[],char***cpp
輸出:WORLD,LO,HI,EW
第一個printf:由於char***cpp,可以讀成cpp為一個指向char**型別的指標,並且初始化為cp,而cp是一個指標陣列,數組裡面儲存的型別為char**,也就是cpp指向cp[0],故*cpp=cp[0];因此++cpp使得cpp指向cp[1],故*++cpp=cp[1];而cp[1]是一個指向c[2]的指標,因此*cp[1] = c[2],故**++cpp=*cp[1]=c[2],故輸出WORLD; 第二個printf:由優先順序可得知,單目運算子高於算術運算子;而*和++是單目運算子,+是算術運算子,又cpp本身是指向的cp[1],故++cpp使得cpp指向cp[2],故*++cpp則為cp[2],而此時的cp[2]是一個指向c[1]的地址,故對指向c[1]的指標cp[2]進行--,故使得cp[2]指向的是c[0],故*--*++cpp+3=*--cp[2]+3=c[0]+3,而這裡的c[0],其實存放的是指向HELLO字串的指標故c[0]+3,使得該指標指向HELLO中的第二個L的位置,故輸入LO; 第三個printf:由於cpp目前指向的是cp[2],而cpp[-2]是等於*(cpp-2),而在第二個printf時cpp指向cp[2],則*(cpp-2) = cp[0](注:這裡cpp-2後,cpp本身的指標地址沒有改變,因此在第四個printf中,cpp依舊是指向cp[2]),又cp[0]是一個指向c[3]的指標,對cp[0]進行*運算,使得*cp[0]=c[3],故**(cpp-2)=*cpp[-2]=c[3],同時c[3]是一個指向SAYHI的指標,故c[3]+3,使得指向H的位置,故輸出HI; 第四個printf:在第三個printf並沒有改變cpp的地址,故cpp依舊是指向cp[2],又cpp[-1][-1]+1=*(*(cpp-1)-1)+1,故cpp-1,則cpp指向cp[2],故*(cpp-1)=cp[1];此時的cp[1]是一個指標,指向c[2],故cp[1]-1是從指向c[2]的指標地址-1,故是指向c[1],則*(*(cpp-1)-1)=*(cp[1]-1)=c[1],故cpp[-1][-1]+1=*(*(cpp-1)-1)+1=c[1]+1,此時的c[1]同樣是一個指標,故c[1]+1是指向NEW中的E的位置,故輸出EW。