更新指针位置值时出现问题

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

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 来执行我的程序。

我尝试查看各种资源以再次理解基本定义,但我无法弄清楚这一点。

c++ function pointers output updating
1个回答
0
投票

您的代码是正确的!要理解这一点,您应该了解指针的基础知识

假设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 的值。这样,你就可以完成这个!!

快乐编码!!

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