zoukankan      html  css  js  c++  java
  • 三级指针:百度试题

    char *c[] = {"ENTER","NEW","POINT","FIRST"}; 

    char **cp[] = { c + 3 , c + 2 , c + 1 , c}; 

    char ***cpp = cp; 

     int main(void) 

    {     

        printf("%s",**++cpp); 

        printf("%s",*--*++cpp+3);   

        printf("%s",*cpp[-2]+3);     

        printf("%s ",cpp[-1][-1]+1); 

          return 0; 

    c是一个指针数组,一个数组,元素是char*类型的指针,值分别是那些字符串(的首地址)

    c[0] = "ENTER"

    c[1] = "NEW"

    c[2] = "POINT"

    c[3] = "FIRST"

    而[]和*是本质一样的运算,即c[i]=*(c+i)

    c和c+i都是char *[]类型,它可以退化成char **类型,

    再看cp,它正好是一个char **的数组,来看它的值:

    cp[0] = c + 3

    cp[1] = c + 2

    cp[2] = c + 1

    cp[3] = c

    再引用一次看得清楚些 cp[0][0]=c[3]="FIRST",

    etc cp是char **[]类型,它可以退化成char ***类型,

    看最后的cpp,它正是char ***类型,它是一个指针变量,和上面两个不同,上面两个是数组。

    1、printf("%s",**++cpp); ++cpp 的值是cp+1,引用一次后是cp[1]再引用是*cp[1]=c[2]="POINT",第一句的输出

    2、printf("%s",*--*++cpp+3); 再++cpp 的值是cp+2,引用一次是cp[2]=c+1,再对这进行--,减后是c再引用是c[0]="ENTER"再+3,字符串指针指到"ER",输出是"ER"

    3、printf("%s",*cpp[-2]+3); 这时cpp的值是cp+2,cpp[-2]=*(cpp-2)=*(cp+2-2)=cp[0]=c+3,再引用是c[3]="FIRST",+3 字符串指针指到"ST",输出是"ST"

    4、printf("%s ",cpp[-1][-1]+1); cpp还是cp+2,cpp[-1]=*(cpp-1)=*(cp+2-1)=cp[1]=c+2,再[-1]得*(c+2-1)=c[1]="NEW",+1字符串指针指到"EW",输出是"EW"

    本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-10/73240p2.htm

  • 相关阅读:
    Git 9. 远程仓库
    Git 8. 删除文件
    Git 7. 撤销修改
    # 并发编程 -进程理论-进程的方法
    socket 上传 -- 异常处理--UDP协议 --自定义socket #29
    socket(套接字)
    面向过程补充 网络编程 #27
    ATM
    选课系统 -- # 25 -26
    面向对象高级 1.反射 2.元类 # 24
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/3387510.html
Copyright © 2011-2022 走看看