c 入門學習 記憶體與指標及陣列

2021-03-31 15:15:53 字數 1723 閱讀 1661

1. 記憶體分析與指標

在c++中記憶體可分為**區(code)、資料區(分為const、***mon及data區)、棧區(heap)及堆區(stack動態分配區)。全域性變數存放在data區,區域性變數存放在棧區,動態變數存放在堆區,函式**放在**區。

在c++中,物件可以靜態分配,即編譯時就申請了記憶體空間,因此的效率也比較高。

如int ival = 1024,編譯時已為ival申請了4個位元組(win 32下),初始值為1024,當然還需要在另外乙個地方儲存這個變數的位址。

char *p = 「hello world」,系統在資料區的const區中申請了一塊記憶體,存放字串 hello word,然後再把該記憶體的位址賦值給p,而這個記憶體區對我們來說是唯讀的,即p[1] = 『k』這樣的操作是錯誤的。對於字串常量的引用實質上就是對它的位址的使用,如:

if(「hello」 == 「hello) cout<<」equal」; else cout<<」not equal」;

程式執行的輸出結果為not equal,這是因為對上述兩個字串的比較實質上是對它們所在位址的比較(同樣兩個陣列名的比較也是位址的比較)。同樣char *a;a=」hello」;將字串常量」hello」賦值給指標,實質上是將字元常量所在的位址賦值給指標a。

靜態物件與動態分配的兩個主要區別是:

(1) 靜態物件是有名字的變數,我們直接對其進行操作。而動態物件是沒有名字的變數,我們通過指標間接對它進行操作。所謂靜態就是編譯時就已知道大小不能更改了;

(2) 靜態物件的分配與釋放由系統自動處理,相反,動態物件的分析與釋放,必須由程式設計師顯示管理,所謂動態就是編譯和連線時不知道大小,只有執行時才知道大小,可以根據動態分配的這種特點建立動態陣列;

動態物件的分配:

int *p = new int[5];

int *p = (int *) malloc(sizeof(int) * 5);

以上這兩個語句分配了沒有名字的int型別的物件(也就是記憶體空間,長度為5個sizeof(int)),然後將該物件(或者記憶體空間)的位址返回給指標p,以後只有通過p才可以對其進行操作。對於動態記憶體我們需要手工釋放它們(使用delete和free分析釋放上述的兩個記憶體空間)。

int *p = new int(10)

這也是動態分配,這裡的分配乙個長度為sizeof(int)的記憶體,初始化的值為10,並把該記憶體的位址返回給p,這與上面**不同,上面的**分配的是陣列,而且不能初始化值。

動態記憶體分配後,如char *p = new char[10]等,緊接著的語句就是判斷記憶體是否分配成功,如if(p==null)。

2. 陣列

陣列的定義:

//在棧或者全域性資料區建立,不需要手工釋放空間

char temp[120];

char temp = ;

char temp = 「hello」;  //sizeof(temp) = 6; strlen(temp)=5;

//在堆中建立,所以需要手工釋放

char *p = new char[5]; //建立了乙個沒有名稱char型別的物件,只有通過p指標訪問

char *p = (char *)malloc(sizeof(char) * 5);

陣列的初始化還有一種方法,就是使用void *memset(void ,int,unsigined),第乙個引數可以傳陣列的位址,第二個引數為每個位元組的值,第三個引數為位元組數,如int a[50]; memset(a,0,50*sizeof(int)),就可以把陣列a的所有元素都賦值為0;

陣列 指標及記憶體

一 記憶體四區 a 區。存放 b 全域性區。全域性的常量 字串常量和變數 c 棧區。系統自動開闢,系統自動釋放,並不是很大。比如for迴圈中的int i 0。d 堆區。動態開闢的記憶體,手動開闢,手動釋放。大。比如自己定義的資料結構 a 編號連續 b 唯一的 c 取位址運算子 單目運算子,優先順序很...

記憶體與指標 陣列與指標

陣列指標 行指標 型別識別符號 變數名 個數 陣列指標指向乙個提取的陣列,本質為指標 定義 int p n p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。陣列指標的步長必須和它指向的二維陣列的列長相同!p 2 相當...

指標 陣列及記憶體管理

我們先來了解一下c與c 的記憶體管理。常見的記憶體錯誤及其對策 發生記憶體錯誤是件非常麻煩的事情。編譯器不能自動發現這些錯誤,通常是在程式執行時才能捕捉到。而這些錯誤大多沒有明顯的症狀,時隱時現,增加了改錯的難度。有時使用者怒氣沖沖地把你找來,程式卻沒有發生任何問題,你一走,錯誤又發作了。常見的記憶...