向c
函式中傳遞指向
二維陣列的指標引數
先來回顧一下一維陣列
,一維陣列的陣列名即為指向該陣列的指標,該指標值儲存了陣列存放在記憶體中的一塊連續區域的起始位址;陣列的下標表示了這片記憶體區域的某儲存區相對於起始位址的偏移量。簡單來講就是:指向一維陣列的指標,指向資料存放區域的起始位置。事實上,計算機系統的多維陣列其實最終還是以一維陣列的形式實現的。
就n x m
的二維陣列來講,設其陣列名為
array
指標array
指向乙個陣列,該陣列存放的是一系列指標,這些指標分別指向相應的一維陣列,而這些陣列中存放的才是我們的資料。
array -> [
一維陣列指標
1] -> [
一維陣列,m長
][一維陣列指標
2] -> [
一維陣列,m長
][一維陣列指標
n] -> [
一維陣列,m長
] 由此
array
[i]是第
i個指標變數位址,
array
[i][j]
則表示相對於第
i個指標變數偏移
j*sizeof(
陣列型別)。
系統通過這種機制訪問了該二維陣列的第
i行,第
j列的內容。
有上述可知,指向二維陣列的指標其實是指向
「指標變數位址
」的指標變數。所以在宣告指向二維陣列的指標時,用
int ** array
的形式。
有以下兩種方式來對二維陣列分配記憶體:
方法一#include
//必須包含該標頭檔案,裡面定義了
mallo
c的實現
int ** array = malloc( n * sizeof(int *) );
for (int k=0;k
array[k] = malloc( m * sizeof(int) );
int**
array
= (int**)malloc(n);
for (int i = 0;i <
n;i++)
array
[i] = (int*)malloc(m);
int **array = new int*[n];
for (int i = 0;i <
n;i++)
array[i] = new int[m];
方法二#include
int ** array = malloc( n * sizeof(int *) );
array[0] = malloc( m * sizeof(int) );
for (int k=1;k
array[k] = array[0]+m*k;
上述兩種方法的區別在於:前者在記憶體中分配的區域有可能
是不連續的;而後者則在記憶體中的一片連續區域為該陣列分配空間。
我們還可以通過一維陣列模擬二維陣列。在這中間要進行下
標轉換。如對於模擬的
nxm陣列,訪問其i第行,第j列元素時,一維陣列中對應的位置是
i*m+j
。當然為了更簡捷,我們可以把這個陣列下標轉換過程定義為乙個巨集,交由編譯系統來處理。
#define arr2 ( array_name, row,col )
array_name[row*m+col]
定義該巨集後,訪問
arr2( array, i, j)
等價於訪問
array[i*m+j]
方法三可以接收不同型別資料,強制型別轉換
#include "opencv2\opencv.hpp"
void print(void **tab,int rows,int cols)
cout<}}
int main(int argc, char *argv)
,};cout<<"ta: "<
print((void **)ta,2,3);//列印
return a.exec();
}函式返回陣列
c不支援在函式外返回區域性變數的位址,除非定義區域性變數為static變數
#include
#include
#include
int * function ()
int main ()
memset
是以位元組為單位,初始化記憶體塊。
包含在標頭檔案 或 中
當初始化乙個位元組單位的陣列時,可以用memset把每個陣列單元初始化成任何你想要的值,
並可初始化二維陣列,比如,
char data[10];
memset(data, 1, sizeof(data)); // right
memset(data, 0, sizeof(data)); // right
而在初始化其他基礎型別時,則需要注意,比如,
int data[10];
memset(data, 0, sizeof(data)); // right
memset(data, -1, sizeof(data)); // right
memset(data, 1, sizeof(data)); // wrong, data[x] would be 0x0101 instead of 1
2. 當結構體型別中包含指標時,在使用memset初始化時需要小
心。如如下**中,
struct parameters ;
parameters par;
par.p_x = new int[10];
memset(&par, 0, sizeof(par));
當memset初始化時,並不會初始化p_x指向的int陣列單元的值,而會把已經分配過記憶體的p_x指標本身設定為0,造成記憶體洩漏。同理,對std::vector等資料型別,顯而易見也是不應該使用memset來初始化的。
給函式傳遞二維陣列指標
很多時候,函式的形參很容易定義為指標的指標形式 如 int number 這樣可用來表示指向整型指標的指標,但我們傳遞的可是乙個二維陣列,其指標該是指向整型陣列的指標。這就是容易出現模糊的點。那如果形參形式是 int number 這種形式也是有其優點的,從例子中來說明 先定義實參 int inpu...
C C 二維陣列的引數傳遞與二維指標
在進行函式引數傳遞的時候,常常需要把一組資料傳遞給函式,我們知道一維陣列在進行函式引數傳遞的時候,以陣列名作為形參就可以,因為陣列名就表示該陣列的首位址,在函式內部也直接可以用符號訪問。那麼二維陣列的值該如何傳遞呢?其實它可以像一維陣列那樣以陣列名作為形參和實參,也可以使用二級指標來進行傳遞,常用的...
C 二維陣列的引數傳遞與二維指標
二維陣列的變數名是一維指標的指標,指標的步長是已知的,一維指標的長度需要在傳遞引用的過程中顯式標出,void transpose int mat 3 int row 不可簡化為void transpose int mat,int row include void transpose int mat ...