我是 C++ 编程的初学者。我写了一个简单的程序。我定义了一个名为“myFunction”的函数,它获取一个数组及其大小作为输入参数。在函数内部,数组的第一个元素变为 100。但是,在 main 函数中,数组的第一个元素的值发生了变化。这是为什么?我认为它不能改变。 我知道在 int 变量的类似情况下它不会发生。
#include <iostream>
using namespace std;
void myFunction(int a[],int b)
{
a[0] = 100;
}
void myFunction2 (int a)
{
a = a+2;
}
main()
{
int size_of_array = 5;
int myArray[size_of_array] = {7,8,2,3,5};
int c = 2;
myFunction(myArray,5);
myFunction2(c);
cout << myArray[0]<< endl;
cout << c;
}
在我调用“myFunction”后,我预计“myArray”的第一个元素应该是7
在 C++ 中,数组不会作为值传递。相反,您的数组在
main
中分配为一系列五个连续(可能)32 位 int
值。
你的
myFunction
函数得到一个 pointer 指向那块内存的开始,而不是整个数组的副本。 a[0] = 100;
在功能上与 *(a + 0) = 100;
相同。您正在取消引用指针并分配给它。这会更改内存中该地址的值。这种变化反映在 main
after you've called myFunction
.
您传递给
int
的myFunction2
值被复制。对该函数中的a
所做的更改对c
中的main
没有影响。
值得注意的是,您所展示的可变长度数组不是 C++ 标准的一部分。虽然一些编译器可能支持它们,但最好不要指望这种支持。
写下面的内容,让编译器算出大小就足够了
int myArray[] = {7,8,2,3,5};
现在,如果我们离开原始数组的领域并开始使用像
std::vector
这样的容器,我们可以通过值或引用传递,如果我们通过值传递,您 do 得到一个副本。考虑:
#include <vector>
#include <iostream>
void foo(std::vector<int> v) {
v[0] = 100;
}
void bar(std::vector<int>& v) {
v[0] = 100;
}
int main() {
std::vector<int> v = {1, 2, 3, 4, 5};
for (auto x : v) std::cout << x << std::endl;
foo(v);
for (auto x : v) std::cout << x << std::endl;
bar(v);
for (auto x : v) std::cout << x << std::endl;
return 0;
}
输出:
1
2
3
4
5
1
2
3
4
5
100
2
3
4
5
调用
foo
后,v
中的main
没有变化。但是因为 v
通过引用传递给 bar
,当我们打印数组时,分配给它的第一个元素确实反映在 main
中。