首页 文章

将向量传递给函数,值对参考C

提问于
浏览
64

我在C编码 . 如果我有一些函数 void foo(vector<int> test) 并且我在我的程序中调用它,那么向量是通过值还是引用传递的?我不确定,因为我知道矢量和数组是相似的,像 void bar(int test[]) 这样的函数会通过引用(指针?)而不是值传递测试 . 我的猜测是,如果我想避免传递值,我需要明确地通过指针/引用传递向量,但我不确定 .

3 回答

  • 88

    如果我不得不猜测,我是来自Java背景的.765683_ . 这是C,除非您使用 & -operator另外指定,否则事物将按值传递(请注意,此运算符也用作'address-of'运算符,但在不同的上下文中) . 这些都有很好的记录,但无论如何我都会重复:

    void foo(vector<int> bar); // by value
    void foo(vector<int> &bar); // by reference (non-const, so modifyable inside foo
    void foo(vector<int> const &bar); // by const-reference
    

    您也可以选择将指针传递给向量( void foo(vector<int> *bar) ),但除非您知道're doing and you feel that this is really is the way to go, don' t这样做 .

    另外,矢量与数组不同!在内部,向量跟踪一个数组,它为您处理内存管理,但许多其他STL容器也是如此 . 您不能将向量传递给期望指针或数组的函数,反之亦然(您可以访问(指向)底层数组并使用它) . 向量是通过其成员函数提供许多功能的类,而指针和数组是内置类型 . 此外,动态分配向量(这意味着可以在运行时确定和更改大小),而静态分配C样式数组(其大小是常量并且必须在编译时知道),限制了它们的使用 .

    我建议你阅读一些关于C的更多信息(特别是array decay),然后看看下面的程序,它说明了数组和指针之间的区别:

    void foo1(int *arr) { cout << sizeof(arr) << '\n'; }
    void foo2(int arr[]) { cout << sizeof(arr) << '\n'; }
    void foo3(int arr[10]) { cout << sizeof(arr) << '\n'; }
    void foo4(int (&arr)[10]) { cout << sizeof(arr) << '\n'; }
    
    int main()
    {
        int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        foo1(arr);
        foo2(arr);
        foo3(arr);
        foo4(arr);
    }
    
  • 12

    vector 在功能上与数组相同 . 但是,对于语言 vector 是一种类型, int 也是一种类型 . 对于函数参数,任何类型的数组(包括 vector[] )都被视为指针 . vector<int>int[] (与编译器)不同 . vector<int> 是非数组,非引用和非指针 - 它是按值传递的,因此它将调用copy-constructor .

    因此,您必须使用 vector<int>& (最好使用 const ,如果函数未修改它)将其作为参考传递 .

  • 6

    void foo(vector<int> test)

    vector将在此传递值 .

    根据上下文,您有更多传递向量的方法: -

    1)通过引用传递: - 这将使函数foo改变向量的内容 . 比传递值更有效,因为避免了向量的复制 .

    2)通过const-reference: - 当你不希望函数改变向量的内容时,这是有效的和可靠的 .

相关问题