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

unj*_*nj2 8 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*ndy 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个技巧只适用于数组而不是指针:

sizeof(b) / sizeof(b[0])
Run Code Online (Sandbox Code Playgroud)

...和数组与指针不同.

  • +1,但你应该使用`size_t`而不是`int`来表示数组大小. (2认同)

Chu*_*dad 5

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

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

int main(){
    int buf[10];
    f(buf);
}
Run Code Online (Sandbox Code Playgroud)

编辑2:

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

  • 我认为更好的问题是为什么不使用矢量? (2认同)
  • @JoshD:没有C++ 0x,固定大小的数组非常方便你可以初始化它们(ala`int a [] = {1,2,3};`.它们也避免了堆分配 - 特别好,如果它们小,具有传奇性,并且在性能敏感的循环中. (2认同)