在c中當定義乙個變數並對其取位址的時候電腦發生了什麼?

時間 2021-05-30 04:24:26

1樓:

求知慾旺盛是好事,但以後不懂的東西更多,你根本不需要立馬知道答案,你只需要記下來以後自然就學到了。

cs知識是網狀的,你多學才能聯絡起來。

總結一下上面的回答,簡單說就是這個問題暫時不用深究,以後去看一下微機原理就明白了。

拿我個人來說,高一接觸的C++,大三才學微機原理,一點都不影響我中間5年寫程式。

人家問個問題,你們知道了就好好答,不知道的就閉嘴。

2樓:

總結一下上面的回答,簡單說就是這個問題暫時不用深究,以後去看一下微機原理就明白了。

拿我個人來說,高一接觸的C++,大三才學微機原理,一點都不影響我中間5年寫程式。

3樓:

程式執行的時候是不知道所謂變數名等標誌符的,變數名只存活於編譯、鏈結期間。

CPU有幾個暫存器可以儲存資料。

32位CPU每個暫存器大小32位也就是4位元組,64位CPU是8位元組。變數分配時,CPU就會把變數所在的位址載入到某個暫存器之中,當它需要這個變數時就會直接從當初儲存他的暫存器中讀出位址來,再去這個位址讀取變數的值。

所謂「變數分配」,說的不嚴謹一些就是在記憶體中開闢一塊空間儲存資料。在C的語境裡記憶體空間分了兩大類,堆(heap)和(棧)。

棧中的空間不需要你參與管理、分配,作業系統載入你的程式時會為你準備好了一大塊記憶體作為棧空間。你在函式裡的各種變數定義就是直接進入棧裡那塊記憶體了。比如本地變數這麼定義:

int a = 123; //這可能就表示命令CPU在棧+8處儲存乙個4位元組整數123

CPU有兩個特殊的暫存器,32位的叫ebp、esp,64位叫rbp、rsp,用於跟棧有關的一切操作中。你的程式執行時CPU就已經把棧空間起始位址儲存到這倆暫存器裡了,此後但凡遇到需要讀取棧裡某塊記憶體的情況,CPU都會直接從esp、ebp或rsp、rbp裡得到棧的位址,然後從裡讀取資料。比如要讀取變數a,CPU就用esp+8作為a的位址,直接從中讀出資料。

從堆裡分配空間需要你顯式的呼叫記憶體分配函式比如malloc。與題目關係不大暫且不表。

理論上你的可以定義無數變數,只要記憶體空間足夠。

很多細節描述的並不準確、嚴謹,但大致思路是對的。

C語言對乙個變數取位址是真實的位址嗎?

碼農的荒島求生 這要看情況,看什麼情況?1,是否裝有作業系統 2,作業系統是否支援虛擬記憶體如果沒有啥作業系統或裝有作業系統但不支援虛擬記憶體,那麼你在C語言中對變數取位址得到的就是真實的物理記憶體位址。如果作業系統支援虛擬記憶體,那麼你獲取到的就不再是真實的物理記憶體位址,而是邏輯位址。 劉世超 ...

C 中能顯式定義乙個匿名變數嗎?

lichray 我應該來推銷一下自己的 proposal 嗎?算了,還是不挖坑了。類似前面某個回答,如果不在意多一層 scope 的話,這個問題可以有不用巨集的選項 ProgressLog 解釋見 冒泡 的回答,只是這裡用了 lambda,可以跨編譯器使用。 可以參考劉未鵬大神的這篇文章 C 11 ...

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

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