黑馬程式設計師 C語言指標與動態記憶體分配

2021-06-22 20:11:07 字數 2762 閱讀 4350

----------------------

asp.net+unity開發、.net培訓、

期待與您交流! ----------------------

一、儲存劃分

1、在c語言中,儲存區大致分為5類:棧、堆、靜態區、常量區、**區。

2、棧1)由編譯器自動分配和釋放

2)在函式體中定義的變數通常在棧上

3)棧中的變數先進後出

4)棧中的變數一般出了函式會被釋放

3、堆1)一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由os釋放

2)用malloc、calloc、realloc等分配記憶體的函式分配得到的就在堆上

3)釋放堆記憶體free()

4、全域性區(靜態區)

1)全域性變數和靜態變數的儲存是放在一塊的

2)初始化的全域性變數和靜態變數在一塊區域

3)未初始化的全域性變數和未初化的靜態變數在相鄰的另一塊區域

4)程式結束釋放

5、常量區

1)專門存放常量的地方

2)例如13,'a',-3.8,"fhkad"

3)程式結束釋放

6、**區

1)存放二進位制**的區域

2)函式通常會被編譯成二進位制**,儲存在**區

3)函式被呼叫的時候,會從**區取出,函式需要的引數以及函式體中的變數,會在棧裡臨時分配,函式結束時,變數會被釋放

二、指標賦值

1、c語言允許使用賦值運算子進行指標的複製,前提是兩個指標具有相同的型別

三、指標做為引數

1、指標作為引數的作用

2、定義乙個交換兩個整形變數的值的函式。如果定義成以下形式:

3、函式傳參的過程:把實際引數的值拷貝到形式引數:

四、指標作為返回值

1、我們不僅可以為函式傳遞指標,還可以編寫返回指標的函式

2、函式可以返回指向外部變數或指向宣告為static的區域性變數的指標

3、注意:

永遠不要返回指向自動區域性變數的指標。函式結束後,區域性變數就不存在了,所以指向區域性變數的指標是無效的

五、動態記憶體分配:

1、malloc()函式  在執行時分配記憶體的最簡單的標準庫函式是malloc()。使用這個函式時,需要在程式中包含標頭檔案。使用malloc()函式需指定要分配的記憶體位元組數作為引數。這個函式返回所分配記憶體的第乙個位元組的位址。因為返回的是乙個位址,所以這裡可以使用指標。 

動態記憶體分配的乙個例子如下: 

int *pnumber = (int *)malloc(100); 

這條語句請求100個位元組的記憶體,並把這個記憶體塊的位址賦予pnumber。只要不修改它,任何時間使用這個變數pnumber,它都會指向所分配的100個位元組的第乙個int的位置。這個記憶體塊能儲存25個int值,每個int佔4個位元組。 

注意,型別轉換(int*)將函式返回的位址轉換成int型別的指標。這麼做是因為malloc()是一般用途的函式,可為任何型別的資料分配記憶體。這個函式不知道要這個記憶體作什麼用,所以它返回的是乙個void型別的指標,寫做void*。型別void*的指標可以指向任意型別的資料,然而不能取消對void指標的引用,因為它指向未具體說明的物件。許多編譯器會把malloc()返回的位址自動轉換成適當的型別,且不會傷害具體指定的物件。 

可以請求任意數量的位元組,位元組數僅受制於計算機中未用的記憶體以及malloc()的運用場合。如果因某種原因而不能分配請求的記憶體,malloc()會返回乙個null指標。這個指標等於0。最好先用if語句檢查請求動態分配的記憶體是否已分配,再使用它。就如同金錢,沒錢又想花費,會帶來災難性的後果。因此,應編寫如下語句: 

if(pnumber == null)

如果指標是null,最好執行適當的操作。例如,至少可以顯示一條資訊"記憶體不足",然後中止程式。這比允許程式繼續執行,使之使用null位址儲存資料導致崩潰要好得多。然而,在某些情況下,可以釋放在別的地方使用的記憶體,以便程式有足夠的記憶體繼續執行下去。

2、分配記憶體時使用sizeof運算子 

前乙個例子很不錯,但我們不常處理位元組,而常常處理int、double等資料型別。例如給75個int型別的資料項分配記憶體,可以使用以下的語句: 

pnumber = (int *)malloc(75*sizeof(int)); 

如前所述,sizeof是乙個運算子,它返回乙個size_t型別的無符號整數,該整數是儲存它的引數需要的位元組數。它把關鍵字如int或float等作為引數,返回儲存該型別的資料項所需的位元組數。它的引數也可以是變數或陣列名。把陣列名作為引數時,sizeof返回儲存整個陣列所需的位元組數。前乙個例子請求分配足以儲存75個int資料項的記憶體。以這種方式使用sizeof,可以根據不同的c編譯器為int型別的值自動調整所需的記憶體空間。

----------------------

asp.net+unity開發、.net培訓、

期待與您交流! ----------------------

黑馬程式設計師 C語言 指標

asp.net android ios開發 net培訓 期待與您交流!指標 指標是c語言中非常重要的資料型別 指標變數的定義 int p int是指標指向資料的型別 p是指標變數名稱 只是用來表示變數為指標變數 指標的使用 int a 10 int p p a 或者p a 表示將變數a的記憶體位址賦...

黑馬程式設計師 c語言指標

ios培訓 android培訓 期待與您交流!指標的定義 定義指標和定義乙個變數類似 資料型別 指標變數名 如 int p 表示定義乙個指向整形變數的指標 使用如下 int a 8 int p p a 指標變數 p中存放a的位址,可以通過p中存放的位址,可以訪問變數a中的值。訪問指標變數中存放的位址...

黑馬程式設計師 C語言 指標

一.指標的基本概念 number 10 是什麼意思呢?1.通過number這個位址,找到他指向的空間 2.到這個空間裡,取出裡面儲存的值 普通變數基本格式 變數型別 變數名 指標變數基本格式 變數型別 指標變數名 指標裡面存的是別的變數的位址 p來列印值是0x開頭的,16進製制數字 指標變數在記憶體...