答案 0 :(得分:25)
我可以将数组传递给函数吗? 我会使用诸如int之类的原语 和布尔?
是的,但只使用指针(即:通过引用)。
我可以通过值传递它们吗?
没有。您可以创建支持该类的类,但普通数组不支持。
该函数如何知道它传递的数组的大小?
没有。这是使用vector<T>
而不是T *
等内容的原因。
<强>澄清强>
函数可以获取指向特定大小的数组的引用或指针:
void func(char (*p)[13])
{
for (int n = 0; n < 13; ++n)
printf("%c", (*p)[n]);
}
int main()
{
char a[13] = "hello, world";
func(&a);
char b[5] = "oops";
// next line won't compile
// func(&b);
return 0;
}
我很确定这不是OP想要的东西。
答案 1 :(得分:14)
你可以像C一样传递数组(数组衰减到指针),或者你可以通过引用传递它们但是它们不能通过值传递。对于第二种方法,它们随身携带:
template <std::size_t size>
void fun( int (&arr)[size] )
{
for(std::size_t i = 0; i < size; ++i) /* do something with arr[i] */ ;
}
大多数情况下,使用标准库中的std::vector
或其他序列只是更加优雅,除非您特别需要本机数组。
答案 2 :(得分:4)
我可以将数组传递给函数吗? 我会使用诸如int之类的原语 和布尔?
是的,你可以。将数组名称作为参数传递给函数会传递第一个元素的地址。
简而言之:
void foo(int a[]);
相当于
void foo(int * a);
我可以通过值传递它们吗?
不是真的。使用数组名称传递的“值”是第一个元素的地址。
传递C风格数组副本的唯一方法是将其包装在实现深拷贝语义的class
或struct
中。
该功能如何知道大小 它传递的数组是什么?
除非你有你的函数,否则它会接受一个与数组大小相关的附加参数。
答案 3 :(得分:3)
你可以传递一个数组,但如果你想知道它,你必须传递它的大小:
function(array, size);
数组总是通过引用传递,函数可以用以下两种方式编写:
Declaration: void function (class*, int);
Implementation: void function(class array[]; int size) {}
或
Declaration: void function (class*, int);
Implementation: void function(class *array; int size) {}
当您将数组传递给函数时,函数本质上会接收指向该数组的指针,如上面的第二个示例所示。这两个例子都将完成同样的事情。
答案 4 :(得分:2)
您可以按值传递std::vector
和类似设计良好的对象(尽管这种情况相当罕见)。通常,您通过引用或const引用传递。
C / C ++数组,如
void foo(int x[])
总是通过引用传递。此外,函数无法确定调用者传入的参数的真实大小,您必须假设一个大小(或将其作为单独的参数传递)。
答案 5 :(得分:2)
C风格的数组在传递给函数时表现得非常奇怪。对于固定大小的数组,我建议使用std::array<int, 10>
,它可以像内置类型一样通过值传递。对于可变大小的数组,我建议std::vector<int>
,如其他答案所示。
答案 6 :(得分:1)
void f(int a[]);
并将其称为:int myArr[size]; f(myArr);
答案 7 :(得分:1)
是的,你可以像原始类型一样传递它们。 是的,如果你真的想要使用一些包装代码,你可以传递值,但你可能不应该。 它将函数原型的大小作为长度 - 它可能与输入的数据匹配也可能不匹配 - 所以没有它真的不知道。
或者!
将引用或const引用传递给向量,并且更安全,并在指尖处显示大小信息。