如何获得传递给函数的数组大小?
我正在尝试编写一个打印出数组中元素的函数。 但是,当我使用传递的数组时,我不知道如何迭代数组。
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 void f(T (&r)[N]){ } int main(){ int buf[10]; f(buf); }
编辑2:
qn现在似乎有C标记,并且C ++标记被删除。
对于C,您必须传递数组的长度(元素数)。
对于C ++,你可以传递长度,但是如果你有权访问C ++ 0x,那么BETTER就是使用std::array
。 看到这里和这里 。 它带有长度,如果使用at()
成员函数访问元素,则提供对越界的检查。
在C99中 ,您可以要求数组数组至少包含n
元素:
void print_array(int b[static n]);
6.7.5.3.7 :参数声明为”类型数组”应调整为”限定类型”的指针,其中类型限定符(如果有的话)是在[和]中指定的类型。数组类型推导。 如果关键字static也出现在数组类型派生的[和]中,那么对于每次对函数的调用,相应的实际参数的值应该提供对数组的第一个元素的访问,其中元素的数量至少与指定的元素一样多。按大小表达。
在GCC中,您可以隐式传递数组的大小,如下所示:
void print_array(int n, int b[n]);
你可以尝试这个……
#include void print_array(int b[], size_t N) { for (int i = 0; i < N; ++i) printf("%d ", b[i]); printf("\n"); } template 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 ++中)。