C指針筆試題,蛋疼的多重指針運算,譚浩強的陰影

對指針的概念清晰的話,作這種題只要耐心就行,然而看這種題就煩(被同窗吐槽爲譚浩強的陰影……草泥馬這種C風格題有意義嗎?出題人腦子被門夾了?並且C++11都不支持字面值字符串直接轉換成char*了。好吧,就算要大罵一通出題人,該作仍是作。)數組

分析三行初始化代碼:3d

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

cp[0]=c+3,即cp[0]=&c[3],所以blog

二、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]引用

三、cpp指向cp[0]im

如今到這裏來一個個分析語句img

一、**++cpp移動

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

指針+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]!

二、*--*++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]!

三、*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]!

四、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

 

呼,作完了仍是想罵一句草泥馬=_,=

相關文章
相關標籤/搜索