void f(float **p){
/* 想要在函數體中按二維數組的方式訪問*/
p[1][1] = 0;//編譯OK,運行出錯(非法訪問)
}
float **p; //其實這裏的p並不是一個二維數組的指針,只不過是一個指向指針的指針像你這樣訪問肯定是會出問題的。
例如:
float a[2][2]={0,1,2,3};
float **p=(float**)a;//強制將二維數組指針轉爲指向指針的指針
則此時
p[0]=0;
p[1]=1;
p[2]=2;
p[3]=3;
而
p[0][0]=*(*(p+0)+0)=**p;
p[0][1]=*(*(p+0)+1);
對於p[0][0]:由於*p=0; ====> **p=*(0);引用地址爲零的內存,必然是錯誤的。
對於p[0][1]=*(*p+1)====>*(4),引用了非法內存
同樣,對於p[1][0]=*(1),p[1][1]=*(5),均引用了非法內存
所以說,二位數組並不能簡單的轉換成指向指針的指針。