前兩天寫個程式,傳引數的時候想傳個二維陣列進去,結果悲劇了,函式寫成fun (int **p){},原來沒有這麼寫過,
以為這麼寫也是對的,結果錯了,查了些資料,做個總結。
fun (int **p){}這裡面的int **p //這裡的p不是二維陣列的指標,而是指向指標的指標,即二級指標。
正確的二維陣列的指標應該是:int a[2][2];int (*p)[2];//定義時無論陣列維數,只可忽略第一維
例如:int a[2][2]=;
int **p=(int**)a;//強制將二維陣列指標轉為指向指標的指標
則此時p[0]=0;p[1]=1;p[2]=2;p[3]=3; //這裡也是碰巧了, 指標和int都是4位元組,恰巧每次移動到了對應值得位置;如果換成別的型別,或者64位裝置就不會這麼巧了;
而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),均引用了非法記憶體所以說,二位陣列並不能簡單的轉換成指向指標的指標。
二維陣列其實只是乙個指標,而二級指標是指向指標的指標,所以二者並不等價。如上例所示:int a[2][2];
a是指向整個陣列的首位址,並不是int **;所以不要指望向函式fun裡面傳實參 p=a;
#include
void fun(char ** p)
int main(int argc, char* argv)
;fun((char **)data);
return 0;
}
二級指標和二維陣列詳解
乙個函式形如 void f float p float p 其實這裡的p並不是乙個二位陣列的指標,只不過是乙個指向指標的指標 像你這樣訪問肯定是會出問題的。例如 float a 2 2 float p float a 強制將二維陣列指標轉為指向指標的指標 則此時p 0 0 p 1 1 p 2 2 p...
二維陣列 指標陣列 陣列指標 二級指標
include 指標陣列 array of pointers,即用於儲存指標的陣列,也就是陣列元素都是指標 陣列指標 a pointer to an array,即指向陣列的指標 int a 4 指標陣列 表示 陣列a中的元素都為int型指標 優先順序高於 元素表示 a i int a 4 陣列指標...
二維陣列與二級指標
今日在論壇上看到有人問到指標 級指標和二維陣列 我們知道char array abcdef array是陣列的首位址,那麼在二維陣列中array當然也是陣列的首位址,看看這個定義char array 3 怎麼知道的呢?定義這樣乙個陣列,在vc除錯視窗中 我們看到 array 0x64324234 a...