常规的方法当然就是a[][]方式,这里主要介绍另外两种方法:
方法一:
const int ROW = 3;
int size = 5;
int (*pi)[ROW] = new int[size][ROW];//注意不要写成int (pi*)[ROW]
操作方法:
for ( i=0; i<ROW; ++i )
{
for ( int j=0; j<size; ++j )
{
pi[i][j] = k++;//初始化
cout <<setw(2) <<pi[i][j] <<' ';//输出
}
cout <<endl;
}
内存释放:
delete[] pi;
pi=NULL;
缺点:ROW必须是已知。
优点:调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用)。
方法二:
使用指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组:
定义:
int **b=new int*[row]; //分配一个指针数组,将其首地址保存在b中
for(i=0;i<row;i++) //为指针数组的每个元素分配一个数组
b[i]=new int[col];
操作方法:
for ( i=0; i<row; ++i )
{
for ( int j=0; j<col; ++j )
{
b[i][j] = k++;//初始化
cout <<setw(2) <<b[i][j] <<' ';//输出
}
cout <<endl;
}
内存释放:
for(i=0;i<row;i++)
{
delete [col] b[i];
b[i]=NULL;
}
delete [row] b;
b=NULL;
缺点:非连续储存,内存释放烦琐,双重指针。
优点:调用直观, row,col可以不是已知。
该方法定义的动态二维数组的释放需先释放指针数组每个元素指向的数组,然后再释放该指针数组。
方法三:
同样是使用指针数组,然后使每一个指针元素指向一个数组,与方法二类似,写法不同:
int *matrix[5];
for(int i=0;i<5;i++)
{
matrix[i]=new int[5];
for(int j=0;j<5;j++)
{
matrix[i][j]=i+j;
cout<<matrix[i][j]<<" ";
}
cout<<endl;
}
内存释放:
for(int i=0;i<5;i++)
delete[] matrix[i];
cout<<endl;
注:
数组指针:int *a[5]它是一个含有5个整形指针元素的数组,它含有5个指针;
int (*a)[5]则表示它是一个指向含有5个元素的数组的指针,即它一个指针,如果是二维数组,则它必须含有5列;三维的则需要后两维也相同,如:int (*matri)[5][6]=new int[4][5][6]; 后面的两维必须相同。
参考: C++ Primer(第三版)
http://blog.csdn.net/livelylittlefish/article/details/2186175
http://blog.csdn.net/danky/article/details/1473025
http://xingyunbaijunwei.blog.163.com/blog/static/76538067201172732229549/