如何在 c 中動態定義二維陣列

發布 科技 2024-03-11
11個回答
  1. 匿名使用者2024-02-06

    在 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個段; 對於動態分配的二維陣列,行指標陣列是乙個連續的一維陣列,其中儲存了一維指標,這些指標值不一定是連續的,但與記憶體使用量有關。

    還可以看出,動態二維陣列比真正的二維陣列多了一行多餘記憶體的指標陣列。

    動態定義的二維陣列中每一行的列寬可以是可變的(通常為相同的寬度); 真正的二維陣列必須具有相同的每行列寬。

    乙個真正的二維陣列在其定義的函式結束後自動釋放; 動態定義的二維陣列,需要用於顯式 ** 的記憶體釋放。

  2. 匿名使用者2024-02-05

    首先定義指標。

    例如:int * a;

    然後在需要時定義陣列:

    a =new int[8][8];

    它是定義乙個由 64 個數字組成的二維陣列。 它也可以是這樣的:

    a =new int[8]

    它定義了乙個列數不定的二維陣列,陣列名稱為 a,例如 a[0][2]。

  3. 匿名使用者2024-02-04

    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]

    沒錯。

  4. 匿名使用者2024-02-03

    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

  5. 匿名使用者2024-02-02

    #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) *空閒記憶體*

  6. 匿名使用者2024-02-01

    下面正確地定義了乙個二維陣列 -- 下面正確地定義了乙個陣列(減去二維字)。

    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

  7. 匿名使用者2024-01-31

    首先,讓我們弄清楚二維陣列應該是乙個指標。

    A 是因為我不知道確切的大小,所以編譯錯誤 C 和 A 相同,D 是由於分配二維陣列的問題。

    b 是指標。

    不管陣列是什麼,都是乙個連續的記憶體空間,所以有對應的入口位址,這就明白了,不管陣列是什麼,都是這樣的,二維其實是一維的,但是我覺得很方便。

  8. 匿名使用者2024-01-30

    你確定你沒有弄錯嗎? int a= 是乙個一維陣列!

    二維陣列兩者都不是。

    a,只需給出初始值即可。

    C不是這樣寫的,編譯錯誤。

    d.

  9. 匿名使用者2024-01-29

    首先,你需要了解乙個二維陣列的真正含義,第乙個維度是一組資料的起始位址,第二個維度是某個資料集中的某個值。 其次,你需要知道 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(後面的三個零是系統預設值)。

    希望對你有所幫助。 ^-

  10. 匿名使用者2024-01-28

    由於是動態建立的,因此建立的二維陣列的行數和列數應該是“通用的”,即“使用者”應該決定二維陣列的大小。 這很難。 因為二維陣列需要涉及行指標,而且每行的列元素數量需要固定,所以用這個想法是沒有辦法實現“普遍性”的。

    因此,必須清楚地了解,所謂的二維陣列的元素仍然以一維模式儲存在記憶體中。 說實話,二維陣列在自然界中是不存在的。

    既然如此,“構造”乙個所謂的二維陣列就足夠了,只要它提供足夠有用的函式(工具)來操縱二維陣列。

    綜上所述,接受使用者確定的二維陣列的行列數值,申請一維陣列的空間,根據二維陣列方法進行定位和操作。

    為簡單起見,我使用了以下定義,您可以更改型別以滿足您的需求:

    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)

    使用上述函式作為工具,完成二維陣列初始化、賦值、取值等一系列操作,如果需要比較,還需要編寫比較函式。

  11. 匿名使用者2024-01-27

    (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

相關回答
11個回答2024-03-11

方法如下。

如果QQ空間沒有顯示(未更新),建議嘗試清除IE快取,重新開啟檢視。 如果清除IE快取,仍不顯示(不更新)空間動態,請參考以下資訊: >>>More

8個回答2024-03-11

簡要步驟:win-->設定-->控制面板-->輔助功能選項-->滑鼠-->m-->s --optional)--a(應用程式)。 >>>More

13個回答2024-03-11

1.對我們來說,CAD預設不顯示線寬,這意味著當我們使用CAD繪圖時,繪製的線條的粗細是相同的。 首先,我們點選 格式 在工具欄上方。 >>>More

21個回答2024-03-11

你好! 親愛的,建議您去小公尺售後服務測試小公尺授權維修點的真實性。 >>>More

12個回答2024-03-11

如何在word中打出下劃線 石老師:word中不僅有下劃線,有時我們還需要下劃線,那麼如何在word中打出下劃線。 例如,上述效果的輸入法: >>>More