作者cplusplus (C++:ID暗藏玄機)
看板C_and_CPP
標題Re: [問題] 請教關於字串當成參數傳入的問題
時間Sun Nov 6 01:38:03 2005
※ 引述《UNARYvvv (有趣生活)》之銘言:
: ※ 引述《asoedarren (別再咪我)》之銘言:
: : char * FileName[3][2]=
: : {
: : {"aaaaa","bbbbb"},
: : {"ccccc","dddddddd"},
: : {"eeeeeeee","fffff"}
: : };
: 改成這樣:
: void func(char * fileName [3][2] ){}
: 至於原因的話,可以思考一下:
: 編譯器總得要知道 *FileName (也就是 FileName[0]) 實際佔用多少 bytes 吧?
: 不然你假如要用 FileName[1] 的時候
: 編譯器怎麼計算要從 FileName[0] 開始越過幾個 bytes 才到達 FileName[1] 呢?
: 參考看看~
至於為什麽 不可把一個多維陣列 傳給 一個指標的指標的....的指標
以下稍微舉例說明
雖然
char ***a = ..... ;
char *b[x][y]= ...... ;
兩個都是可以這樣做
a[1][2]=??;
b[1][2]=??;
不過實際上代表不一樣的意思
a[1][2] => *(*(a+1)+2) => *( *( a + sizeof(char***)*1 ) + sizeof(char**)*2 )
b[1][2] => *(b + sizeof(char*)*y*1
+ sizeof(char*)*2 )
因為 b 是陣列 如版友所說的 取陣列的元素必須算出該元素跟起始位址的偏移量
所以 b[1][2] 的位址就像上面那樣計算出來以後再對那個位置取值
至於 a 是一個char指標的指標的指標 所以
a[1] 其實是 *(a+1) => *(a + sizeof(char***)*1)
得到這個char**的值 *(a+1) 以後 再做一次指標的存取運算 *(*(a+1)+2)
所以 a[1][2] => *( *( a + 1 ) + 2 )
=> *( *( a + sizeof(char***)*1 ) + sizeof(char**)*2 )
也就是是一般對指標作加法然後取值 => *(*(a+1)+2)
跟上面 b 的算位址的策略不同~ b要取一個值只要算出位址然後再取直
a要取一個值 必須經過好幾次的運算取值
a[1][2] =
*(
*(a+1)+2) 兩個
b[1][2] =
*( b + sizeof(char*)*y*1 + sizeof(char*)*2 ) 1個
所以當然不可以把上面兩個互傳
而常常一維剛好可以互相代換 是因為算位址的方式一樣
void f(char *a);
char b[100];
f(b);
如果你想把陣列傳給指標形式的參數
你可以用一點方式
a[0] = b+0; //b+sizeof(char*)*y*0 算出邏輯上相對應的位置
a[1] = b+1; //b+sizeof(char*)*y*1
a[2] = b+2; //b+sizeof(char*)*y*2
.........
// 說明一下
// 在程式碼寫 b+0 即可算出位址 compiler會依據b的型態自己計算位移
// 後面的表示式指的是真正compiler的計算過程
// 型態上自己做一下相對應的轉換就好了
講得好雜亂啊 如果看不懂就抱歉了~~
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.217.14
推 asoedarren:感謝兩位前輩回答.. 11/06 20:39
推 UNARYvvv:這個..推啦!! 11/07 00:39
※ 編輯: cplusplus 來自: 140.115.217.14 (11/07 07:43)