指標是可變陣列的首位址。正因為是可變陣列,所以一般使用指標時都是採用動態記憶體分配和釋放的方式。一維指標形式簡單,容易理解。平時應用較多。二維陣列和二維指標比較複雜,並且在動態記憶體分配與釋放方面比較複雜且難以理解。但是二維陣列和二維指標是非常有用的。
考慮以下應用:對一幅影象進行模板運算。這必然會牽涉到對影象的各象素點的操作。此時使用一維指標進行影象傳遞時,不可避免的會使用形如
*(p+i*width+j)
的方式完成對影象象素點的訪問。這種方式很不直觀並且編寫程式時容易出錯。如果使用二維指標進行影象資料的傳遞,則會收到很好的效果。可以採用
p[i][j]
的方式直接操作象素點,直觀又便於維護。因此掌握二維陣列和二維指標是必要的。 使用
中的示例。
定義如下
3個二維陣列和二維指標進行說明: 1.
int** ptr;
2.int *ptr[m];
3.int (*ptr)[m];
以上都是存放整數的二維陣列,並且都可以通過
ptr[i][j]
的形式訪問內容。但是它們之間有很大的差別。以下依照文中提到的方面進行分析。 l
內容三個
ptr本身都是指標,並且是二維指標,但是它們的最終內容總是整數。但中間內容,形如
ptr[i]
並不是整數,而是指標
int *.l意義
1. int** ptr
表示指向(一組指向整數資料指標)的指標;
2. int *ptr[m]
是指標陣列,表示指向(
m個指向整數指標)的指標;
3. int (*ptr)[m]
表示指向一組(指向包含
m個整型資料的指標)的指標。 l
所佔空間1和
3占用乙個記憶體空間,在
32位平台上為
4個位元組,也就是乙個指標。2是
m個指標,在其定義過程中編譯器即對其進行了分配,占用
4*m共
4m個位元組。 l
用法1. int** ptr
表示指向(一組指向整數資料指標)的指標,是乙個二維指標。在其定義過程中,編譯器並不對其進行記憶體的分配,因此必須自己管理其記憶體的分配與釋放。典型使用如下:
int** ptr;
int i,j;
ptr = (int**)malloc((sizeof(int*))*m);
printf("the address of ptr:%10x\n",ptr);
for (i=0;i
//採用如上記憶體分配方法,意味著將ptr初始化為m*n的二維陣列首位址
//可以訪問ptr[0:m-1][0:n-1]的資料
//操作
for (i=0;i
free(ptr);
使用上述方法分配記憶體,最終
ptr耗費的記憶體空間為
m*sizeof(int*)+m*n*sizeof(int)
2. int *ptr[m]
是指標陣列,表示指向(
m個指向整數指標)的指標。是乙個二維指標。但是在定義的時候,編譯器已經為
ptr指向的
m個指向整數的指標
ptr[0:m-1]
分配了記憶體。也就是說,定義之後即可得到
ptr的位址以及用於存放
ptr[0:m-1]
的記憶體空間
4mb。要使用
ptr必須對
ptr[i]
分配記憶體。分配記憶體後,
ptr位址相應記憶體空間填入
ptr[i]
int* ptr[m];
int i,j;
printf("the address of ptr:%10x\n",ptr);
for (i=0;iptr[i] = (int*)malloc(sizeof(int)*m);
printf("the address of ptr[%d]:%10x\n",i,ptr[i]);
//採用如上記憶體分配方法,意味著將ptr初始化為m*n的二維陣列首位址
//可以訪問ptr[0:m-1][0:n-1]的資料
//操作
for (i=0;ifree(ptr[i]);
//free(ptr); //此處不釋放ptr記憶體,是因為ptr的記憶體是由編譯器分配的。
使用上述方法分配記憶體,最終
ptr耗費的記憶體空間為
m*sizeof(int*)+m*n*sizeof(int)
,其中m*sizeof(int*)
為編譯器分配,
m*n*sizeof(int)
為程式設計師自己分配。
3. int (*ptr)[m]
表示指向一組(指向包含
m個整型資料的指標)的指標。該定義限定了
ptr[i][0:m-1]
,所有指標
ptr[i]
必須指向長度為
m的陣列。使用方式如下:
int (*ptr)[m];
int i,j;
printf("the address of ptr:%10x\n",ptr);
ptr = (int (*)[m])malloc(sizeof(int)*m*n); //一次分配連續記憶體
printf("the address of ptr:%10x\n",ptr);
for (i=0;i// ptr[i] = (int [m])malloc(sizeof(int)*m);
printf("the address of ptr[%d]:%10x\n",i,ptr[i]);
//採用如上記憶體分配方法,意味著將ptr初始化為n*m的二維陣列首位址
//可以訪問ptr[0:n-1][0:m-1]的資料
//操作
free(ptr);
使用上述方法分配記憶體後,
ptr所佔記憶體空間為
m*n*sizeof(int)
(不考慮不同作業系統用於管理的記憶體)。
ptr記憶體空間中儲存的為最終內容而非
ptr[i]
位址。
C C 中的二維指標問題
本文參考網路資源,對其進行了整理。指標是可變陣列的首位址。正因為是可變陣列,所以一般使用指標時都是採用動態記憶體分配和釋放的方式。一維指標形式簡單,容易理解。平時應用較多。二維陣列和二維指標比較複雜,並且在動態記憶體分配與釋放方面比較複雜且難以理解。但是二維陣列和二維指標是非常有用的。考慮以下應用 ...
C C 二維陣列的引數傳遞與二維指標
在進行函式引數傳遞的時候,常常需要把一組資料傳遞給函式,我們知道一維陣列在進行函式引數傳遞的時候,以陣列名作為形參就可以,因為陣列名就表示該陣列的首位址,在函式內部也直接可以用符號訪問。那麼二維陣列的值該如何傳遞呢?其實它可以像一維陣列那樣以陣列名作為形參和實參,也可以使用二級指標來進行傳遞,常用的...
C C 指向二維陣列的指標
設有整型二維陣列a 3 4 如下 0 1 2 3 4 5 6 7 8 9 10 11 它的定義為 int a 3 4 設陣列a的首位址為1000,各下標變數的首位址及其值如圖所示。c語言允許把乙個二維陣列分解為多個一維陣列來處理。因此陣列a可分解為三個一維陣列,即a 0 a 1 a 2 每乙個一維陣...