void(int a []){ a [5] = 3; //这是错的? }
我可以这样做,以便修改传入的数组吗?
很抱歉删除,这里有点新......
我还有另一个问题可以回答我的问题:
如果我有
void Test(int a) {
}
void Best(int &a) {
}
这两个陈述是否相同?
Test(a);
Best(&a);
答案 0 :(得分:13)
void Test(int a[])
{
a[5] = 3;
}
只是替代语法:
void Test(int* a)
{
*(a+5) = 3;
}
没有传递数组,只是一个指针。原始数组已修改。
关于你的第二次修订,给出:
void Test(int a)
{
}
void Best(int &a)
{
}
然后
Test(aa); // Passes aa by value. Changes to a in Test() do not effect aa
Best(aa); // Passes aa by reference; Changes to a DO effect aa
Best(&aa); // Is a syntax error: Passing a pointer instead of an int.
答案 1 :(得分:2)
如果您不是通过引用而不是通过指针获取变量,则意味着该函数基本上是隔离的,获取a的临时副本。无论你做什么(不试图破解堆栈或类似的东西),你都无法在调用上下文中访问该值。
如果你对调用上下文有所了解,你可以根据对堆栈内容的一些预期来做事情,但这通常是一个坏主意。
如果你的方法取一个基本上是*的[],那么是的,你可以改变指向的单元格的内容,但你不能改变一个(指针)本身指向别的。
答案 2 :(得分:0)
不。
您从函数外部更改值的选项是通过引用f(int& a)调用,通过指针f(int * a)调用,以及使用全局(shudder ...)变量。
答案 3 :(得分:0)
阅读此处给出的答案,了解参数列表中int[]
和int*
的区别:Difference between char*
and char[]
。我真的非常喜欢这个答案! :)
关于您关于Test
和Best
功能的问题, James Curran 提供了一个很好的答案。
答案 4 :(得分:0)
您原来的功能应该有效 如果你给它起个名字:
#include <iostream>
// Arrays always de-generate to pointers.
void plop(int a[]) // Make sure this function has a name.
{
a[5] = 3;
}
int main()
{
int test[] = { 1,1,1,1,1,1,1,1};
plop(test);
std::cout << test[5] << std::endl;
}
这是因为当作为参数传递给函数时,数组总是会生成指针。所以这应该始终按预期工作。假设您没有超出数组末尾的索引。在plop内部无法确定传递的数组的大小。
答案 5 :(得分:-1)
通过引用传递数组的主要动机是防止堆栈溢出和大量对象的不必要复制。例如,想象一下,如果我有这样的函数:
void foo(int x[500000000000]);
如果所有数组都按值传递,则第一次调用函数时堆栈可能会溢出(但当然这显然是夸大其词)。
这在使用面向对象的方法时会很有用。假设你有这个:而不是数组:
void foo(SomeClass x);
其中SomeClass是一个拥有500000000000个数据成员的类。如果你调用这样的方法,编译器会逐位复制x,这至少可以说是一个很长的过程。您在数组中使用的概念仍然适用,但您必须指定通过手动引用来使用它:
void foo(SomeClass &x);
(除非你有64位机器和大量RAM,否则不要试图创建一个500000000000元素数组)