二維動態陣列定義及二維靜態陣列與 P的區別

2021-09-09 02:57:59 字數 2806 閱讀 3657

矩力整合2023年校園招聘筆試題:動態申請乙個二維陣列儲存影象陣列

傳統的解決方案是分配乙個指標陣列, 然後把每個指標初始化為動態分配的 ``列"。 以下為乙個二維的例子:

//typedef int (*arraypoiter)[ncolumns];

int **dynamic_alloc_arrays(unsigned int nrows,unsigned int ncolumns)

unsigned int i;

int **array = (int **)malloc(nrows * sizeof(int *));

for(i = 0; i < nrows; i++)

array[i] = (int *)malloc(ncolumns * sizeof(int));

printf("array=0x%x/n",(int)array);

for(i=0;iprintf("array[%d]=0x%x/n",i,(int)array[i]);

printf("/n");

return array;

void main(void)

int **test_allocate;

unsigned int nrows=3;

unsigned int ncolumns=4;

test_allocate = dynamic_alloc_arrays(nrows,ncolumns);

printf("test_allocate=%x/n",test_allocate);

array=911c70

array[0]=911c30

array[1]=911bf0

array[2]=911bb0

test_allocate=911c70

當然, 在真實**中, 所有的 malloc 返回值都必須檢查。你也可以使用 sizeof(*array) 和sizeof(**array) 代替 sizeof(int *) 和 sizeof(int)(因為*array的型別為int *,**array的型別為int)。

你可以讓陣列的記憶體連續, 但在後來重新分配列的時候會比較困難, 得使用一點指標算術:

int **dynamic_alloc_arrays(unsigned int nrows,unsigned int ncolumns)

unsigned int i;

int **array = (int **)malloc(nrows * sizeof(int *));

array[0] = (int *)malloc(nrows * ncolumns * sizeof(int));

for(i = 1; i < nrows; i++)

array[i] = array[0] + i * ncolumns;

printf("array=0x%x/n",(int)array);

for(i=0;iprintf("array[%d]=0x%x/n",i,(int)array[i]);

printf("/n");

return array;

void main(void)

int **test_allocate;

unsigned int nrows=3;

unsigned int ncolumns=4;

test_allocate = dynamic_alloc_arrays(nrows,ncolumns);

printf("test_allocate=%x/n",test_allocate);

array=911c70

array[0]=911c10

array[1]=911c20

array[2]=911c30

test_allocate=911c70

在兩種情況下, 動態陣列的成員都可以用正常的陣列下標 arrayx[i][j] 來訪問 (for 0 <= i 另一種選擇是使用陣列指標:

int (*array4)[ncolumns] = malloc(nrows * sizeof(*array4));

但是這個語法變得可怕而且執行時最多只能確定一維。因為ncolumns必須為定值

c語言裡,陣列名是被看作指標來使用的,一維陣列是指標,二維陣列是指向指標的指標,三維是......... 真的是這樣的嗎??看下面的例子:

void show (int * * info, int x, int y) //列印乙個x*y的陣列的內容

int i, j;

for (i=0;ifor (j=0;jprintf ("%d ",info[i][j]);

printf ("/n");

void function (void)

int as[10][10];

show (as,10,10);

// error c2664: 'show' : cannot convert parameter 1 from 'int [10][10]' to 'int ** ' types pointed to are unrelated; conversion requires reinterpret_cast, c-style cast or function-style cast

在c中沒有安全型別檢查,上述程式只是warning,但是程式執行會崩潰

在c++中,根本就無法編譯通過,即as[10][10]和int * *根本不是乙個型別

為什麼?在c中,二維陣列雖然是定義為指向指標的指標,但是實際上被指向的指標是不存在的,即沒有乙個記憶體來儲存這個指標,只是在執行as [n]時返回乙個指標罷了,as所指的不過是存放陣列內容的位址!!

實際上從上面**p和動態二維陣列的使用即可看出來,**p和靜態二維陣列的本質區別!

靜態二維陣列和動態二維陣列(C語言)

1 理解什麼是靜態二維陣列和動態二維陣列 靜態二維陣列 可以理解為程式中如下定義的陣列 定義乙個3行4列的靜態二維陣列 int 3 4 動態二維陣列 可以理解為程式中如下定義的陣列 定義乙個3行4列的動態二維陣列 include include define rows 3 define cols 4...

二維陣列及二維陣列的遍歷

一 如果陣列的元素是一維陣列 則該陣列是二維陣列 如果陣列的元素是二維陣列 則該陣列是三維陣列 注意 二維陣列的長度 是陣列內一維陣列的個數 獲取二維陣列內的元素 第一步獲取該元素在哪乙個一維陣列內 第二步獲取該元素在一維陣列的那個位置 false var arr 1,2,3 var arr1 你好...

二維動態陣列

之前都是寫的小程式,一直用的靜態陣列,也沒出現問題。可是,最近碰到大型程式和工程,這時就要用動態陣列了。因為靜態陣列時儲存在棧中的,而動態陣列儲存在堆中。計算機的棧只有1m大小,而堆可以理論上達到計算機記憶體大小,可見當大型工程資料量非常大時,必須使用動態陣列了。c 的動態陣列的建立和刪除要用到ne...