Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;数组作为函数参数 我可以像对待int和bool这样的基本体一样将数组传递给函数吗 我可以按价值传递它们吗 函数如何知道它所传递的数组的大小_C++_Arrays_Arguments - Fatal编程技术网

C++ C++;数组作为函数参数 我可以像对待int和bool这样的基本体一样将数组传递给函数吗 我可以按价值传递它们吗 函数如何知道它所传递的数组的大小

C++ C++;数组作为函数参数 我可以像对待int和bool这样的基本体一样将数组传递给函数吗 我可以按价值传递它们吗 函数如何知道它所传递的数组的大小,c++,arrays,arguments,C++,Arrays,Arguments,您可以通过值传递std::vector和类似的精心设计的对象(尽管这很少见)。通常,通过引用或常量引用传递 一个C/C++数组,如 void foo(int x[]) 始终通过引用传递。此外,函数无法确定调用方传入的参数的真实大小,您必须假定一个大小(或将其作为单独的参数传递) 对。例如:void f(inta[])并这样称呼它:intmyarr[size];f(myArr) 否,数组是通过引用自动传递的。如果要模拟按值传递,必须将数组包装在结构或类中 没有。你必须自己通过这个尺寸 我可以将数

您可以通过值传递
std::vector
和类似的精心设计的对象(尽管这很少见)。通常,通过引用或常量引用传递

一个C/C++数组,如

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

  • 对。例如:
    void f(inta[])并这样称呼它:
    intmyarr[size];f(myArr)
  • 否,数组是通过引用自动传递的。如果要模拟按值传递,必须将数组包装在结构或类中
  • 没有。你必须自己通过这个尺寸
  • 我可以将数组传递给函数吗 我会使用诸如int之类的基本体 还有布尔

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

    我可以按价值传递它们吗

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

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

    没有。这就是为什么要使用
    vector
    而不是
    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;
    }
    
    void func(字符(*p)[13])
    {
    对于(int n=0;n<13;++n)
    printf(“%c”,(*p)[n]);
    }
    int main()
    {
    char a[13]=“你好,世界”;
    func&a;
    字符b[5]=“oops”;
    //下一行无法编译
    //func&b;
    返回0;
    }
    

    但是,我很确定这不是OP想要的。

    可以用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] */ ;
    }
    
    模板
    无效乐趣(整型(&arr)[大小])
    {
    对于(std::size_t i=0;i

    大多数情况下,在标准库中使用
    std::vector
    或其他序列更为优雅,除非您特别需要本机数组。

    是的,您可以将它们作为基本类型传递。 是的,如果您真的想使用一些包装器代码,您可以按值传递,但您可能不应该这样做。 它将以函数原型的大小作为长度,长度可能与传入数据匹配,也可能与传入数据不匹配,因此它并不真正知道

    或者


    将引用或常量引用传递给向量,这样会更安全,并将大小信息放在指尖。

    您可以传递数组,但如果您想确定它,则必须同时传递大小:

    function(array, size);
    
    数组始终通过引用传递,函数可以通过以下两种方式之一编写:

    Declaration:    void function (class*, int);
    Implementation: void function(class array[]; int size) {}
    

    当你把一个数组传递给一个函数时,函数本质上会收到一个指向该数组的指针,如上面第二个例子所示。这两个例子将完成相同的事情

    我可以将数组传递给函数吗 我会使用诸如int之类的基本体 还有布尔

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

    简言之:

    void foo(int a[]);
    
    相当于

    void foo(int * a);
    
    我可以按价值传递它们吗

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

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

    函数如何知道大小 传递的数组的名称


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

    C风格的数组在传递到函数中时表现得非常奇怪。对于固定大小的数组,我建议改为
    std::array
    ,它可以像内置类型一样通过值传递。对于可变大小的数组,我建议使用“代码> STD::vector < /代码>,如其他答案中所建议的。”/P>投票赞成,因为在它变得可见之前,我正在键入这个完全相同的答案。C++中的数组可以通过引用传递,在这种情况下,您可以知道数组的大小。当然,这不适用于在运行时创建的数组。@AraK-不确定这里的意思。您能为您的答案添加一个示例吗?@egrunin:而且它不需要模板:
    void foo(int(&a)[10])
    将通过引用接收正好包含10个整数的数组。动态分配数组的问题稍微复杂一些。。。
    new int[10]
    的类型是
    int*
    ,而不是
    int[10]
    ,但是您可以动态创建一个包含10个整数的数组:
    int(*p)[10]=new int[1][10]foo(*p)
    @AraK,@David:我知道排列,只是不确定我们想到的是同一个。附加了一个简单的例子。Re:
    inta[]
    int*b
    之间的等价性:虽然有一个区别:第一种形式不允许你玩指针(例如
    a++
    是非法的)。@RaphaelSP,不,没有这样的区别。第一种形式同样允许
    a++
    ——它们是完全等价的@然而,约翰“没有办法接受或传递一个C风格数组的副本”在学究式的时候是错误的。如果将数组包装到结构中并按值获取结构,则包装的数组将被复制,函数将接收c样式数组的副本。@RaphaelSP:
    void bar(int a[]){++a;*a=7;}
    在g++和comeau中编译。对--我也尝试过了--我想说int*consta,然后尝试了一下,发现可以修改指针。我会把“不可能”解释成不那么绝对。@Johannes,@dribeas:
    void foo(int * a);