C ++数组作为函数参数

时间:2010-05-19 17:10:50

标签: c++ arrays arguments

  • 我可以像使用int和bool这样的原语一样将数组传递给函数吗?
  • 我可以通过值传递它们吗?
  • 该函数如何知道它传递的数组的大小?

8 个答案:

答案 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风格数组副本的唯一方法是将其包装在实现深拷贝语义的classstruct中。

  

该功能如何知道大小   它传递的数组是什么?

除非你有你的函数,否则它会接受一个与数组大小相关的附加参数。

答案 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)

  1. 是。例如:void f(int a[]);并将其称为:int myArr[size]; f(myArr);
  2. 不,数组会自动通过引用传递。如果要模拟按值传递,则必须将数组包装在结构或类中。
  3. 没有。你必须自己传递大小。

答案 7 :(得分:1)

是的,你可以像原始类型一样传递它们。 是的,如果你真的想要使用一些包装代码,你可以传递值,但你可能不应该。 它将函数原型的大小作为长度 - 它可能与输入的数据匹配也可能不匹配 - 所以没有它真的不知道。

或者!

将引用或const引用传递给向量,并且更安全,并在指尖处显示大小信息。