array[3][3],这时,array占有9个连续的内存单元,地址是连续的,如果真可以直接简单的传给指向指针的指针的,则二维指针取下一个元素地址就是简单的加法了,但是如果传入的指针是int** p; p = new int*[3];呢?
for (int i = 0; i < 3; i++) {
*(p + i) = new int[3];
}
这时二维指针p的元素占有的9个内存单元却不能保证是连续的(只能保证有每行的3个是连续的),取下一行地址时,就不能如上面的那样简单的直接相加了(上一行末元素的地址直接加4),所以得传入一个指向指针的指针才行,如int* p[3](存储的是每行的指针)或者int** p,为p初始化,分配空间;
所以int** p 和int p[row][column]绝对不是一回事。
像下面这样可以正确运行:
#include <iostream>
#include <stdio.h>
using namespace std;
void func(int** array, int row, int column) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < column; j++) {
cout << *(*(array+i) + j) << "\t";
}
cout << endl;
}
}
int main(){
int array[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int* p[3];
p[0] = array[0];
p[1] = array[1];
p[2] = array[2];
func(p, 3, 3); // 如果这里传入array, array[0], &array[0][0],则编译不通过
// 传入int* q = array[0]; int** p = &q;编译通过,但运行时要么错退出,要么输出的结果是错的。
return 0;
}