new/delete多維陣列/malloc分配動態二維陣列
阿新 • • 發佈:2019-02-04
new用法:
1.開闢單變數地址空間
1)new
int; //開闢一個存放陣列的儲存空間,返回一個指向該儲存空間的地址.int
*a = new int 即為將一個int型別的地址賦
值給整型指標a.
2)int
*a = new int(5)作用同上,但是同時將整數賦值為5
2.開闢陣列空間
一維: int *a = new
int[100];開闢一個大小為100的整型陣列空間
一般用法: new 型別 [初值]
C++ delete用法:
1. int
*a = new int;
delete a; //釋放單個int的空間
2.int
*a = new int[5] ;
delete [] a; //釋放int陣列空間
要訪問new所開闢的結構體空間,無法直接通過變數名進行,只能通過賦值的指標進行訪問.
用new和C++ 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法
如果你想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]
- #include <stdio.h>
- #include <stdlib.h>
- void main()
- {
- int nrows,ncolumns;
- int **Array;
- int i,j;
- printf("please input nrows&ncolumns:/n");
- scanf("%d%d",&nrows,&ncolumns);
- Array=(int **)malloc(nrows*sizeof(int *));
- for(i=0;i<nrows;i++)
- Array[i]=(int *)malloc(ncolumns*sizeof(int));
- for(i=0;i<nrows;i++)
- {
- for(j=0;j<ncolumns;j++)
- {
- Array[i][j]=1;
- printf("%d ",Array[i][j]); //動態陣列的成員都可以用正常的陣列下標 Array[i][j]
- }
- printf("/n");
- }
- free(Array);
- }
2. 讓陣列的內容連續, 但在後來重新分配列的時候會比較困難, 得使用一點指標算術:
- #include <stdio.h>
- #include <stdlib.h>
- void main()
- {
- int nrows,ncolumns;
- int **Array;
- int i,j;
- printf("please input nrows&ncolumns:/n");
- scanf("%d%d",&nrows,&ncolumns);
- 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;
- for(i=0;i<nrows;i++)
- {
- for(j=0;j<ncolumns;j++)
- {
- Array[i][j]=1;
- printf("%d ",Array[i][j]); //動態陣列的成員都可以用正常的陣列下標 arrayx[i][j]
- }
- printf("/n");
- }
- free(Array);
- }
3. 同一個單獨的動態分配的一維陣列來模擬二維陣列:
- #include <stdio.h>
- #include <stdlib.h>
- void main()
- {
- int nrows,ncolumns;
- int *Array;
- int i,j;
- printf("please input nrows&ncolumns:/n");
- scanf("%d%d",&nrows,&ncolumns);
- Array=(int *)malloc(nrows*ncolumns*sizeof(int *));
- for(i=0;i<nrows;i++)
- {
- for(j=0;j<ncolumns;j++)
- {
- Array[i*nrows+j]=1;
- printf("%d ",Array[i*nrows+j]); //用 array3[i * ncolumns + j] 訪問第 i, j 個成員
- }
- printf("/n");
- }
- free(Array);
- }