[英]How do you get the size of array that is passed into the function?
我正在嘗試編寫一個 function 來打印出數組中的元素。 但是,當我使用傳遞的 arrays 時,我不知道如何遍歷數組。
void
print_array(int* b)
{
int sizeof_b = sizeof(b) / sizeof(b[0]);
int i;
for (i = 0; i < sizeof_b; i++)
{
printf("%d", b[i]);
}
}
迭代傳遞的數組的最佳方法是什么?
您還需要將數組的大小傳遞給函數。
當您將數組傳遞給函數時,您實際上是在傳遞該數組中第一個元素的地址。 所以指針只指向函數內部的第一個元素。
由於數組中的內存是連續的,您仍然可以使用指針算法,例如(b+1)
指向第二個元素或等效地b[1]
void print_array(int* b, int num_elements)
{
for (int i = 0; i < num_elements; i++)
{
printf("%d", b[i]);
}
}
這個技巧只適用於數組而不是指針:
sizeof(b) / sizeof(b[0])
...和數組與指針不同。
為什么不為此(C++)使用函數模板?
template<class T, int N> void f(T (&r)[N]){
}
int main(){
int buf[10];
f(buf);
}
編輯2:
qn 現在似乎具有 C 標記,而 C++ 標記已被刪除。
你可以試試這個...
#include <cstdio>
void
print_array(int b[], size_t N)
{
for (int i = 0; i < N; ++i)
printf("%d ", b[i]);
printf("\n");
}
template <size_t N>
inline void
print_array(int (&b)[N])
{
// could have loop here, but inline forwarding to
// single function eliminates code bloat...
print_array(b, N);
}
int main()
{
int a[] = { 1, 2 };
int b[] = { };
int c[] = { 1, 2, 3, 4, 5 };
print_array(a);
// print_array(b);
print_array(c);
}
...有趣的是 b 不起作用...
array_size.cc: In function `int main()':
array_size.cc:19: error: no matching function for call to `print_array(int[0u])'
JoshD 在問題下方的評論中指出了 0 大小的數組(GCC 擴展),以及上面的大小推斷。
在 c++ 中,您還可以使用某種類型的列表類,該類實現為具有 size 方法的數組或具有 size 成員的結構(在 c 或 c++ 中)。
使用變量傳遞數組的大小。 int sizeof_b = sizeof(b) / sizeof(b[0]);
除了獲取預先聲明的數組大小之外什么都不做,這是已知的,您可以將其作為參數傳遞; 例如, void print_array(int*b, int size)
。 size
也可以是用戶定義的大小。
int sizeof_b = sizeof(b) / sizeof(b[0]);
當元素數量小於預先聲明的數組大小時,將導致冗余迭代。
這個問題已經有了一些很好的答案,例如第二個。 然而,缺乏解釋,所以我想擴展樣本並解釋它:
使用模板和模板參數,在這種情況下,使用無類型模板參數可以獲取任何類型的固定數組的大小。
假設您有這樣一個函數模板:
template<typename T, int S>
int getSizeOfArray(T (&arr)[S]) {
return S;
}
該模板顯然適用於任何類型(此處為 T)和固定整數(S)。 如您所見,該函數引用了對 T 類型的 S 對象數組的引用,正如您在 C++ 中所知,您不能通過值將數組傳遞給函數,而是通過引用將數組傳遞給函數,因此該函數必須引用。
現在,如果你像這樣使用它:
int i_arr[] = { 3, 8, 90, -1 };
std::cout << "number f elements in Array: " << getSizeOfArray(i_arr) << std::endl;
編譯器會隱式實例化模板函數並檢測參數,所以這里的 S 是4
,它被返回並打印到輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.