c++ 在堆上開闢與釋放二維、三維指標詳細解析
一維指標其實就相當於一維陣列,不用去看書上所說的陣列在記憶體中的首位址這些晦澀的話,以此類推 二維指標就相當於二維陣列,新手對一維陣列的開闢與釋放比較容易熟悉;
學習c++新手通常會對指標的使用比較頭疼,其實指標的概念很簡單,只要能悟清楚這樣乙個簡單的道理就能對指標有一定的認識了: 例如 int *a = new int[10]; 一維指標其實就相當於一維陣列,不用去看書上所說的陣列在記憶體中的首位址這些晦澀的話,以此類推 二維指標就相當於二維陣列,新手對一維陣列的開闢與釋放比較容易熟悉,例如上面的a 釋放就是 delete a; a = null; 注意a = null; 必須要加上,這樣是為了避免這個指標會變成「野指標」。寫程式時一定要注意規範性和嚴謹性,避免可能會出現的錯誤。
//二維指標的開闢與釋放
int **b = null;
b = new int*[10];
for(int i = 0; i != 10; ++i)
//這樣就在堆上開闢了int型別的二維指標,大小為10*50,相當於在堆上乙個二棧陣列int b[10][50];
for(int i = 0; i != 10; ++i)
delete b;
b = null;
//三維指標的開闢與釋放
int ***a = null;
a = new int**[10];
for(int i = 0; i != 10; ++i)}
//這樣就在堆上開闢了int型別的三維指標,大小為10*50*30,相當於在棧上乙個二維陣列int a[10][50][30];
for(int i = 0; i != 10; ++i)
delete a[i];
a[i] = null;
}delete a;
a = null;
二維指標動態分配記憶體連續問題深入分析
當我們定義乙個二維指標時,如果需要儲存相應的資料,就需要我們動態的分配記憶體,這時,有一點是需要注意的,分配記憶體的方法不同,記憶體的連續性也是不相同的;
#include #include using namespace std;
#define nwidth 3
#define nheight 4
//記憶體是否連續分配問題
int main(int argc, char *argv)
{ int **p = null;
p = (int**)malloc(nwidth*sizeof(int*));
if(p == null)
return -1;
cout<<"記憶體的不連續分配:"<
如圖所示,兩種分配記憶體的方法都能正確的分配記憶體,但是記憶體分配的空間確實不一樣的。
分析:
第一種分配方法:
首先,是對每一行分配,也就是 nwidth 中的每乙個進行分配,所以,我們可以看到每一行的記憶體都是連續的,每乙個都佔據四個位元組
但是,為nheight分配記憶體的時候,是隨機的進行分配記憶體,所以記憶體的位置是不確定的,所以,出現了第一種情況
第二種分配方法:
首先,同樣是為 p 分配記憶體,現在 p 指向乙個位置
但是,在第二句中,我們需要注意,是直接在 p[0] 出分配了所有需要的記憶體,所以,這個時候就全部分配完了,而且由於是一次性分配記憶體,故記憶體的位址肯定是連續的,執行結果也證明了這一點
釋放記憶體的兩種情況:
第一種情況由於是兩次不同的分配記憶體,所以,在釋放記憶體的時候,我們應選擇不同的區域進行釋放。
第二種情況,只是連續呼叫兩次 malloc ,所以,只需要連續兩次呼叫 free 即可完成釋放。
C 多維陣列和指標
用指標變數可以指向一維陣列中的元素,也可以指向多維陣列中的元素。先回顧一下多維陣列的性質,可以認為二維陣列是 陣列的陣列 例 定義int a 3 4 則二維陣列a是由3個一維陣列所組成的。設二維陣列的首行的首位址為2000 則有 第一行位址a 0 2000a 0 0 2004a 0 1 2008a ...
c語言指標回顧 指標基礎
學習c 已經快一年了,最近打算整理一下所學的知識,就當是系統地複習一遍,指標方面包括指標的簡單介紹 使用指標常見的錯誤 指標與陣列 指標與函式 指標陣列和陣列指標。任何剛開始學習c語言的人如果被難住了,那一定是卡在指標這邊了,其實指標並沒有這麼可怕,我這邊就挑兩個重點來講了,如下 1 指標是一種資料...
C 34 多維陣列和多維指標
void code include include int reset char p,int size,int new size printf n printf n printarray p,9 return 0 輸出 0,1,2,3,4,5,6,7,8,printfarray 401 234567...