zoukankan      html  css  js  c++  java
  • 20180601 指针

    下面程序应该输出多少?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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;
    }
    POINTERSTEW
    FERSTEPOINW
    NEWPOINTW
    POINTFIREST

    正确答案: A   你的答案: C (错误)

    虽然项目中不这么用,但是要答对还是需要扎实的基础知识。
    其中考了指针应用,隐含中也考了运算符优先级的问题(*--*++cpp+3)
    具体运算符优先关系记忆这个写的比较好http://blog.csdn.net/skywalker_leo/article/details/6237222
    c是一个指针数组,每个数组单元都是一个指针,指向一个字符创。
    即c[0]="ENTER"......c[3]="FIRST"
    由于[]与*运算本质几乎是一致的,以下用[]替换*更容易理解。
    c[i]=*(c+i)
    c和c+i都是char*[]类型,它可以退化成char**类型,它正好是一个char**数组
    cp[0]=c+3 .....cp[3]=c
    引用后cp[0][0]=*(c+3)=c[3]="FIRST"
    cp是char**[]类型,它可以退化成char***类型,正好与cpp类型一致。
    1>++ccp的值是cp+1  *++p=*(cp+1)=cp[1]  **++p=*(cp[1])=c[2]="POINT"
    2>运算符优先级决定运算先后关系
    ++ccp的值是cp+2 *++p=*(cp+2)=cp[2]=c+1 --*++p=c *--*++p=*(c+0)=c[0]="ENTER"再+3字符串指向"ER"
    3>cpp的值为cp+2 cpp[-2]=*(cpp-2)=*(cp+2-2)=cp[0]=c+3再引用*(c+3)=c[3]="FIRST"字符串指到"ST"
    4>cpp的值没变,cpp[-1]=*(cpp-1)=*(cp+2-1)=cp[1]=c+2再[-1]得*(c+2-1)=c[1]="NEW",+1字符创指针指到"EW"
    翻来覆去,记得这个换算关系式即可,c[i]=*(c+i)。
    首先看 C,CP,CPP 之间的存储关系
     
     
    计算各个表达式结果的过程如下图
  • 相关阅读:
    sharepoint具体错误提示
    体验魅力Cognos BI 10 系列,第1 部分: 第一次安装
    Moss、SharePoint数据库迁移问题(转)
    XML解析
    JDBC进阶
    JDBC的操作
    项目Contact开发中遇到的,引以为戒
    递归练习
    递归详解(四)
    递归详解(三)
  • 原文地址:https://www.cnblogs.com/kxzh/p/9150869.html
Copyright © 2011-2022 走看看