//二位数组参数传递
//1.
void display1(int arr[][4], const int rows)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < 4; j++)
{
cout << arr[i][j] << ' ';
}
cout << endl;
}
cout << endl;
}
//2.
void display2(int(*parr)[4], const int rows)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < 4; j++)
{
cout << parr[i][j] << ' ';
}
cout << endl;
}
cout << endl;
}
//parr[i]等价于*(parr+i)
//3.
void display3(int **parr, const int rows, const int cols)
{
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < cols; ++j)
{
cout << *((int*)parr + i * cols + j) << " "; //注意:(parr+i*cols+j), 不是(arr+i*rows+j), 不能使用parr[i][j]
}
cout << endl;
}
cout << endl;
}
void display4(int **parr, const int rows, const int cols)
{
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < cols; ++j)
{
cout << parr[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
int main()
{
int rows = 3;
int cols = 4;
int arr[][4] = { 0,1,2,3,4,5,6,7,8,9,10,11 };
display3((int**)arr, rows, cols);//不能使用display4
cout << "=======" << endl;
//动态二位数组
int **p;
p = new int*[rows];//创建行指针(数组指针)
for (int i = 0; i < rows; ++i)
{
p[i] = new int[cols]; //为每一行分配空间
}
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
p[i][j] = i * cols + j;
display4(p, rows, cols);
//删除行数组空间
for (int i = 0; i < rows; ++i)
delete[] p[i];
//删除行指针
delete[] p;
p = nullptr;
//一次性分配空间
int **p1;
p1 = new int*[rows];
p1[0] = new int[rows*cols];
for (int i = 0; i < rows; ++i)
p1[i] = p1[0] + cols*i;
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
p1[i][j] = i * cols + j;// 或者 *(p1[0]+i*cols+j) = i * cols + j;
display4(p1, rows, cols);
display3((int**)p1[0], rows, cols);
delete[] p1[0];
delete[] p1;
}