二維「陣列」轉換成二維「指標」

2021-08-28 23:45:21 字數 2689 閱讀 6093

查詢了下資料,發現了論壇大家的討論。

我們先看下二維陣列與二級指標問題:cannot convert from 'double [10][10]' to 'double ** '

例如:

double arry[5][10] = ;       

double** pp;

pp=arry;

直接的賦值會提示錯誤:cannot convert from 'double [10][10]' to 'double ** '

解決方法:

double arry[5][10] = ;       

double (*p)[5];

for(int i=0;i<5;i++)

p[i]= arry[i];

這樣既可解決問題。乙個函式形如:

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][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是乙個指向一維陣列的指標的指標,那麼我們就可以把它做為陣列名來操縱整個陣列了.

解決一:將二維陣列定義為全域性變數。

全域性變數盡量少用,做專案時,可能會導致其他問題。

解決二:由於陣列是不可修改的左值,所以在c/c++中函式的返回值不能是陣列,但可以返回乙個指向二維陣列首元素的指標。例如:

int (*fun(int(&)[3][3]))[3];

......

int main( void )

int ( *fun( int( &a )[3][3] ) )[3]

大神的解釋是:

int ( *p )[3]你應該知道是什麼吧?乙個指向int[3]陣列的指標,然後用fun( int( &a )[3][3] )代替p,由於fun是乙個函式,於是代替p後,就是乙個返回陣列指標的函式,這個函式的引數是int[3][3]陣列的引用。

解決三:定義乙個結構體,存放二維陣列的指標,行數和列數,getinfo分配這個結構,賦值,並返回此結構的指標。

typedef struct  myresult;
具體下次再議。

集合轉換成二維陣列

name month value 北京大廈 8 10000 南京大廈 6 4577 南京大廈 7 20222 南京大廈 8 23575 港匯大廈 7 14545 港匯大廈 8 54342 現在得到的上面的值,寫個方法把它儲存成以下格式 對應每個月相應的月份 北京大廈,0,0 0,0,0,0 0 10...

二維陣列轉換成樹

版本1.0 將標準二維陣列換成樹 param array list 待轉換的資料集 param string pk 唯一標識字段 param string pid 父級標識字段 param string child 子集標識字段 return array function gettree1 list...

二維陣列與二維指標

1.二維陣列的儲存是線性的,可以通過一維指標的方式訪問。如一下 int map 5 5 int mapd map 0 0 則 map i j mapd i 5 j 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...