c 指標 引用和動態空間管理 C語言 記憶體管理

2021-10-11 08:58:38 字數 3486 閱讀 3851

學習重點 :

1.全面掌握變數的特性,了解記憶體管理的概念.

2.全面掌握函式的使用.

區域性變數與全域性變數:

區域性變數:就是在函式內部定義的變數.區域性變數只在本函式內有效,也就是只能在本函式內使用它.

全域性變數:就是在所有函式(包括main函式)外部定義的變數.全域性變數在整個原始檔中有效,故全域性變數可以在原始檔中的任何地方使用.

注 :c語言中,允許全域性變數與區域性變數重名,但全域性變數不影響區域性變數的值,也就是實際使用的是區域性變數的值.

變數的特性 :

1.儲存期 :也稱為生存期,表示變數在記憶體中存在的時間的長短.

靜態儲存期 :

在程式編譯時就分配記憶體空間並保持不變,程式執行結束後才釋放.

動態儲存期 :

在程式執行並使用該變數的時候分配記憶體空間,使用完畢立即釋放.

2.鏈結點 :表示變數能在哪些範圍內使用.

內部鏈結 :只能在原始檔內部使用.

外部鏈結 :能在原始檔內部和外部檔案中使用.

空連線 :只能在**塊內(函式內部)使用.

3.作用域 :表示變數在哪些範圍內起作用,由鏈結點決定.

1.區域性變數 :定義與宣告不區分(定義之後可以直接使用).

a.自動變數 :使用auto關鍵字修飾儲存型別,一般預設.

定義宣告 :[auto] 《資料型別》 《變數名》; //一般auto不寫 int a;直接這樣普通定義就行

變數特性 :動態儲存期,空鏈結,**塊作用域.

b.靜態區域性變數 :使用static關鍵字修飾儲存型別.

定義宣告 :《資料型別》 《變數名》; //static int a;

變數特性 :靜態儲存期,空鏈結,**塊作用域.

c.暫存器變數 :使用register關鍵字修飾儲存型別.

register是乙個請求命令,暗示該變數將被頻繁使用,請求儲存在cpu暫存器中.用register修飾的變數的值必須是單個值,資料

長度小於或等於整型資料長度.因為變數的值可能存放在暫存器中,所以不能使用取位址符'&'獲取該變數的位址.

定義宣告 :《資料型別》 《變數名》; //register int a;

變數特性 :動態儲存期,空鏈結,**塊作用域.

2.全域性變數 :定義與宣告有些地方需要區分.

a.普通全域性變數 :

定義 :《資料型別》 《變數名》;

宣告 :引用原始檔內部普通全域性變數不需要宣告.

引用外部檔案普通全域性變數需要進行申明 : 《資料型別》 《變數名》;

變數特性 :靜態儲存期,外部鏈結,原始檔內部及外部檔案作用域.

b.靜態全域性變數 :

定義 :《資料型別》 《變數名》;

宣告 :引用靜態全域性變數不需要申明.

變數特性 :靜態儲存期,內部鏈結,原始檔內部作用域.

注 : 靜態儲存期的變數並不一定是靜態變數.比如普通全域性變數.

記憶體管理:

程式一般是儲存在計算機的外存中,執行時自搬移到記憶體中進行執行.

c語言中定義4個記憶體區間:**區,靜態儲存區,棧區,堆區.

1.**區 :用於存放程式中的**,屬性唯讀.

2.靜態儲存區:用於存放普通全域性變數,靜態變數(靜態全域性變數,靜態區域性變數),以及常量.

3.動態儲存區:

棧區 :用於存放普通區域性變數.

堆區 :由程式設計師自行決定申請和釋放的記憶體空間,稱之為堆區.

典型的例子就是定義結構體指標後,需要使用malloc()申請結構體指標指向的記憶體空間.

函式:

1.函式的定義 :[static] 《函式返回值資料型別》 《函式名》(形參表)

return 表示式;

} //例子:static int test(int x);

static關鍵字說明該函式只能在原始檔內部使用,為可選項.

2.函式的宣告 :[extern] 《函式返回值資料型別》 《函式名》(形參表);

extern關鍵字表明該函式在被呼叫時,在外部檔案中查詢函式的定義,為可選專案.

3.函式的呼叫 :被調函式必須時已經在呼叫函式之前宣告,或者被調函式在呼叫函式之前定義.

呼叫方法 : 函式名(實參表);

4.指標函式 :函式的返回值是乙個指標.

定義 :[static] 《函式返回值資料型別*> 《函式名》(形參表)

return p; //p是乙個指標變數.

思考題目 : 下面哪個函式能使呼叫函式讀到"hello world!"這個字串.

char *fun() char *fun1()

char arr = "hello world!"; char *p = "hello world!";

return arr; return p;

結果可以發現char *fun1()返回了字串"hello world!",但是char fun();沒有返回"hello world!",這是為什麼呢???還記得之前說的靜態儲存區嘛???

靜態儲存區存放常亮而"hello world!"便是乙個常亮儲存在靜態儲存區中,然而char arr;這是普通全域性區域性變數,所以fun()返回的是乙個野指標因為fun()程式結束後就自行釋放記憶體空間,而char *p不同這不是乙個普通變數這是乙個指向常量首位址的指標,所以它在靜態儲存區中,所以然後可以返回值啦。因為程式沒結束,靜態儲存區中記憶體空間還沒有沒有釋放。

5.函式指標 :指標指向的是函式的首位址,也就是用來存放函式入口位址的指標.

函式指標的定義 :《函式返回值資料型別》 (*函式指標變數名)(函式形參表);

對應的函式的定義 :《函式返回值資料型別》 《函式名》(函式形參表)

return 函式返回值;

函式指標使用方法 :將函式名(實際就是函式的入口位址)賦值給對應的函式指標,通過對函式指標的使用即可實現對對應函式的呼叫.

6.函式特殊引數的傳遞:

函式的形參是指標:

當指標作為實參傳遞給函式時,對指標進行解引用會直接改變指標指向的儲存空間中的資料.

當陣列作為實參傳遞給函式時,實際傳遞的是同級別的指標.

C語言指標和c 引用

c 引用和c指標區別 在c和c 中,指標一般指的是某塊記憶體的位址,通過這個位址,我們可以定址到這塊記憶體 而引用是乙個變數的別名,例如我們給小明起了個外號 明明,那我們說明明的時候,就是說小明。對於指標來說,它是乙個位址,這個位址是乙個數值,那麼就意味這個數值可以為0 空指標 也可以為其他,即指標...

《認清C 語言》 引用和指標

1 首先要認識到不存在類似於空引用 null reference 這樣的東西。引用必須要指代某個物件,因此,如果有乙個用於指代另外乙個物件的變數,但是有可能沒有這麼乙個可供指代的物件,這時就應該把這個變數宣告成指標,因為這樣就可以將它設為空值 null 了。反之,如果這個變數必須指代乙個物件,即我們...

c指標和c 引用

指標和引用的區別 指標是乙個實體,而引用僅是個別名 引用使用時沒有 指標使用時需要取位址中的內容 引用只能在定義時被初始化一次,之後不可變 指標就是指向一塊位址空間,初始化後可以改變指向 即引用的底層實現是常量指標 引用沒有只不唯讀的區分,指標有 const 修飾 其中又分為修飾自身型別和指向性型別...