[FAQ集] 陣列:傳陣列到函式,要算有幾個元素
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
09/27 00:31, 1F
→
09/27 00:33, , 2F
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)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章