乙個函式形如:
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[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),均引用了非法記憶體
所以說,二位陣列並不能簡單的轉換成指向指標的指標。
正確的指向二維陣列的指標應該是:
float a[5][10];
float (*p)[10];//只需要定義為指向第二維的指標,忽略第一維
p=a;
p[0][1]=a[0][1];
二級指標和二維陣列並不等價。
二級指標是乙個指向指標的指標
而二維陣列其實就是乙個指標,char a[3][4]; a是指向整個二維陣列的首位址。它相當於(char *)[n],並不是char **;
所以不能直接:t=a;
要這樣:t = (char **)a;
我們知道char array=」abcdef」; array是陣列的首位址,
那麼在二維陣列中array當然也是陣列的首位址,
看看這個定義char array[3] =;
怎麼知道的呢?定義這樣乙個陣列,在vc除錯視窗中
我們看到:
array ---------0x64324234
|------array[0]---0x64324234 「ab「
|------array[1]---0x64324337 「cd「
|------array[2]---0x6432433a 「ef」
已經很明白了,實際編譯器是這樣實現二維陣列的,實際上array是「一維指標陣列「的首位址,其中每乙個元素指標都對應乙個字串,那麼好我們來看看是否可以這樣來使用array二維陣列.
char **parray = array;編譯器提示出錯,怎麼辦呢?加個(char **)試試,仍然出錯,設斷看一下parray的值和array的值是相等的,但我們是否可以象使用array那樣來同樣輸出字串呢?很明顯是不行的,編譯器不會把parray+i處理成parray+i*3尋找到第i個指標的位址,而只是簡單的加了乙個i.這說明編譯器只做了很簡單的將位址值賦給了parray,而它實際沒有任何意義.我們不能用它來訪問任何資料.很奇怪嗎?
再來看看這樣定義char *p = ;定義了乙個指標陣列.char **sp = p;這樣的用法經常看到,為什麼這樣就可以使用sp來訪問字串了呢,的確編譯器在編譯的時候識別出了sp是乙個指向一維陣列的指標的指標,那麼我們就可以把它做為陣列名來操縱整個陣列了
二維陣列和二級指標
前兩天寫個程式,傳引數的時候想傳個二維陣列進去,結果悲劇了,函式寫成fun int p 原來沒有這麼寫過,以為這麼寫也是對的,結果錯了,查了些資料,做個總結。fun int p 這裡面的int p 這裡的p不是二維陣列的指標,而是指向指標的指標,即二級指標。正確的二維陣列的指標應該是 int a 2...
二維陣列 指標陣列 陣列指標 二級指標
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...