zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    Kali Linux软件更新日报20190622
    Maltego更新到4.2.4.12374
    Kali Linux又增加一个顶级域名kali.download
    Nessus提示API Disabled错误
    数据包分析中Drop和iDrop的区别
    快速识别Hash加密方式hashid
    识别哈希算法类型hash-identifier
    vue实现前端导出excel表格
    vue自动化单元测试
    Mock制作假数据
  • 原文地址:https://www.cnblogs.com/Harley-Quinn/p/7513077.html
Copyright © 2011-2022 走看看