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;
}