gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:39 24 4
gpt4 key购买 nike

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

这是我的代码:

#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。我也必须初始化指针吗?

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

最佳答案

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

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

如果在调用 referenceSetter() 之后,您希望 testAtestB 包含 numberA 的地址> 和 numberB,您需要将 referenceSetter() 更改为类似;

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

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

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

referenceSetter(&testA, &testB);

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

关于c++ - 通过作为参数传递的指针更改 int 变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32533514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com