【问题标题】:How can I make variable change when another changes当另一个更改时如何进行变量更改
【发布时间】:2020-07-30 19:07:43
【问题描述】:

我有这个代码:

#include <stdio.h>

void main(){
    unsigned int a = 2;
    unsigned int also_a = a;

    unsigned int b = 1;

    a+=b;

    printf("\n%d %d\n", a, also_a);
}

这个输出:

$ ./a.out 

3 2

我怎样才能输出3 3

我对 C 很陌生,我想我必须使用指针,但我不确定

【问题讨论】:

  • 为什么需要2份。宏或指针能解决你的问题吗?
  • 使用指针。例如unsigned int a = 2; unsigned int also_a = &amp;a; ... printf( ..., a, *also_a);
  • “我想我必须使用指针” - 你是对的。您可以将 also_a 设为指向 a 的指针
  • 试试#define also_a a

标签: c pointers variables reference


【解决方案1】:

这可以使用指针来完成,但如果您还没有使用它,那么我假设您不熟悉这个概念。所以第一个解决方案是不使用指针。

解决方案 1

在这个解决方案中。在使用变量also_a 之前进行检查以查看a 的值是否已更改。这不是自动的,因此可能不符合解决方案的条件。但这是你从我这里得到的,不使用指针。

#include <stdio.h>
void main(){
    unsigned int a = 2;
    unsigned int also_a = a;
    unsigned int prev_a = a;

    unsigned int b = 1;

    a+=b;

    // also_a will be used. So check.
    if(prev_a != a) 
        also_a = a;

    printf("\n%d %d\n", a, also_a);
}

解决方案 2

我将使用指针。将有一个变量和一个对其的引用。我将尝试在解决方案之后解释指针。

#include <stdio.h>
void main(){
    unsigned int a = 2;
    unsigned int *also_a = &a; // also_a is a pointer that stores the address of a

    unsigned int b = 1;

    a+=b;

    printf("\n%d %d\n", a, *also_a);
}

说明

在解决方案 1 中使用变量:aalso_a 的情况下,两个不同的内存位置中有两个单独的变量。每个都有自己的:名称、价值和地址。因此,我们可以在两个地方存储无符号整数。在a 中发生的任何更改都不会影响also_a

要允许also_aa 一起更改,我们可以检查a 是否已更改,然后将a 的值分配给also_a

在解决方案 2 中使用指针 在解决方案 2 中,只有 1 个变量 a。因此只有一个:名称、价值和位置。另一方面,also_a 是一种特殊类型的变量,称为指针,它只能存储其他位置的地址。因此只有一个地方可以存储无符号整数。第二个变量,我们称之为指针,“指向”这个地方。因此,对存储在此位置的值所做的任何更改:都会影响变量以及指针指向的值。

我们不需要检查任何东西。只需更改值,所有变量和指针都会更新。

如果您有此类要求,我建议您了解有关指针的更多信息。这里是a nice video that might help。虽然是C++视频,但和C完全相关。

【讨论】:

  • 解决方案2中,您为什么保留支票prev_a != a?这是多余的,并且由于未声明 prev_a,因此还会引入编译错误。
  • 感谢您指出这一点。我从第一个解决方案中复制粘贴了代码并且错过了删除它。
  • 没问题,这就是 cmets 的用途;) 现在就给它 +1
【解决方案2】:

是的,你需要在这里使用指针。 Brief explanation 关于使用指针。

简而言之,使用指针also_a 您正在查看内存中存储变量a 的相同位置。因此,当a 更改使用also_a 检索的值时,将反映这一点。

#include <stdio.h>

void main()
{
    unsigned int a = 2;
    unsigned int *also_a = &a; // pointer (*) to adress (&) of variable a

    unsigned int b = 1;

    a+=b;

    printf("\n%d %d\n", a, *also_a); // de-reference (*also_a) to access value
}

结果:

3 3

【讨论】:

    【解决方案3】:

    指针总会帮助你

    #include <stdio.h>
    int main()
    {
        unsigned int a = 2;
        unsigned int *also_a = &a;
        unsigned int b = 1;
        a+=b;
        printf("\n%d %d\n", a, *also_a);
    }
    
    3 3
    

    【讨论】:

      【解决方案4】:

      a += b 下放置also_a = a
      这应该有效。
      您也可以使用指针,但这样更容易。
      你也可以使用int* also_a = &amp;a

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-01
        • 2020-08-24
        • 2015-07-11
        • 1970-01-01
        • 1970-01-01
        • 2014-06-13
        • 2019-11-07
        • 1970-01-01
        相关资源
        最近更新 更多