矩力整合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...