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

时间:2010-10-06 01:39:23

标签: c 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]);
    }
}

迭代传递的数组的最佳方法是什么?

7 个答案:

答案 0 :(得分:16)

您还需要将数组的大小传递给函数 将数组传递给函数时,实际上是在传递该数组中第一个元素的地址。所以指针只指向函数内部的第一个元素。

由于数组中的内存是连续的,您仍然可以使用指针算术(如(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])

...和arrays are not the same as pointers

答案 1 :(得分:5)

为什么不为此使用函数模板(C ++)?

template<class T, int N> void f(T (&r)[N]){
}

int main(){
    int buf[10];
    f(buf);
}

编辑2:

qn现在似乎有C标记,并且C ++标记已被删除。

答案 2 :(得分:2)

对于C,您必须传递数组的长度(元素数)。

对于C ++,您可以传递长度,但是如果您有权访问C ++ 0x,则BETTER将使用std::array。请参阅herehere。它带有长度,如果使用at()成员函数访问元素,则提供越界检查。

答案 3 :(得分:0)

你可以试试这个......

#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扩展名)和上面的大小推断。

答案 4 :(得分:0)

C99中,您可以要求数组中的数组至少包含n元素:

void print_array(int b[static n]);
  

6.7.5.3.7:参数声明为''类型数组''应调整为''限定指针   类型'',其中类型限定符(如果有的话)是在[和]中指定的类型   数组类型推导。如果关键字static也出现在[和]中   数组类型派生,然后对每个函数调用,对应的值   实际参数应提供至少与数组一样多的数组的第一个元素的访问权限   由大小表达式指定的元素。

在GCC中你可以pass the size of an array implicitly这样:

void print_array(int n, int b[n]);

答案 5 :(得分:0)

在c ++中,您还可以使用某种类型的列表类实现为具有size方法的数组,或者使用具有size成员的结构(在c或c ++中)。

答案 6 :(得分:0)

使用变量来传递数组的大小。 int sizeof_b = sizeof(b) / sizeof(b[0]);除了获得已知的预先声明的数组大小外什么也不做,您可以将其作为参数传递;例如void print_array(int*b, int size)size也可以是用户定义的大小。

int sizeof_b = sizeof(b) / sizeof(b[0]);将在元素数量小于预先声明的数组大小时导致冗余迭代。