C C 中的二維指標問題

2021-05-27 18:01:17 字數 3023 閱讀 9675

指標是可變陣列的首位址。正因為是可變陣列,所以一般使用指標時都是採用動態記憶體分配和釋放的方式。一維指標形式簡單,容易理解。平時應用較多。二維陣列和二維指標比較複雜,並且在動態記憶體分配與釋放方面比較複雜且難以理解。但是二維陣列和二維指標是非常有用的。

考慮以下應用:對一幅影象進行模板運算。這必然會牽涉到對影象的各象素點的操作。此時使用一維指標進行影象傳遞時,不可避免的會使用形如

*(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 每乙個一維陣...