为什么数组的值在 void 函数外变化而在 void 函数内变化?

问题描述 投票:0回答:1

我是 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++ arrays function variables void
1个回答
0
投票

在 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
中。

© www.soinside.com 2019 - 2024. All rights reserved.