• C指针笔试题,蛋疼的多重指针运算,谭浩强的阴影


    对指针的概念清晰的话,做这种题只要耐心就行,然而看这种题就烦(被同学吐槽为谭浩强的阴影……草泥马这种C风格题有意义吗?出题人脑子被门夹了?而且C++11都不支持字面值字符串直接转换成char*了。好吧,就算要大骂一通出题人,该做还是做。)

    分析三行初始化代码:

    1、c[0]指向"HELLO",c[1]指向"NEW",c[2]指向"WORLD",c[3]指向"SAYHI"。

    cp[0]=c+3,即cp[0]=&c[3],因此

    2、cp[0]指向c[3],cp[1]指向c[2],cp[2]指向c[1],cp[3]指向c

    cpp=cp,cp类型是char**[4]类型,数组a在作为等号的右参数时会降格成&a[0],因此cpp=&cp[0]

    3、cpp指向cp[0]

    现在到这里来一个个分析语句

    1、**++cpp

    ++cpp,即cpp=cpp+1  【改变了cpp的值】

    指针+1是怎么运算呢?这里我还卡住了

    举例,int a[] = { 1,2,3 }; int* p = a; p++;  这里p是int*的指针,p++就指向了a[1],相当于p指向的地址向后移动了sizeof(*p)个字节。

    OK,cpp指向cp[0],++cpp就是cpp=&(cp[0]+sizeof(*cpp))即cpp=&cp[1];

    接着就是2次解引用,*++cpp就是*(&cp[1])也就是cp[1],**++cpp就是*cp[1]=*(&c[2])即c[2],结果是

    WORLD

    注意!这里的运算改变了cpp的值!这一句执行后cpp指向的是cp[1]!

    2、*--*++cpp+3

    注意+运算优先级是低于*、&、前置++、前置--(这4个同级)。

    ++cpp = &cp[2]   【改变了cpp的值】

    *++cpp = *(&cp[2])即cp[2]

    --*++cpp = --cp[2] = &(c[1]-sizeof(c[1])) = &c[0]。

    *--*++cpp = *(&c[0]) = c[0],最后c[0]+3

    LO

    注意!这里的运算改变了cpp的值!这一句执行后cpp指向的是cp[2]!

    3、*cpp[-2]+3

    注意[]运算优先级是高于*、&、前置++、前置--

    这里回顾数组下标运算符[]:int a[] = { 1,2,3 }; int p = a[1]; 即int p = *(a + 1)

    cpp[-2] = *(cpp-2) = *&(cp[2]-2*sizeof(cp[2])) = *&cp[0] = cp[0]

    *cpp[-2] = *cp[0] = *(c+3) = c[3]

    *cpp[-2]+3即

    HI

    注意!这里的运算并未改变cpp的值!这一句执行后cpp指向的是cp[2]!

    4、cpp[-1][-1]+1

    cpp[-1] = *(cpp-1) = *&(cp[2]-sizeof(cp[2]) = *&cp[1] = cp[1]

    cpp[-1][-1] = *(cp[1]-1) = *(c+2-1) = *(c+1) = c[1]

    cpp[-1][-1]+1 = c[1]+1即

    EW

    呼,做完了还是想骂一句草泥马=_,=

  • 相关阅读:
    Idea启动多服务时的Dashboard展示
    通过maven动态配置spring boot配置文件
    辅域抢夺五大角色命令
    H3C交换机堆叠技术
    KMS激活专用:所有Windows版本的GVLK密钥对照表
    Windows Server 2012从Evaluation版转成正式版
    u盘装系统无法引导
    [调优]彻底解决RDP连接过程缓慢的问题
    [排错]无法初始化 vGPU“grid_p40-1q”的插件“/usr/lib64/vmware/plugin/libnvidia-vgx.so”
    Virtual Apps and Desktops 7 1912 LTSR集成DB迁移到SQL Server 2016 AlwaysOn生产环境
  • 原文地址:https://www.cnblogs.com/Harley-Quinn/p/7513077.html
Copyright © 2020-2023  润新知