(C語言)位址為什麼要變成指標才能賦值給指標變數呢?

時間 2021-05-06 02:43:39

1樓:szouc

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

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

// Oscar:「找我幹嘛?」

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

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

* 和指標所指向物件的型別。

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

2樓:星風雪月

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

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

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

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

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

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

3樓:冷月Des

首先在C語言中,指標的值就是位址,不過這個位址不是它自己的位址,而是繫結變數的位址。

intval=0

;int*p

=&val;

// int* p2_ = val; wrong synataxint*p2=

(int*)

val;

所以要初始化乙個指標,你得給乙個另外的位址。指標p = val位址,即int* p = &val。此時&val的值應該是 0x010FFBEC(假設在記憶體中這個位址儲存val)。

如果說你硬要把0給p2,你就需要告訴編譯器,0是乙個位址,同時你還要顯式的轉換將int 轉換為int,即int* p2 =(int*)val,當然我不建議你這麼做。

記住一點:在不考慮隱式轉換/顯式轉換/自定義資料型別的情況下,只有相同的資料型別才能賦值。要初始化乙個指標,你就必須給位址。

要給位址,對於乙個非指標變數,你要取位址,對於乙個指標變數,可以直接賦值。

4樓:許中

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

5樓:Leslie chin

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

「指標即位址」,然後你以為「指標」與「位址」一樣了,困惑在為什麼還要「變」。

其實吧,「指標」這個東東應該來說是存了乙個位址,而不是「指標本身就是位址」。

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語言指標初始化左邊是值,右邊是位址?

一直流浪 左邊是變數名,右邊必須賦值位址,c 5 int a c 相當於int a a c int 是資料型別,a是變數,一定要分開,先分清變數和資料型別你說的printf d a 其實是指標的乙個操作,取值操作,拿到指標a那片儲存空間的資料,即c的位址 追遠 J int a n 是 int a a...

在c語言中指標就是可以變化的位址嗎?

僅僅說對了一部分。1 的確,在絕大多數場合,指標是 變化的位址 我們開拓一下思路 變化的位址 的反義 是 不變化的位址 對嗎?沿這個思路,想一想,指標是否可能是 不變化的位址 int const p 指標p能變化嗎? 我認為,不一定 指標不僅負責儲存乙個位址,還負責儲存,它能管轄的記憶體範圍 例如 ...

C語言中對乙個指標賦值和對該指標的位址重新賦值的區別?

任衛 因為C語言是絕對的值傳遞。也正是這樣,為了更有效率地傳遞大資料塊才發明的指標,就是傳遞資料的位址值,沒有違反值傳遞。C 的引用傳遞才是對值傳遞的違反,C語言沒有引用。引數列表和返回值的東西都是複製來複製去的,都是副本,修改了函式形參本身的值就只在函式內有效。 暮無井見鈴 stack push ...