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)代码>
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);