二維陣列傳參與動態宣告詳解

2021-08-29 02:53:18 字數 2453 閱讀 7190

二維陣列在棧上分配,各行位址空間連續

定義的時候,擁有兩種形式

第一種是指明行數和列數

int array[3][3] = ,,};
第二種是不指明第一維,而指明第二維

int array[3] = ,,};
而在子函式宣告的時候,有三種方式一種是指明形參的行數和列數

int func(int array[3], int m, int n) 

int main() ,,};

...

func(array,3,3);

...

}

第2種雖然函式引數的限定降低了,但仍需要在棧上預先分配一定大小的二維陣列,程式整體並不是完全的泛用。為了進一步提高泛用性,把二維陣列空間的分配也動態化,使用malloc()在堆上分配空間:

int **array;

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

for(i=0;i這時,在分配空間的作用域裡,對0值得注意的是,雖然malloc()每次分配的空間在位址上是連續的,但是多次malloc()分配的空間之間並不一定是連續的,這與在棧上分配的二維矩陣有著根本的不同,對於二維陣列array[3][3],不能再用array[1][4]來訪問array[2][1]了,前者位址越界。而且如果malloc申請的空間太多了 堆上可能就容納不下了 到頭來還是得考慮用棧實現分配。

用堆上分配的一維陣列表示二維陣列,函式引數使用指標形式

用一維陣列來實現二維陣列,是一種折中方案,但是很好理解,也不易出錯。這樣分配的陣列空間是連續的。使用時需要把兩維下標轉化為一維下標。

#include #include #include int func(int *array, int m, int n)

}// function to initialize the two-dimensional array

void init_2d(int *a, int x, int y)

printf("\n");

}}int main()

另外,這種分配方式仍然是在棧上,相關討論可見於

固定矩陣的大小,可以省略二維矩陣的第一維

#include #include #include int func(int *array, int m, int n)
動態開闢二維陣列

#include //包含輸入輸出函式

#include //包含動態記憶體分配函式。

int main()

//釋放記憶體

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

free(p[i]);

free(p);

return 0;

}

記住要使用free

動態開闢一維陣列

void dynamiccreate1array()

{ int len;

cout<

cin>>len;

int *p = new int[len];

cout<

for(int i = 0; i < len; i++)

cin>>p[i];

cout<

void dynamiccreate2array()

{ int m,n;

cout<

cin>>m>>n;

//動態開闢空間

int **p = new int*[m]; //開闢行

for(int i = 0; i < m; i++)

p[i] = new int[n]; //開闢列

cout<

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

for(int j = 0; j < n; j++)

cin>>p[i][j];

cout<

void vectorcreate()

{ int m,n;

cout<

cin>>m>>n;

//注意下面這一行:vector "之間要有空格!否則會被認為是過載 "> > "。

vector> p(m,vector(n));

cout<

for(int i = 0 ; i < m ; i++)

for(int j = 0; j < n; j++)

cin>>p[i][j];

cout<

動態二維陣列的傳參與刪除

昨晚有道程式設計題,題目不難,但是寫 卡在了很多小問題上,才發現對於c 的基礎知識很多其實是不清楚的 1 首先,對於面向行的輸入 int a,b cin a cin b 這就是面向行的輸入,如果一行輸入兩個數值,空格間隔 cin a b 對於字串 陣列型 char str 100 gets str ...

二維陣列的動態宣告

看書的時候看到二維陣列動態宣告這個方式,例程如下 int a new int m for int i 0 i m i a i new int n 對指標的指標呼叫不是很理解,於是在網上查了一下,發現下面這種講解比較通俗易懂 下面三種定義形式怎麼理解?怎麼動態分配空間?1 int ptr 2 int ...

詳解go 動態陣列 二維動態陣列

go使用動態陣列還有點麻煩,比python麻煩一點,需要先定義。動態陣列申明 var dynaarr string 動態陣列新增成員 dynaarr append dynaarr,one go 結構體陣列 go package main import fmt type a struct func m...