C++数组作为函数参数

Dr.*_*ula 9 c++ arrays arguments

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

egr*_*nin 25

我可以像使用int和bool这样的原语一样将数组传递给函数吗?

是的,但只使用指针(即:通过引用).

我可以按值传递它们吗?

不可以.您可以创建支持该类的类,但普通数组不支持.

该函数如何知道它传递的数组的大小?

它没有.这是使用诸如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;
}
Run Code Online (Sandbox Code Playgroud)

不过,我很确定这不是OP所期待的.

  • C++中的数组可以通过引用传递,在这种情况下,您可以知道数组的大小.当然,这不适用于在运行时创建的数组. (2认同)

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

大多数情况下,std::vector除非您需要特定的本机数组,否则使用标准库中的其他序列会更加优雅.


Joh*_*McG 5

我可以像处理 int 和 bool 等基元那样将数组传递给函数吗?

是的你可以。将数组名称作为参数传递给函数会传递第一个元素的地址。

简而言之:

void foo(int a[]);
Run Code Online (Sandbox Code Playgroud)

相当于

void foo(int * a);
Run Code Online (Sandbox Code Playgroud)

我可以按值传递它们吗?

并不真地。与数组名称一起传递的“值”是第一个元素的地址。

传递 C 样式数组副本的唯一方法是将其包装在实现深复制语义的classor中。struct

函数如何知道它传递的数组的大小?

它不会,除非你的函数接受一个额外的参数,即数组的大小。


pet*_*hen 2

您可以std::vector按值传递类似的精心设计的对象(尽管这种情况相当罕见)。通常,您通过引用或 const 引用传递。

AC/C++ 数组,如

void foo(int x[])
Run Code Online (Sandbox Code Playgroud)

始终通过引用传递。此外,该函数无法确定调用者传入的参数的真实大小,您必须假设一个大小(或将其作为单独的参数传递)。

  • 准确地说,数组的按值语法将数组衰减为指向第一个元素的指针,然后按值传递该指针。这与通过引用传递数组不同: void foo( int (&amp;a)[10] ) (3认同)