C++ 的 Hackerrank 指针问题的问题陈述是使用名为 update 的函数更新两个指针值,一个是和,另一个是差。解决方案代码是:-
#include <stdio.h>
void update (int *a,int *b) {
int sum = *a + *b;
int subtract;
if (*a > *b)
{
subtract = *a - *b;
}
else
{
subtract = *b - *a;
}
*a = sum;
*b = subtract;
}
int main() {
int a, b;
int *pa = &a, *pb = &b;
scanf("%d %d", &a, &b);
update(pa, pb);
printf("%d\n%d", a, b);
return 0;
}
本例中的示例输入:- 4 5 本例中的示例输出:- 9 1
但是,如果我尝试简化它,例如:-
#include <stdio.h>
void update(int *a , int *b) {
*a = *a + *b;
# Or even if i use :- *b = *a - *b > 0 ? *a - *b : *b - *a; to calculate *b
int subtract;
if (*a > *b)
{
subtract = *a - *b;
}
else
{
subtract = *b - *a;
}
*b = subtract;
}
int main() {
int a, b;
int *pa = &a, *pb = &b;
scanf("%d %d", &a, &b);
update(pa, pb);
printf("%d\n%d", a, b);
return 0;
}
这段代码最终更新了总和,即*a,但不是更新*b,而是将我首先写入的值分配给*b 本例中的示例输入:- 4 5 本例中的示例输出:- 9 4
谁能告诉我为什么会发生这种情况? 我正在使用 VSCode 来执行我的程序。
我尝试查看各种资源以再次理解基本定义,但我无法弄清楚这一点。
您的代码是正确的!要理解这一点,您应该了解指针的基础知识
假设a和b的值分别为4和5,a在内存中的地址为1000,类似地b的地址为1004。
现在如果你输入*a,这意味着你正在指向变量地址中的值。例如,如果您说“it is a Chocolate”,您指的是包装纸内保存的可食用的东西。所以在这里,*wrapper 是 (a),由值 1000 组成,a 是保存在 Wrapper 内的巧克力,该值保存在地址或内存位置中。
现在我们可以讨论我们的案例了。这里直接修改a的值。所以 *a=*a+*b 指的是您正在将地址 1000 上的值修改为两个变量的和。然后它会被覆盖为*a=9。即地址1000处的值为9。*b的值。 *实现条件后,您意味着,减去=a-b,表示值在1000,即9(先前修改)-5(地址1004处的值),结果为4。因此您将其分配给 b. 这就是为什么你会得到你首先写入 *b 的值。
为了克服这个问题,您可以创建 temp 变量并为其分配 *a 的值。这样,你就可以完成这个!!
快乐编码!!