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

时间:2015-09-11 23:28:16

标签: 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;
}

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

或者我尝试了以下方法:

#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;
    }

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

请帮我找出错误。感谢。

3 个答案:

答案 0 :(得分:3)

您正在尝试将地址0的内容设置为与其他数字相等,因此当您执行*a = numberA时,您将numberA的值分配给内存地址0

不确定,但我认为你想要实现的是:

#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;
}

这样,使用指针指针作为referenceSetter()的参数,实际上是在修改传递指针所指向的地址。

答案 1 :(得分:1)

你不理解的是指针是按值传递的,就像任何其他变量一样。如果你想要改变传递的指针,你需要传递一个指针指针(或指针的引用,但我会留下它,因为此时解释引用会让你更加困惑)。 / p>

您的main()正在将NULL指针传递给referenceSetter()。作业*a = numberAnumberA(即100)的值复制到a指向的内存中。由于a是一个NULL指针,因此它具有覆盖内存的效果,就您的程序而言,该内存并不存在。结果是未定义的行为,这意味着 - 根据标准 - 允许任何事情发生。使用您的实现,即触发未处理的异常,可能是因为您的主机操作系统检测到您的程序正在写入不允许写入的内存。

如果在referenceSetter()来电之后,您希望testAtestB分别包含numberAnumberB的地址,则需要更改{ {1}}类似的东西;

referenceSetter()

这允许传递的值是指针的地址。 void referenceSetter(int **a, int **b) { *a = &numberA; *b = &numberB; } 然后成为对传递的指针的引用。 *a计算&numberA的地址,而不是访问其值numberA。同样适用于100

第二个更改是更改numberB,以便正确调用该函数;

main()

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

答案 2 :(得分:-1)

你很接近,但关键是你需要传递地址你想要设置的值。您在int中将值声明为main,并使用&运算符传递地址:

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

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

如果您在testA中声明testBmain作为指针并传递指针,则该函数会获得指针的副本而不是您要设置的值的地址。