c++ 指针,char*[]c,char**cp[],char***cpp

来源:互联网 发布:解方程 计算机算法 编辑:程序博客网 时间:2024/06/08 13:15

输出: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。

原创粉丝点击