通过作为参数传递的指针更改 int 变量的值?

the*_*ive 6 c++ pointers

我想通过函数从另一个不同的类访问这些变量的地址来修改特定类的某些变量的值。因此,为了访问这个地址,我尝试将变量指针作为参数传递给函数,其中这些变量指针将使用变量的地址进行设置。为了学习如何做到这一点,我尝试在一个简单的程序中进行模仿。

这是我的代码:

#include <iostream>    

using namespace std;
int numberA = 100;
int numberB = 200;

void referenceSetter(int *a, int *b)
{
    *a = numberA;
    *b = numberB;
}

void numberOutput()
{
    cout << "A = " << numberA << endl;
    cout << "B = " << numberB << endl;
}

int main() {

    int *testA = 0; 
    int *testB = 0;
    referenceSetter(testA, testB);

    *testA = 30;
    *testB = 40;
    numberOutput();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我将numberA和声明numberB为全局变量并设置它们的值。我尝试通过函数函数获取这两个变量的地址referenceSetter,然后尝试使用引用修改这些变量中的值。显然,我做错了一些事情,导致Unhandled Exception当我尝试修改这些值并尝试分别将它们设置为 30 和 40 时出现错误。

或者我尝试了以下方法:

#include <iostream>    

    using namespace std;
    int numberA = 100;
    int numberB = 200;

    void referenceSetter(int *a, int *b)
    {
        a = &numberA;
        b = &numberB;
    }

    void numberOutput()
    {
        cout << "A = " << numberA << endl;
        cout << "B = " << numberB << endl;
    }

    int main() {

        int *testA; 
        int *testB;
        referenceSetter(testA, testB);

        *testA = 30;
        *testB = 40;
        numberOutput();

        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

但这种方法会引发错误uninitialized local variables testA and testB。我也必须初始化指针吗?

请帮我找出我的错误。谢谢。

Pet*_*ter 4

您不理解的是指针是按值传递的,就像任何其他变量一样。如果您希望更改传递的指针,则需要将指针传递给指针(或对指针的引用,但我将不理会它,因为此时解释引用会让您进一步感到困惑)。

main()正在将 NULL 指针传递给referenceSetter(). 该赋值将(ie )*a = numberA的值复制到 指向的内存中。由于是一个 NULL 指针,因此它会覆盖程序中不存在的内存。其结果是未定义的行为,这意味着 - 根据标准 - 任何事情都可以发生。在您的实现中,这会触发未处理的异常,可能是因为您的主机操作系统检测到您的程序正在写入不允许写入的内存。numberA100aa

如果在调用之后referenceSetter()您希望testA和分别包含和testB的地址,则需要更改为类似的内容;numberAnumberBreferenceSetter()

void referenceSetter(int **a, int **b)
{
    *a = &numberA;
    *b = &numberB;
}
Run Code Online (Sandbox Code Playgroud)

这允许传递的值是指针的地址。 *a然后成为对传递的指针的引用。 &numberA计算 的地址numberA,而不是访问其值100。同样对于numberB.

第二个更改是更改main()以使其正确调用该函数;

referenceSetter(&testA, &testB);
Run Code Online (Sandbox Code Playgroud)

testA它将( 和)的地址传递testB给函数,因此可以更改这些指针