發現一道很有意思的題,跟大家分享一下 C指標

2021-10-17 15:47:16 字數 1730 閱讀 7713

1.原題

#include

#include

intmain()

;char

** cp=

;char**

* cpp = cp;

printf

("%s\n",*

*++cpp)

;printf

("%s\n",*

--*++cpp +3)

;printf

("%s\n"

,*cpp[-2

]+3)

;system

("pause"

)return0;

}

2.過程這題考的是c語言中的指標的應用,我們可以把它的記憶體圖畫出來

請注意下標的位址,這四個字串在記憶體中的儲存位置是隨機的,並不一定會連起來。

加下來畫出 char* c[ ],由於char* 是乙個一級指標,所以c[ ]中儲存的就是這四個字串的位址,假設從 c [ ] 的首位址為 0x2000

接下來是 char** cp [ ],這個中的位址是按照**中的 c + 3 ,c + 2 , c + 1 , c的順序排列的

下來是 char*** cpp , 這個根據**中的內容,這個**指標中存放的是二級指標的首元素的位址,所以有

下來開始解答**

printf

("%s\n",*

*++cpp)

;

這條**中存在乙個優先順序的問題,一般在沒有括號的情況下是從右往左看的,所以我們首先要看的是 ++cpp 。由上面的分析得到, cpp 現在裡面存放的是 二級指標 cp 的位址,所以 ++cpp 也就是給 0x3000 位址 +4 ,因為指標在 32 位的系統中統一佔 4 個位元組,所以 ++cpp 後 ,就變成了 0x3004 ,在進行解引用,所以這一條**列印出來的是 " point"

printf

("%s\n",*

--*++cpp +3)

;

這條**與上一條差不多,只不過出現了後面的 + 3 ,按照優先順序原則,先從 ++cpp 看起,由於 cpp 中的內容已經變成 0x3004,所以這裡再 ++ 的話,就會變成 0x3008 ,解引用一次,對應得到的是 0x3008中對應的內容,也就是 0x2004,再 – ,就得到了 0x2000,再解引用,就得到了 字串" enter " ,後面的 +3 是在 「enter」的首位址上加 3 ,也就是指標往後走三個位元組,從第四個位元組開始列印,一直到遇到 \0 停止,所以這條**列印出來的內容應該是 「er」

printf

("%s\n"

,*cpp[-2

]+3)

;

這條**顯示對 cpp 進行中的內容進行 -2 操作,這裡的 *cpp[-2] 也可以表示成 *(cpp - 2),請注意,這裡的 - 2 操作並不會改變 cpp 中的值,cpp -2 得到的是 0x3000,解引用後得到 0x200c,其中的內容是 0x400,再 + 3 表示將 0x400中的內容往後移三個位元組再列印,所以列印出來的就是 「st」

一道很有意思的演算法題

已知陣列a n 由陣列a n 構造陣列b n 構造方法如下 product a 0 a 1 a n b i product a i 0 i n 要求如下 1.不能使用除法。2.不能宣告新的變數,不能申請新的記憶體。3.時間複雜度為o n 簡單分析 1.不能使用除法的話必須使用累乘。2.由於時間複雜度...

分享一道很有意思的演算法題目

題目 有100盞燈和100個開關,剛開始的時候等全是滅的,someone第一輪按下所有開關 開的按一下變滅,滅的按一下變開 第二輪隔乙個按一下 偶數個按 第三輪隔2個 3的倍數個按 求第100輪之後有多少盞燈是亮的。本題有三個層次的解法 第乙個層次是暴力解法,即迴圈100輪,分別記錄每一盞等的狀態,...

一道很有意思的題目

先列出 然後再開始解析 include stdafx.h include using namespace std class a class b public a void seta a data,int idx int tmain int argc,tchar argv for int i 0 i...