观察以下代码:
int main()
{
int a[3][3];
int *p;
int(*q)[3];
int **r;
p = &a[0][0];
//p = a; 错误
q = a;
// q = &a[0][0]; 错误
int **b = new int*[3];
for (int i = 0; i < 3; i++)
b[i] = new int[3];
p = &b[0][0];
r = b;
return 0;
}
虽然&a[0][0]和a在数值上是一样的,但这两个是不同的类型,&a[0][0]是int*类型,而a是int(*)[3]类型,所以上边注释的两句是错的。
而对于动态分配的二维数组而言,b就是int**类型了,这是因为每个b[j]是一个int*类型,而这个int*又是一个一维数组,所以q=b就是错的。而它的这个特征使得在访问动态分配的二维数组的元素时,只能用b[i][j]或 * (*(b+i)+j),而不用像普通二维数组那样用b[i*3+j]。