精華區beta C_and_CPP 關於我們 聯絡資訊
※ 引述《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)