C語言資料結構攔路虎 變數與記憶體

2021-09-12 02:01:56 字數 2391 閱讀 9392

c語言的規則是:變數必須先定義才能使用。對變數的定義其實就是請求計算機,讓計算機將記憶體中的某個或幾個單元分配給你定義的變數使用。

把位址為2000的記憶體單元,起個名字叫「i」,怎麼知道變數的位址值呢用&i。

我又想到指標了,*a,a放的就是位址值。a=&i,*a我就能取到i的值了,也就是記憶體位址為2000單元的值了。

在程式中,你怎麼弄都不會變的值

1.const   int   a=10;

但是這裡的a實質上還是乙個變數,只不過是給a賦予了常量的屬性

所以不能 const   int   a=10;

int  arr[a]; //陣列的大小不能定義成變數

2.字面常量        

平時見到的1,』w『等,可以直接使用的都叫作字面常量

3.#define 定義的識別符號常量 例如:#define m 100

要注意的是程式執行時,程式中所有m都被換成100來執行,程式中是不存在m的,所以可以執行 int   arr[m]

4.列舉常量  enum

生活中的還有些東西是可以一 一枚舉出來的比如性別 ,血型,所以可以定義為列舉型別

enum   ***   //enum ***是列舉型別

列舉的使用

enum   ***  *** = male; 

資料型別的定義則可以確定計算機給該變數分配多大的記憶體。不同規範的c語言有不同規定,一般,int  2位元組,char 4位元組吧

變數的生命週期,也稱生存期,是指變數值保留的期限。按照生命週期,可將變數分為兩類:靜態變數和動態變數。

靜態變數:變數儲存在記憶體中的靜態儲存區,在編譯時就分配了儲存空間,在整個程式執行期間,該變數占有固定的儲存單元,變數的值都始終存在,程式結束後,這部分空間才釋放。這類變數的生存期為整個程式。

動態變數:變數儲存在記憶體中的動態儲存區,在程式執行過程中,只有當變數所在函式被呼叫時,編譯系統才臨時為該變數分配一段記憶體單元,該變數才有值,函式呼叫結束,變數值立即消失,這部分空間釋放。我們說這類變數的生存期僅在函式呼叫期間

變數的作用域也稱為可見性,指變數的有效範圍,可分為區域性和全域性兩種。

區域性變數:在乙個函式或復合語句內定義的變數是區域性變數,區域性變數僅在定義它的函式或復合語句內有效。

c語言中的變數有:自動變數、暫存器變數、外部變數、內部靜態變數和外部靜態變數。下面分別就這幾個變數進行簡單說明。

在c語言中,修飾符extern用在變數或者函式的宣告前,用來說明「此變數/函式是在別處定義的,要在此處引用」。 

使用extern關鍵字來宣告變數為外部變數。具體說就是在其中乙個c檔案中定義乙個全域性變數key,然後在另乙個要使用key這個變數的c檔案中使用extern關鍵字宣告一次,說明這個變數為外部變數,是在其他的c檔案中定義的全域性變數。請注意我這裡的用詞:定義和宣告。例如在main.c檔案中定義變數key,在common.c檔案中宣告key變數為外部變數,這樣這兩個檔案中就能共享

1. extern修飾變數的宣告。 

舉例來說,如果檔案a.c需要引用b.c中變數int v,就可以在a.c中宣告extern int v,然後就可以引用變數v。能夠被其他模組以extern修飾符引用到的變數通常是全域性變數。還有很重要的一點是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函式fun定義的開頭處宣告extern int v,然後就可以引用到變數v了,只不過這樣只能在函式fun作用域中引用v罷了,這還是變數作用域的問題。對於這一點來說,很多人使用的時候都心存顧慮。好像extern宣告只能用於檔案作用域似的。 

2. extern修飾函式宣告。從本質上來講,變數和函式沒有區別。函式名是指向函式二進位制塊開頭處的指標。如果檔案a.c需要引用b.c中的函式,比如在b.c中原型是int fun(int mu),那麼就可以在a.c中宣告extern int fun(int mu),然後就能使用fun來做任何事情。就像變數的宣告一樣,extern int fun(int mu)可以放在a.c中任何地方,而不一定非要放在a.c的檔案作用域的範圍中。對其他模組中函式的引用,最常用的方法是包含這些函式宣告的標頭檔案。 

使用extern和包含標頭檔案來引用函式有什麼區別呢?extern的引用方式比包含標頭檔案要簡潔得多!extern的使用方法是直接了當的,想引用哪個函式就用extern宣告哪個函式。這大概是kiss原則的一種體現吧!這樣做的乙個明顯的好處是,會加速程式的編譯(確切的說是預處理)的過程,節省時間。在大型c程式編譯過程中,這種差異是非常明顯的。

C語言資料結構攔路虎 遇到的問題

問題 一 描述 在建立順序棧時,在stack.c定義乙個函式用於建立順序棧,把棧置空,在新增乙個元素進棧 建立乙個棧 seqstack creat stack 在main.c裡主函式呼叫,建立乙個棧,push函式將3進棧 include include stack.h int main push函式...

C語言,變數與記憶體

符號位 最高位為符號位,正數該位為0,負數該位為1 任何數值在記憶體中都是以補碼的形式儲存的。1 10的二進位制形式 1000 0000 0000 0000 0000 0000 0000 1010 原 2 除符號位取反 1111 1111 1111 1111 1111 1111 1111 0101 ...

C語言基礎 變數與記憶體

在函式定義的變數都是區域性變數,區域性變數是存放在棧中的 1 變數的儲存細節 1 區域性變數是存在棧中,先分配位元組位址大的然後分配位元組位址小的,所有先定義的變數的位址大,後定義變數位址小 2 變數的位址是所占用儲存空間中,位元組位址最小的那個位址編號 2 字元 char c a 1 查ascii...