我正在尝试编写一个打印出数组中元素的函数。但是,当我使用传递的数组时,我不知道如何迭代数组。
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]);
}
}
迭代传递的数组的最佳方法是什么?
答案 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])
答案 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
。请参阅here和here。它带有长度,如果使用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]);
将在元素数量小于预先声明的数组大小时导致冗余迭代。