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

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

原文地址:https://www.cnblogs.com/Harley-Quinn/p/7513077.html