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]類型,數(shù)組a在作為等號的右參數(shù)時會降格成&a[0],因此cpp=&cp[0]
3、cpp指向cp[0]
現(xiàn)在到這里來一個個分析語句
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)個字節(jié)。
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的值!這一句執(zhí)行后cpp指向的是cp[1]!
2、*--*++cpp+3
注意+運算優(yōu)先級是低于*、&、前置++、前置--(這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的值!這一句執(zhí)行后cpp指向的是cp[2]!
3、*cpp[-2]+3
注意[]運算優(yōu)先級是高于*、&、前置++、前置--
這里回顧數(shù)組下標運算符[]: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的值!這一句執(zhí)行后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
總結
以上是生活随笔為你收集整理的C指针笔试题,蛋疼的多重指针运算,谭浩强的阴影的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript HTML DOM
- 下一篇: android-学习1 配置环境