int *p = (int *)0x12ff 7c;(我的編譯器分配的記憶體位址)
*p = null;
在執行完第二條**之後,發現p的值變為0x00000000了。我們都知道給指標指向的空間賦值,不會改變指標的值。難道這個結論有錯,我繼續試了下。
int i = 10;
int *p = (int *)0x12ff7c;
*p = null;
此時指標p的值並未改變,此時結果正確,我又測試了,
char ch = 10;
char *p = (char *)0x12ff7c;
*p = null;
此時指標p的值沒變,可當我刪除第一行的時候,指標的值又變了,這裡的p 的值並未變成0x00000000,而是變成了0x0012ff00。說到這裡,是不是編譯器的乙個bug?作者認為這是編譯器的bug。然而我重新除錯了一下,發現了問題。
這並不是編譯器的bug,而是結果卻是如此。且聽我慢慢分析。
對於第乙個例子,&p = 0x0012ff7c, p = 0x0012ff7c,也就是說指標p指向的是它本身。
p 首位址是0012ff7c
高位址 00
12
ff
低位址 7c
由於p指向的是本身,也就是說改變指標p指向的空間的值,就等價於改變p的值,此時p變為0x00000000。照這樣說,第三個例子應該也為0x00000000,為什麼是0x12ff00。同志別急嗎。此時p也指向本身,但p指向的資料型別是char型,而p佔4 bytes,此時 *p = null語句只能改變p的低位址的值,即7c變為00,答案就是0012ff00。
結論: 從這個問題可以知道,在一般情況下,改變指標指向的空間的值,是不會改變指標的值,除非指標指向的是它本身。
陳正衝老師對於c語言野指標的解釋
那到底什麼是野指標呢?怎麼去理解這個 野 呢?我們先看別的兩個關於 野 的詞 野孩子 沒人要,沒人管的孩子 行為動作不守規矩,調皮搗蛋的孩子。野狗 沒有主人的狗,沒有鍊子鎖著的狗,喜歡四處咬人。對付野孩子的最好辦法是給他定一套規矩,好好管教。一旦發現沒有按規矩辦事就好好收拾他。對付野狗最好的辦法就是...
陳正衝老師講c語言之const關鍵字
1.const 關鍵字也許該被替換為 readolny const是constant的縮寫,是恆定不變的意思,也翻譯為常量 常數等。很不幸,正是因為這一點,很多人都認為被const修飾的值是常量。這是不精確的,精確的說應該是唯讀的變數,其值在編譯時不能被使用,因為編譯器在編譯時不知道其儲存的內容。或...
C語言深度剖析
c語言深度剖析 1,編譯器通常不為普通const唯讀變數分配儲存空間,而是將他們儲存在符號表中,使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率更高。2,const int p p可變,p指向的物件不變。int const p p可變,p指向的物件不可變 int const p ...