[FAQ集] 陣列:傳陣列到函式,要算有幾個元素

看板C_and_CPP (C/C++)作者 (Khoguan Phuann)時間19年前 (2005/09/26 12:48), 編輯推噓3(301)
留言4則, 3人參與, 最新討論串1/1
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

09/27 00:31, , 1F
_msize()這個函數可以傳回由malloc配置的空間,不過我
09/27 00:31, 1F

09/27 00:33, , 2F
不清楚它是不是標準C內定的。
09/27 00:33, 2F

09/27 02:15, , 3F
前面冠個底線的通常不是@@
09/27 02:15, 3F

09/27 03:07, , 4F
不是。
09/27 03:07, 4F
※ 編輯: khoguan 來自: 220.130.208.168 (09/28 03:18)
文章代碼(AID): #13DtsZ-Z (C_and_CPP)
文章代碼(AID): #13DtsZ-Z (C_and_CPP)