如何获得传递给函数的数组大小?

我正在尝试编写一个打印出数组中元素的函数。 但是,当我使用传递的数组时,我不知道如何迭代数组。

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 ++中)。