有两种类型的二维数组:
维数固定
这一类的数组存放在栈上,是连续存储的。任意维度固定的多维数组都可以看做是一维数组,可以用a[i+j*n]的形式来访问。
int ia[2][2] = {2,3,4,5}; //4个元素时连续排列的内存段
//void f(int p[][2], int row, int col )//这种方式必须事先知道除第一维以外的维度的大小,不灵活
void f(int *p , int row, int col )//转化为一维数组来访问
{
for(int i = 0; i < row; i++)
{
for(int j =0 ;j < col; j++)
{
cout<<p[i*col+j]<<" ";
}
}
cout<<endl;
}
下面的代码是错误的:
int ** p= ia;//ia的类型是char (*)[2],而不是**int
这是因为,**p指向首地址,因为int **p一次解引用为地址指针,而非堆上的指向数组的指针,所以二次解引用会出错。
动态数组
这类数组存放在堆上。只有每行内是连续排列,各行并不一定连续排列。
int **p = new int*[2]; //只有每行内是连续排列,各行并不一定连续排列
for ( int i = 0; i < 2; i++ )
{
p[i] = new int[2];
}
for ( int i = 0; i < 2; i++ )
{
for ( int j = 0; j < 2; j++ )
{
p[i][j] = ia[i][j];
}
}
这类数组的访问,可以传递多维指针(这里是二维**p)和维度,直接用a[i][j]访问。
void f(int **p , int row, int col )
{
for(int i = 0; i < row; i++)
{
for(int j =0 ;j < col; j++)
{
cout<<p[i][j]<<" ";
}
}
cout<<endl;
}