1. 程式人生 > >new/delete多維陣列/malloc分配動態二維陣列

new/delete多維陣列/malloc分配動態二維陣列

new用法: 1開闢單變數地址空間 1new int //開闢一個存放陣列的儲存空間,返回一個指向該儲存空間的地址.int *a  new int 即為將一個int型別的地址賦             值給整型指標a 2int *a  new int5作用同上,但是同時將整數賦值為5 2開闢陣列空間   一維: int *a  new int[100];開闢一個大小為100的整型陣列空間   一般用法: new 型別 [初值] C++ delete用法: 1 int *a  new int delete a //釋放單個int的空間 2int *a  new int[5]
delete [] a //釋放int陣列空間   要訪問new所開闢的結構體空間,無法直接通過變數名進行,只能通過賦值的指標進行訪問.   用newC++ delete可以動態開闢,撤銷地址空間.在程式設計序時,若用完一個變數(一般是暫時儲存的陣列),下次需要再用,但卻又想省去重新初始化的功夫,可以在每次開始使用時開闢一個空間,在用完後撤銷它.     int **a = new int[5][6],這個根本編譯不過去吧。
如果你想new一個二維陣列出來,應該這樣:

下面看一下二維的
int** a= new int*[5];
for (int i = 0; i < 5; ++i)
{
    a[i] = new int[6];

}
delete的時候,反過來就行了:
for (int i = 0; i < 5; ++i)
{
       delete[] a[i];
}
delete[] a;

三維陣列,與此相同,舉例如下:
int*** a= new int**[5];
for (int i = 0; i < 5; ++i)
{
     a[i] = new int*[6];
     for (int j = 0; j < 6; ++j)
    {
            a[i][j] = new int[7];
     }
}
for (int i = 0; i < 5; ++i)
{
     for (int j = 0; j < 6; ++j)

     {
           delete[] a[i][j];
     }
     delete[] a[i];
}
delete[] a;
vector法
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;

void main()
{
    int row, col;
    cout<<"請輸入行列值:";
    cin>>row
        >>col;

    vector<vector<int> > test(row, vector<int>(col)); //宣告一個二維陣列,注意這裡的空格不能少 

    //初始化,其實不初始化也是可以的,vector預設是0
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            test[i][j] = 0;
        }
    }
    cout<<endl;
    //輸出值
    for (i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            cout<<setw(5)<<test[i][j];
        }
        cout<<endl;
    }
    //輸出行列值
    cout<<"行:"<<test.size()<<endl;
    cout<<"列:"<<test[1].size()<<endl;
}

malloc分配二維陣列

1. 動態陣列的成員都可以用正常的陣列下標 Array[i][j]

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void main()  
  4. {  
  5.      int nrows,ncolumns;  
  6.      int **Array;  
  7.      int i,j;  
  8.      printf("please input nrows&ncolumns:/n");  
  9.      scanf("%d%d",&nrows,&ncolumns);  
  10.      Array=(int **)malloc(nrows*sizeof(int *));  
  11.      for(i=0;i<nrows;i++)  
  12.          Array[i]=(int *)malloc(ncolumns*sizeof(int));  
  13.      for(i=0;i<nrows;i++)  
  14.      {  
  15.          for(j=0;j<ncolumns;j++)  
  16.          {  
  17.              Array[i][j]=1;  
  18.              printf("%d ",Array[i][j]);   //動態陣列的成員都可以用正常的陣列下標 Array[i][j]
  19.          }  
  20.          printf("/n");  
  21.      }  
  22.      free(Array);  
  23. }  

2. 讓陣列的內容連續, 但在後來重新分配列的時候會比較困難, 得使用一點指標算術:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void main()  
  4. {  
  5.      int nrows,ncolumns;  
  6.      int **Array;  
  7.      int i,j;  
  8.      printf("please input nrows&ncolumns:/n");  
  9.      scanf("%d%d",&nrows,&ncolumns);  
  10.      Array=(int **)malloc(nrows*sizeof(int *));  
  11.      Array[0]=(int *)malloc(nrows*ncolumns*sizeof(int));  
  12.      for(i=1;i<nrows;i++)  
  13.          Array[i]=Array[0]+i*ncolumns;  
  14.      for(i=0;i<nrows;i++)  
  15.      {  
  16.          for(j=0;j<ncolumns;j++)  
  17.          {  
  18.              Array[i][j]=1;  
  19.              printf("%d ",Array[i][j]);   //動態陣列的成員都可以用正常的陣列下標 arrayx[i][j]
  20.          }  
  21.          printf("/n");  
  22.      }  
  23.      free(Array);  
  24. }  

3. 同一個單獨的動態分配的一維陣列來模擬二維陣列:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void main()  
  4. {  
  5.      int nrows,ncolumns;  
  6.      int *Array;  
  7.      int i,j;  
  8.      printf("please input nrows&ncolumns:/n");  
  9.      scanf("%d%d",&nrows,&ncolumns);  
  10.      Array=(int *)malloc(nrows*ncolumns*sizeof(int *));  
  11.      for(i=0;i<nrows;i++)  
  12.      {  
  13.          for(j=0;j<ncolumns;j++)  
  14.          {  
  15.              Array[i*nrows+j]=1;  
  16.              printf("%d ",Array[i*nrows+j]);   //用 array3[i * ncolumns + j] 訪問第 i, j 個成員
  17.          }  
  18.          printf("/n");  
  19.      }  
  20.      free(Array);  
  21. }