二级指针探讨
在周朝的時候,有一個觀念很有意思,就是 “我上級的上級 不是我的上級”,那時候,周王 要下達某個指令給全國百姓,只能通過 各個分封的諸王,然后 諸王再下達命令給自己的國民,如果某個諸王如果不聽周王的話,那周王其實 也一點辦法沒有的。所以 ,周王想要指揮某個諸侯國的臣子,必須通過這個諸侯國的國君。
那么 回到二級指針的話題,程序員想要 操作某段內存,必須通過 一級指針,這是必然的,但是如果現在我像周王一樣了 ,無法直接下達命令給一級指針(臣子),只能通過 國君即二級指針來操作,因為我也并不知道這個臣子被這個小國君藏哪里了。
因此 可以這樣理解:
周王要找某個臣子 做事的過程是:
- *國君 ---> 臣子的 位置
- *臣子的位置 --->吩咐之
直接的兩次 解引用國君就可以直接指揮臣子了
- **國君 --->指揮臣子
當然,如果 你連國君都不知道 在哪里,你就得問 你身邊的 太監了,那就是 三級指針的事兒了。
這種聯想式層級式的 索引,在C語言中,就是 多級指針。
這個例子 故意不總用地址的概念,而是用了指揮、操縱相關的詞,是希望我們不要總把指針和地址關聯,解引用指針的目標是為了操作它所指代的內存區域。
比如,這個周王 總算找到了這個臣子,干什么呢,其實 ,是為了讓他來自己身邊做太監。
好了,二級指針的概念 算是 明白了,那怎么用呢?
還是 把 那個想做太監的臣子叫來,他會這樣上達天聽:先將自己的 駐地告訴 自己的國君,然后這個國君再把自己的分封之地告訴周王,(當然,為什么不直接告訴周王這個臣子的具體位置呢,因為 國君 覺得自己的臣子要自己管理,不能越過他這個二級指針。這個 和天朝的某些制度還是很像的)。
在這個例子里,我們可以知道,解引用和 取地址 是兩個相反的 過程。
解引用時,我們是 周王
取地址時,我們是 臣子
二者關聯,相輔相成,臣子做成太監這事才能 成真。
感覺自己寫了很多廢話....
理解了概念,我們 開始來 改造 大臣:
#include<stdio.h> int main(void) {char*position1 ="Courtier"; //身份象征,大臣char*position2 ="Eunuch"; //身份象征 ,太監char*person =position1; //目前是大臣printf("I am %s now,I am not happy!\n",person);//目前是大臣,他不開心char**king =(char**)(&person); //大臣將自己的住址告訴國君char**emperor = king ; //國君將自己的封地告訴 周王*emperor = position2 ; //周王實現對大臣的 太監改造printf("I am %s now!,waw ,I am happy!\n",person); //很高興的太監來了 }輸出如下:
I am Courtier now,I am not happy! I am Eunuch now!,waw ,I am happy!有人 說,干嘛要這么麻煩,自己直接切了不就行了么?額,自己把自己切了也是可以的:畢竟從代碼上看,直接person = position2,就行了。
但是從故事上看,這樣做 沒有得到皇家 周王的認可,所以行不通,因為野生太監不好當啊。
從代碼上看,使用場景也少了,因為 二級指針 多作為函數的參數 存在著,直接在main中玩二級指針,我還只在 我這個例子中用過。
畢竟,由周王親自動手凈身的太監 還是極少的,大部分都是凈身房函數做的嘛。
那么 作為 函數場景,我們 該怎么做呢:
int makeEunuch(char** person,char* position) {*person = position;return0; } int main(void) {char*position1 ="Courtier";char*position2 ="Eunuch";char*person = position1;printf("I am %s now,I am not happy!\n",person);char**king =(char**)(&person);char**emperor = king ;MakeEunuch(emperor,position2);printf("I am %s now!,waw ,I am happy!\n",person); }輸出與上面是一樣的,
將 太監改造工程函數化了,這在實際代碼中是 非常常見的。
那么 在改造函數中 ,直接改,可以么?看以下代碼:
int mayMakeEunuch(char* person,char* position) {person = position;return0; } int main(void) {char*position1 ="Courtier";char*position2 ="Eunuch";char*person = position1;printf("I am %s now,I am not happy!\n",person);char**king =(char**)(&person);char**emperor = king ;mayMakeEunuch(person,position2);printf("I am %s now!,waw ,I am happy!\n",person); }輸出的結果是:
I am Courtier now,I am not happy! I am Courtier now!,waw ,I am happy!看來,即便是明顯對這個person進行太監改造,他最后還是個大臣,其實 這才符合常理啊,知道周王 要拉他去做 太監,于是 ,在執行太監改造的時候,他拉了 個人冒名頂替他,玩起金蟬脫殼了,當然很高興啊。而凈身房確實將那個頂替的人 變成了太監,但是在 回到周王那里時,這個該死的 太監就死了,這與我們作為周王的愿景是相悖的,因為 ,我沒有得到我要的太監啊!記住金蟬脫殼這個成語,這是 函數 傳參的 全部事實。
可以另見 :從一段經典錯誤代碼說起——關于局部變量指針和函數傳參的問題分析
當然,這里 我也僅僅是通過這個例子 ,告訴大家二級指針的使用場景,至于說什么地址的地址啊,這個 我也知道啊,但是我沒有寫在這里,畢竟實在太抽象,有的人 連地址都抽象不出來。而地址這個概念其實 是 微機時代就有的產物,不知道計算機原理的人 實在難以消化,而現在,我選擇要么做周王,要么做太監。
轉載于:https://www.cnblogs.com/Stultz-Lee/p/6741191.html
總結
- 上一篇: 【转】ionic run android
- 下一篇: Docker入门(一) - 仓库、容器、