(C語言)地址為什麼要變成指標才能賦值給指標變數呢?Leslie chin2020-04-06 00:52:28

我這個寫的有問題,我是把指標當成了指標變數的同義詞或者縮寫來討論的。如果按照“指標即地址”,那麼指標與地址是絕對同義詞,指標變數則是儲存一個指標的變數。大家見笑了

************(分割線)*********

這個問題問得好,估計受這麼一句話;困惑,

“指標即地址”,然後你以為“指標”與“地址”一樣了,困惑在為什麼還要“變”。

其實吧,“指標”這個東東應該來說是存了一個地址,而不是“指標本身就是地址”。

int *point;

把point這個玩意看成一個變數,假設佔了4個Byte,這個point這個東東在這4個Byte裡面存了一個數,假設這個數是一個32位整形,這個數才是真正的“地址”。

所以啊,“指標即地址”稍微改一下,“指標裡面存的東西才是地址”。

point就是指標(可能存一個32位整數),*point才是這個地址存的東東,加上*是把point裡面存的32位整數拿出來,並找到這個地址吧。(大概是,我也不太會。)

所以啊,假設有個地址是

int *point;

1111111111……1111111111(32個1),

想把這個地址用一個指標變數存起來,

point 裡面放 11111111……11111111(32個1),

就把point那4個位元組的記憶體空間用32個1填充啦。(當然是假設32個1,可能會變,我也不懂。)

如果你在1111111……111111這個位置放了個整數5,那麼

int a = *point ;

就是把point那4個位元組裡面存的32個1拿出來,找到這個地址並把這地址存放的int型別的值賦值給a。

如果是

*point = 6;

就是把point指向的32位地址儲存的資料改成6。

這麼說來,回答上面問題的話,應該是用一個指標(變數)來記錄地址,這個記錄著一個地址的變數叫“指標變數”。

不知道樓主明白吧,當然我也可能錯了,書籍不在身邊,可以看《C和指標》,我看過覺得最清楚明白講指標的書。哈哈哈。

各位大哥,有錯誤一定告訴我啊,我也是新手。

(C語言)地址為什麼要變成指標才能賦值給指標變數呢?知乎使用者2020-04-06 02:30:06

因為不能把int型別的變數直接賦值給指標。

C標準沒有規定int到指標型別的隱式轉換,儘管有的編譯器可能實現了這一點,但應該會丟擲一個warning。同樣的,不同指標型別之間也不能互相隱式轉化,除了void*等特例。

當你寫出(int*)0x1234這樣的程式碼時,你並沒有對0x1234這片地址中儲存的物件進行任何操作。這裡的0x1234只不過是一個十六進位制的整數字面量而已。

(C語言)地址為什麼要變成指標才能賦值給指標變數呢?許中2020-04-06 13:54:27

簡單的說,主要是為了幫助程式設計師減少出錯。如果編譯器不檢查數值型別而是直接把一個int數值轉換為地址並且不加警告,那麼很可能因為程式設計師的一個粗心(把一個數值錯誤的賦值給了一個地址)產生災難性的後果而且幾乎無法發現。如果象現在這樣必須顯式的呼叫強制型別轉換語句再賦值,意味著程式設計師對這樣的轉換作了確認,最大可能避免了此類粗心錯誤。

(C語言)地址為什麼要變成指標才能賦值給指標變數呢?星風雪月2020-04-07 19:43:43

首先要理解型別,不要逃避型別系統,把未知的型別跟已知的混淆。

指標這一型別,不是像整數、字元這樣的“自然型別”,所以初學者總是理解不了。

指標是計算機程式中獨有的型別,它的值告訴CPU,CPU應該往記憶體的什麼位置去尋找變數。

所以記憶體地址就是指標的值,但整數是數字而不是記憶體地址。

理解了型別再去理解強制轉換,強制轉換相當於是否定計算機所認為的型別,重新解釋它。告訴計算機“我不要你覺得,我要我覺得。”

所以題主所說的不是整數“變成”了記憶體地址,而是你硬說它是地址。就像是指鹿為馬,但計算機傻,只能乖乖聽人話,所以它也只能把鹿當馬騎。

(C語言)地址為什麼要變成指標才能賦值給指標變數呢?szouc2020-04-07 20:02:19

C語言中所有資料都具有兩個屬性,一個是值,另外一個是型別。即使值相同如果型別不一致也是不同的資料。

有一道題: 小區內有一隻狗叫Oscar,有一隻貓也叫Oscar,大晚上有人喊:“Oscar”,請問他找誰?

// Oscar:“找我幹嘛?”

地址是一個整型資料,而指標具有“指向物件型別的指標”的型別。(因此即使指標的值相等,不同型別的指標也不是一種資料,就像同是整型的 short 1 和 int 1)

“本身就有型別的資料又作為其他型別資料的值使用”,這句話可能帶來了一定的困擾。確實從人類的感知習慣和基本型別的處理方法層面很難理解,但是指標是符號層面的內容。把上句話分解成兩個資料操作,“對指標的值的操作”和“對指標本身的操作”,然後對應兩個符號: * 和指標所指向物件的型別。

還有一道題: 小區內有一隻狗叫Oscar,有一隻貓叫奧斯卡,大晚上有人喊:“奧s卡”,請問他找誰?