二维数组在栈上的分配只需要定义声明就可以了,那么如果是动态分配在堆上呢?
使用二级指针(指针的指针):
int **p = new int *[ROWS];
for(int i=0;i<ROWS;i++)
p[i] = new int[COLUMNS];
使用指针数组:
char* p[ROWS];
for (int i = 0; i<ROWS; i++)
{
p[i] = new char[COLUMNS];
}
类似指针数组,先定义一维,再定义另一维
typedef char rowData[COLUMNS];
rowData* p = new rowData[ROWS];
for (int i = 0; i < ROWS;i++)
{
std::snprintf(p5[i],sizeof(p5[i]),"%s","rowData Str...");
}
for (int i = 0; i < 20; i++)
{
std::printf("%s\n", p5[i]);
}
或者这样 (数组指针)
const int column = 3;
int row = 2;
int(*xx1)[column] = new int[row][column];
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
xx1[i][j] = (i + 1) * 10 + j;
std::printf("%d,", xx1[i][j]);
}
std::printf("\n");
}
总的来说,除了二级指针方式之外,其余方式都要先固定其中一个维度,也就是按静态分配,在栈上…
C只支持“数组的数组”这一概念,如果你把它单纯的当作”多维数组”来理解,估计会出问题…
具体可以看下《C专家编程》,里边关于数组和指针的章节,第九、十章,做了很好的描述
数组指针和函数形参的转化可参考下图^_^