指针、++、--前置后置不同运算

来源:互联网 发布:蓝牙连接软件 编辑:程序博客网 时间:2024/05/17 06:51

题: 

char *c[] = {"ENTER","NEW","POINT","FIRST"}; 
char**cp[] = {c+3,c+2,c+1,c}; 
char***cpp = cp; 
printf("%s\n", **++cpp); 
printf("%s\n", *--*++cpp+3); 
printf("%s\n", *cpp[-2]+3); 
printf("%s\n", cpp[-1][-1]+1);

 图:


 

 

1、**++cpp(红线)

    首先++cpp,cpp指向cp首地址,++指向c+2前的地址,先得到数组cp的第二个元素c+2,解引用*++cpp也就是*(c+2),指向数组c的第三个地址,再解引用*(*(c+2))就得到POINT。

2、*--*++cpp+3(绿线)

    根据符号优先级,首先是++cpp,由于1里面cpp已经指向了数组cp的第二个元素地址,所以这里++cpp就指向数组cp的第三个元素地址;然后解引用*++cpp得到数组cp的第三个元素c+1,然后--*++cpp相当于--(c+1),也就是得到c,而c里面存的是数组c的首元素地址,再解引用*c得到数组c的首元素ENTER,加3就从E开始向后数3,就是E输出就是ER。

3、*cpp[-2]+3(蓝线)

    上面1和2的操作之后,cpp目前指向数组cp的第三个元素地址,cpp[-2]就相当于指向数组cp的第一个元素地址,解引用*cpp[-2]得到c+3所指的FIRST,加3就从F开始向后数3就是S,输出就是ST。

4、cpp[-1][-1]+1(橘黄色线)

    此时cpp 指向数组cp的第三个元素c+1,cpp[-1]指向数组cp的第二个元素c+2,再执行cpp[-1][-1]相当于(c+2)[-1],也就是*(c+2-1),也就是*(c+1),得到数组c的第二个元素地址,是NEW地址,加1从N往后数1就是EW地址,输出EW。