變數名不佔空間
變數:用來標識(identify)一塊記憶體區域,這塊區域的值一般是可以更改的,這就是它「變」的由來,但是我們可以通過使用如const等一些修飾符號來限定這一記憶體區域的操作特性(characteristic),即變數的操作特性。用const修飾的使變數不能更改的就和常量一樣的變數叫做常變數。
變數名:是乙個識別符號(identifier),用來指代一塊記憶體區域,即變數,使用變數使我們操作記憶體以區域(area),以塊(block)為單位,提高了方便性。
你的機器**中,是不會出現變數名的;變數名是給我們程式設計師操作記憶體來使用的。
想想在彙編年代,沒有變數名,我們操作記憶體,都是用位址來直接操作的,還要控制區域大小;當然組合語言已經有了簡單的變數。
對於編譯器,它會蒐集我們的變數名,比如我們定義了乙個全域性的int a;那麼編譯器都為我們做了什麼呢?
它會為程式預留4個位元組的空間(假設在32位平台),並把我們的變數名「a」儲存進符號表,並用這個符號表的索引對應實際的空間。
如果下面出現b = a;那麼它就會根據符號表找到變數的真正的物理位置,取得它的值,賦給b。
這是寫編譯器需要做的,我們需要建立符號表。
但是實際在彙編層次上,操作的都是位址而已,不存在任何名稱了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
除了變數名不是記憶體位址,其他名都是位址。對麼?
所謂的其他名無非是函式名、識別符號常量名、指標名、陣列名、結構名、類名等等。
樓主的話有部分是對的,
比如指標名、陣列名、函式名就是位址,它們分別表示指標所指向元素的位址、陣列的首位址和函式的入口位址。
變數名雖然不直接表示位址,但可用取位址符號&來獲得它所代表的變數的存放位址。因為在定義變數的同時會分配給它相應的空間。
但類和結構只有事例化時才為它分配空間,從而不能用取位址符號&來獲得類名或結構名的位址。
變數名是用來標識某個記憶體塊的
位址就是位址啦,如是變數名的話,用取位址運算子&就可以得到它標識的記憶體塊的位址,
而指標變數呢,它本身也是乙個變數名,只不過它標識的那塊記憶體存放的是乙個位址值
變數是位址的別名..就像剛生的小孩,你只知道他在地球上的某個位置,而不能叫出他名字,給你取個名
~~~~~~~~~~~~~~~~~~~~~~~
定義int a;時,編譯器分配4個位元組記憶體,並命名該4個位元組的空間名字為a(即變數名),當用到變數名a時,就是在使用那4個位元組的記憶體空間.
5是乙個常數,在程式編譯時存放在**的常量區存放著它的值(就是5),當執行a=5時,程式將5這個常量拷貝到a所在的4個位元組空間中,就完成了賦值操作.
a是我們對那個整形變數的4個位元組取的"名字",
是我們人為給的,實際上計算機並不儲存a這個名字,只是我們程式設計時給那4個位元組記憶體取個名字好用.實際上程式在編譯時,所有的a都轉換為了那個位址空間了.編譯成機器**後,沒有a這個說法了.a這個名字只存在於我們編寫的**中.
5不是被隨機分配的,而總是位於程式的資料段中,可能在不同的機器上在資料段中的位置可能不一致,它的位址其實不能以我們常用到的記憶體位址來理解,因為牽扯到乙個叫"計算機定址方式"的問題,所以寫很多都解釋不清楚,你自己找本組合語言的書來學一下吧.........
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
c語言中變數只是標識對應儲存單元內的儲存內容。與位址的對應關係
int a=3;
a---&a
一一對應啊,變數名只是乙個便於記憶識別的名稱,編譯器會將他編譯成相應的記憶體位址的.
變數都要佔據一定的記憶體。
通過定義該變數的指標, [型別]* 指標名=你要指向的變數名
那麼該指標中儲存的就是你的變數的記憶體位址。
&你的變數名 這樣就可以直接獲取到你的變數位址
或者定義引用 [型別]& 引用名=變數名
該引用可通過變數的位址來對變數進行修改
~~~~~~~~~~~~~~~~~~~~~~~~~
變數名是給編譯器看的,編譯器根據變數是區域性還是全域性分配記憶體位址或棧空間,所謂的變數名在記憶體中不存在,操作時轉換成位址數存放在暫存器中了。
編譯器會將合法的變數名放到乙個叫「符號表」的乙個表中。
每個符號對應乙個位址。當你呼叫此變數時,就會根據此符號表找到對應的位址,然後進行操作。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
還沒有執行怎麼會占用記憶體呢?!(這一點還要懷疑嗎!?)
所謂在編譯期間分配空間指的是靜態分配空間(相對於用new動態申請空間),如全域性變數或靜態變數(包括一些複雜型別的常量),它們所需要的空間大小可以明確計算出來,並且不會再改變,因此它們可以直接存放在可執行檔案的特定的節裡(而且包含初始化的值),程式執行時也是直接將這個節載入到特定的段中,不必在程式執行期間用額外的**來產生這些變數。
其實在執行期間再看「變數」這個概念就不再具備編譯期間那麼多的屬性了(諸如名稱,型別,作用域,生存期等等),對應的只是一塊記憶體(只有首址和大小),所以在執行期間動態申請的空間,是需要額外的**維護,以確保不同變數不會混用記憶體。比如寫new表示有一塊記憶體已經被占用了,其它變數就不能再用它了; 寫delete表示這塊記憶體自由了,可以被其它變數使用了。(通常我們都是通過變數來使用記憶體的,就編碼而言變數是給記憶體塊起了個名字,用以區分彼此)
記憶體申請和釋放時機很重要,過早會丟失資料,過遲會耗費記憶體。特定情況下編譯器可以幫我們完成這項複雜的工作(增加額外的**維護記憶體空間,實現申請和釋放)。從這個意義上講,區域性自動變數也是由編譯器負責分配空間的。進一步講,記憶體管理用到了我們常常掛在嘴邊的堆和棧這兩種資料結構。
最後對於「編譯器分配空間」這種不嚴謹的說法,你可以理解成編譯期間它為你規劃好了這些變數的記憶體使用方案,這個方案寫到可執行檔案裡面了(該檔案中包含若干並非出自你大腦衍生的**),直到程式執行時才真正拿出來執行!
~~~~~~~~~~~~~~
C語言變數名和位址的關係?
變數 用來標識 identify 一塊記憶體區域,這塊區域的值一般是可以更改的,這就是它 變 的由來 但是我們可以通過使用如const等一些修飾符號來限定這一記憶體區域的操作特性。用const修飾的使變數不能更改的就和常量一樣的變數叫做常變數。變數名 是乙個識別符號 identifier 用來指代一...
變數名和位址之間的關係
今天忽然意識到乙個問題,當我們定義乙個變數的時候,如何通過變數名讀取變數裡內容呢?變數名是否是乙個位址呢?c語言裡,記憶體的劃分?在c c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧 就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。...
C 語言的變數名 記憶體 記憶體名 記憶體位址
程式語言從機器語言發展到組合語言,再發展到高階語言,越來越符合人的思維。c 語言是高階語言中的低階語言,兼具高階語言的方便性和低階語言的效率。用 c 語言程式設計就是用 c 語言書寫作戰命令,指揮計算機做事。比如下面的程式,設定好整數a b的值,執行後瞬間得到結果。include int main ...