變數定義和宣告的區別

2021-10-02 20:19:05 字數 1795 閱讀 6472

所謂定義就是(編譯器)建立乙個物件,為這個物件分配一塊記憶體,並給它取上乙個名字,這個名字就是就是我們經常所說的變數名或物件名。

宣告有兩重含義:

(1) 告訴編譯器,這個名字已經匹配到一塊記憶體上,下面的**用到變數或者物件是在別的地方定義的。宣告可以出現多次。

(2) 告訴編譯器,這個名字已經被預定了,別的地方再也不能用它來作為變數名或物件名。

定義和宣告的最重要區別就是:

定義建立物件並為這個物件分配了記憶體,宣告沒有分配記憶體。1、一種是需要建立儲存空間的。例如:int a 在宣告的時候就已經建立了儲存空間。

2、另一種是不需要建立儲存空間的。 例如:extern int a 其中變數a是在別的檔案中定義的。

宣告是向編譯器介紹名字--識別符號。它告訴編譯器「這個函式或變數在某處可找到,它的模樣象什麼」。

而定義是說:「在這裡建立變數」或「在這裡建立函式」。它為名字分配儲存空間。無論定義的是函式還是變數,編譯器都要為它們在定義點分配儲存空間。對於變數,編譯器確定變數的大小,然後在記憶體中開闢空間來儲存其資料,對於函式,編譯器會生成**,這些**最終也要占用一定的記憶體。

總之就是:把建立空間的宣告成為「定義」,把不需要建立儲存空間的成為「宣告」

基本型別變數的宣告和定義(初始化)是同時產生的;而對於物件來說,宣告和定義是分開的。

例如:類a

如果a a;就是乙個宣告,告訴編譯器a是a類的乙個物件變數,但是不進行初始化;

如果以後a=new a();這就是初始化,分配了空間。

(我們宣告的最終目的是為了提前使用,即在定義之前使用,如果不需要提前使用就沒有單獨宣告的必要,變數是如此,函式也是如此,所以宣告不會分配儲存空間,只有定義時才會分配儲存空間。)

用static來宣告乙個變數的作用有二:

(1)對於區域性變數用static宣告,則是為該變數分配的空間在整個程式的執行期內都始終存在。

(2)外部變數用static來宣告,則該變數的作用只限於本檔案模組。

宣告:告訴編譯器變數的型別 在** 或者函式的特徵(返回值 引數型別 個數)

定義:告訴編譯器 在此處分配儲存空間 建立變數和函式

同一變數定義只有乙個(幹嘛要多處分配空間呢 記憶體很寶貴的~)

但是可以宣告多次

變數有點混淆--

int a; 是個宣告 也是個定義

extern int a; 只是宣告

所以宣告包含定義,有足夠的資訊讓編譯器建立變數的宣告 就是乙個定義

為了讓int a;不是定義(別給a分配空間) 前面加extern吧

(所以 extern int a=1;是要出錯的 --bb)

函式很清楚--

宣告就是沒有函式體的 定義則有

事實上函式宣告前本來也要加extern的 但是可以省略

程式記憶體簡介

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分

1、棧區(stack)— 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

2、堆區(heap) — 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式類似於鍊錶。

3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放

4、文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放

5、程式**區—存放函式體的二進位制**。

變數的定義和宣告

我們在程式設計中,時時刻刻都用到變數的定義和變數的宣告,可有些時候我們對這個概念不是很清楚,知道它是怎麼用,但卻不知是怎麼一會事,下面我就簡單的把他們的區別介紹如下 望我的指點對你受益 變數的宣告有兩種情況 1 一種是需要建立儲存空間的。例如 int a 在宣告的時候就已經建立了儲存空間。2 另一種...

定義和宣告的區別

之前學習c c 的時候,都沒去注意變數的定義和宣告的具體區別,也隨意將它們放在標頭檔案,今日看c primer,才發現原來變數的定義和宣告之間的區別竟然如此之大,而且區別它們兩個竟然如此重要。變數的定義用於為變數分配儲存空間,還可以為變數指定初始值。在乙個程式中,變數有且僅有乙個定義。宣告用於向程式...

定義和宣告的區別

2 變數定義和變數宣告的區別 3 物件定義和物件宣告的區別 關於宣告和定義有如下兩種特殊情況需要注意 1 宣告和定義如果變數型別不一致,將導致錯誤的解析。global.c float g f 10.0 main.c extern int g f intmain void 2 對於結構體型別如果只有宣...