-
在 C++ 中動態定義二維陣列的方法是:
定義二維指標。
分配線指標陣列。
為每一行分配乙個資料陣列。
使用二維陣列。
釋放每一行的資料陣列(當記憶體不再使用時,將手動釋放記憶體)。
釋放行指標陣列。
#include
#include
using namespace std ;
#define row 5
#define col 10
int main()
int **pp,i,j;
pp=new int *[row];分配乙個行指標陣列,並將陣列的第乙個位址返回給 pp
for( i=0;i
C++ 動態定義乙個二維陣列,實際上,首先分配乙個指標陣列,然後為每個指標陣列分配相應的資料陣列。 與真正的二維陣列的區別在於:
二維陣列的儲存空間在記憶體中是連續的,它實際上是乙個一維陣列,但一維陣列被分成了n個段; 對於動態分配的二維陣列,行指標陣列是乙個連續的一維陣列,其中儲存了一維指標,這些指標值不一定是連續的,但與記憶體使用量有關。
還可以看出,動態二維陣列比真正的二維陣列多了一行多餘記憶體的指標陣列。
動態定義的二維陣列中每一行的列寬可以是可變的(通常為相同的寬度); 真正的二維陣列必須具有相同的每行列寬。
乙個真正的二維陣列在其定義的函式結束後自動釋放; 動態定義的二維陣列,需要用於顯式 ** 的記憶體釋放。
-
首先定義指標。
例如:int * a;
然後在需要時定義陣列:
a =new int[8][8];
它是定義乙個由 64 個數字組成的二維陣列。 它也可以是這樣的:
a =new int[8]
它定義了乙個列數不定的二維陣列,陣列名稱為 a,例如 a[0][2]。
-
1. 新建 動態定義陣列。
2.因為new是用來動態開闢空間的,所以它當然可以用來開闢乙個陣列空間。 這樣,以下語句:
int size=50;
int *p=new int[size];沒錯。
3. 但是二維動態陣列也可以這樣定義嗎?
int size=50,column=50;
int (*p)[column]=new int [size][column]
1)首先,new int[size][column]是動態生成時確定的,所以沒有錯,那麼就是int(*p)[column],這句話是有問題的,為什麼這句話錯了,那是因為,這是乙個定義語句,定義語句先由編譯器編譯,編譯器執行到這裡, 它發現該列不是常量,因此無法編譯。
2)編譯器之所以認為該列不是常量,是因為在編譯階段,編譯器的作用是檢查語法錯誤,而預先分配的空間,它不執行程式,因此,它不執行賦值語句(它只檢查此語句上的錯誤,並分配空間), 所以在編譯階段,它會把列看作是乙個變數。所以上面對二維陣列的定義是錯誤的,它不能被編譯。
將其更改為:int size=50
int (*p)[50]=new int [size][50]
沒錯。
-
1.先說二維,可以這樣理解
int n[3] 有 3 個 int
然後,int m[5][3] 有 5 個 int[3] 賦值:
n[1] = 3 給出 3 比 1。
m[4]=m[4] 是乙個 int[3] 型別,如此賦值,即如此賦值:
m[4] 的 [0] 為 5:m[4][0]=5
m[4][1]=9
m[4][2]=4
int k[4][5][3] 有 4 個 int[5][3]2,示例:
int***creategrid(int m,int n,int t)
int***tt = null;
tt = (int***malloc(sizeof(int)*m);
for(int i=0;i
-
#include
int **creategrid(unsigned m, unsigned n, unsigned t);建立整數 3D 陣列
void freegrid(int **c1,unsigned m,unsigned n);釋放整形 3D 陣列
static void free1(int **c1,unsigned n);
static void free2(int **c1,unsigned m,unsigned n,unsigned k);
int **creategrid(unsigned m, unsigned n, unsigned t) *建立乙個整數 3D 陣列*
if(i!=m) *2D 分配失敗,釋放了之前分配的記憶體*
for(i=0;i!=m;++我)指定第三個維度
if(j!=n)
break;
if(j!=n) *第三維分配失敗,釋放先前分配的記憶體*
return c1;
static void free1(int **c1,unsigned m) *釋放前 m 個指標*
static void free2(int **c1,unsigned m,unsigned n,unsigned k)
void freegrid(int **c1,unsigned m,unsigned n) *空閒記憶體*
-
下面正確地定義了乙個二維陣列 -- 下面正確地定義了乙個陣列(減去二維字)。
a) int a[ ]3];語法錯誤,沒有初始化,不允許 [blank],陣列的大小不是不確定的。
b) int a[ ]= --陣列定義正確,它是乙個一維陣列,陣列只有 1 個元素,初始化值為 2*3,即 6。
c) int a[ ]3]=;- 語法錯誤,大括號未填充初始化值。
d) int a[2][3]=,,} 語法錯誤,陣列宣告為 2 行 3 列,但初始化為 3 行 2 列。如果是 int a[3][2]=,,},則語法正確。
所以答案是b
-
首先,讓我們弄清楚二維陣列應該是乙個指標。
A 是因為我不知道確切的大小,所以編譯錯誤 C 和 A 相同,D 是由於分配二維陣列的問題。
b 是指標。
不管陣列是什麼,都是乙個連續的記憶體空間,所以有對應的入口位址,這就明白了,不管陣列是什麼,都是這樣的,二維其實是一維的,但是我覺得很方便。
-
你確定你沒有弄錯嗎? int a= 是乙個一維陣列!
二維陣列兩者都不是。
a,只需給出初始值即可。
C不是這樣寫的,編譯錯誤。
d.
-
首先,你需要了解乙個二維陣列的真正含義,第乙個維度是一組資料的起始位址,第二個維度是某個資料集中的某個值。 其次,你需要知道 a[4] 表示二維陣列 a 的每個維度都是由四個元素組成的一維陣列。 編譯器可以根據你分配給 a 的初始值的數量來計算第乙個維度的長度(元素總數為 4,如果不可整除,則長度增加 1,並且應該有幾個沒有初始值的陣列元素)。
a[3] 的意思從表面上看是正確的,但問題是編譯器不能直接識別其二維的確切長度(可以認為,如果初始值的總數為 2,則 a 的第二維長度可以認為是 1 或 2,..)。這將產生錯誤。 因此,它可以定義為 a[4]= 而不是 a[3]=。
至於你補充的問題,我其實已經談過了。 因為初始值是5個元素,5 4=1,但是不能被分割,所以要加1,也就是說,實際的陣列a本質上定義為a[2][4],其內部元素為:
5000(後面的三個零是系統預設值)。
希望對你有所幫助。 ^-
-
由於是動態建立的,因此建立的二維陣列的行數和列數應該是“通用的”,即“使用者”應該決定二維陣列的大小。 這很難。 因為二維陣列需要涉及行指標,而且每行的列元素數量需要固定,所以用這個想法是沒有辦法實現“普遍性”的。
因此,必須清楚地了解,所謂的二維陣列的元素仍然以一維模式儲存在記憶體中。 說實話,二維陣列在自然界中是不存在的。
既然如此,“構造”乙個所謂的二維陣列就足夠了,只要它提供足夠有用的函式(工具)來操縱二維陣列。
綜上所述,接受使用者確定的二維陣列的行列數值,申請一維陣列的空間,根據二維陣列方法進行定位和操作。
為簡單起見,我使用了以下定義,您可以更改型別以滿足您的需求:
typedef int user_type;
定義乙個“控制頭”,用於控制二維陣列(矩陣)並由三個成員組成。
typedef struct matrix
matrix;
matrix *initmatrix(int row, int col);初始化二維陣列。
user_type getelementat(matrix matrix, int i, int j);獲取指定下標的元素。
void setelementat(matrix matrix, int i, int j, user_type val);為指定下標的元素賦值。
void destroymatrix(matrix *matrix);銷毀二維陣列。
void destroymatrix(matrix *matrix)
void setelementat(matrix matrix, int i, int j, user_type val)
user_type getelementat(matrix matrix, int i, int j)
matrix *initmatrix(int row, int col)
使用上述函式作為工具,完成二維陣列初始化、賦值、取值等一系列操作,如果需要比較,還需要編寫比較函式。
-
(1)第二個維度是已知的。
char (*a)[n];指向陣列的指標 a = (char (*n])malloc(sizeof(char *)m);
printf("%d", sizeof(a));4. 指標 printf("%d", sizeof(a[0])) n,乙個一維陣列。
free(a);
2)第乙個維度是已知的。
char* a[m];指標陣列 int i;
for(i=0; i
3)兩個維度都是未知的。
char **a;
int i;
a = (char **malloc(sizeof(char *)m);分配指標陣列。
for(i=0; i
方法如下。
如果QQ空間沒有顯示(未更新),建議嘗試清除IE快取,重新開啟檢視。 如果清除IE快取,仍不顯示(不更新)空間動態,請參考以下資訊: >>>More
簡要步驟:win-->設定-->控制面板-->輔助功能選項-->滑鼠-->m-->s --optional)--a(應用程式)。 >>>More
1.對我們來說,CAD預設不顯示線寬,這意味著當我們使用CAD繪圖時,繪製的線條的粗細是相同的。 首先,我們點選 格式 在工具欄上方。 >>>More
如何在word中打出下劃線 石老師:word中不僅有下劃線,有時我們還需要下劃線,那麼如何在word中打出下劃線。 例如,上述效果的輸入法: >>>More