Re: [問題] 原來這樣寫是沒意義的

看板C_and_CPP作者 (sbr)時間16年前 (2009/04/23 08:31), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《QQ29 (我愛阿蓉)》之銘言: : 我一直以為 : 對一個靜態陣列取sizeof 一定可以... : 但我剛剛才發現 : double pp[20]; : init(pp); : void init(double array[]) : { : cout<<sizeof(array); : } : 原來副程式取 怎麼樣都還是印4 : 所以說 其實傳遞array 用 array接 : 根本也跟用*ptr去接是一樣的?? 也都是call by value 複製他的記憶體位置(值) : 讓array指到我的pp ,這樣說對嘛? : 現在才發現這樣= = 不過這是否意味 根本無法利用副程式 去取得 void init(double array[]) 中 formal paratemer array 的語意與 void init(double* array) 中的 array 相同。 但是這不意味著 function 的 formal parameter 不能是 array pointer/reference。 你是可以讓 formal parameter 帶有 array length 的資訊,但因為宣告 array type 的變數時 array length 必須是編譯期常數,所以當 formal parameter 是 array type 的 pointer/reference,實際上是限制了能夠 pass 到 function 的 array 種類(就 array length 來說,相同 element type 但 length 不同視為不同 array)。 using namespace std; void init(double (*p)[20]) { int n = sizeof(*p) / sizeof((*p)[0]); cout << "initialize a double array with length " << n << ", total bytes: " << sizeof(*p) << endl; for (int i = 0; i < n; ++i) cout << "array[" << i << "]=" << (*p)[i] << endl; } 如果寫出這樣的碼,你可能會說 1.這樣子的碼計算 n 的部分沒什麼意思,因為我在 編譯期就知道 n 的值;2. 而且也限制了能夠交由 init function 處理的 array 種類。 關於第一點的確是這樣,這樣子寫只是強調 formal parameter type 在編譯期的確 帶有 array length 資訊(不過這可能不需要強調,C programmer 應該都有這樣的 sense)。 你可以透過另一位板友將 init 樣版化的作法來增加使用上的彈性,他等於是讓 編譯器幫你產生多個類似 init function 實做的個別 function 來應付各種 element type 與各種 array length 的 argument。 至於第二點,如果單就只存在一個 init function 的情況來說(不使用樣版擴展), 他實際上還是可以用來處理至少有 20 個 double 並排的空間大小的空間,由於 C/C++ 語言的 casting 語法/機制讓程式員可以變更編譯期型別資訊。 int main() { double a[20]; for (int i = 0; i < 20; ++i) a[i] = i; init(&a); double b[30]; for (int i = 0; i < 30; ++i) b[i] = 30 - i; init(reinterpret_cast<double (*)[20]>(b + 10)); } 通常如果想要設計一個單一 function 可以處理特定 element type 但不定長度 的 array(區塊),又不想明確傳遞長度資訊,會採用類似 c str 的作法,使用一個 不代表有效值的 value 放在 array 最後(sentinel)。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.134.233 ※ 編輯: sbrhsieh 來自: 218.173.134.233 (04/23 16:33) ※ 編輯: sbrhsieh 來自: 218.173.134.233 (04/23 16:51)

04/24 02:06, , 1F
謝謝你的解說 受益良多
04/24 02:06, 1F
文章代碼(AID): #19y2T9wn (C_and_CPP)
文章代碼(AID): #19y2T9wn (C_and_CPP)