看板 C_and_CPP 關於我們 聯絡資訊
ptt.cc BBS 站 C_and_CPP 板 FAQ (0.1版) 陣列的問題 Q: 我傳一個陣列到函式,在函式中要怎麼知道裡面有幾個元素? void DoSomething(float* data) { /* 要怎麼知道data裡面有幾個元素呢? */ } A: C 語言無法真的傳整個陣列到函式中,只能傳指標。在函式中,是無法從 指標來決定其相應的陣列有幾個元素的。 註:除非是「指向整個陣列的指標」,這種情形根本也沒有必要在函 式定義中再寫程式去算有幾個元素,因為參數本身就很明確的指定了: void DoArrPtr(int (*arr_p)[3]) /* arr_p 是指向 int[3] 的指標 */ { /* ...... */ } 如果是字串陣列的指標,因為字串的的結束字元是 '\0',那麼就能用strlen() 函式來計算出 '\0' 之前的字元的個數。 其他型別的元素所成的陣列,除非也有一個 sentinel 值(意指該值能夠 與正常的元素值有所區分,而又屬於相同的型別,像字串陣列的 '\0' 就是),可以在呼叫端將該值放入陣列最後一個元素的下一個位置。傳入 函式後,就能逐一檢查每一元素,並累計其個數,直到遇到此 sentinel 值為止。 比較常見的做法是函式的宣告多一個整數參數(可用 int, 較嚴謹的做法 是用 size_t),由呼叫端負責決定陣列的個數(參考上一則FAQ),並傳給 這個整數參數。 至於 C++,除了上述的做法可以用之外,也可利用 reference type 配合 function template 來決定陣列的元素個數,但只限於編譯時期就能夠決 定元素個數的情形,呼叫端傳進去的必需是一個靜態宣告的陣列變數,不 能是動態陣列的指標。如: template <size_t SIZE> void foo(float (&arr)[SIZE]) // C++ 可以真的傳陣列 { std::cout << "The array has " << SIZE << " elements\n"; // ... } int main() { float myarr1[10]; // 靜態宣告的陣列 float myarr2[20]; // 同上 foo(myarr1); foo(myarr2); return 0; } by Khoguan Phuann ----------------------------------- 敬請指正錯誤,或提出更合適的答案。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.130.208.167
imprazaguy:_msize()這個函數可以傳回由malloc配置的空間,不過我 09/27 00:31
imprazaguy:不清楚它是不是標準C內定的。 09/27 00:33
Frozenmouse:前面冠個底線的通常不是@@ 09/27 02:15
khoguan:不是。 09/27 03:07
※ 編輯: khoguan 來自: 220.130.208.168 (09/28 03:18)