Как я могу сделать изменение переменной, когда другое изменение - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть этот код:

#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, я думаю, что я должен использовать указатели, но я не уверен,

Ответы [ 4 ]

2 голосов
/ 17 апреля 2020

Указатели всегда помогут вам

#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
1 голос
/ 17 апреля 2020

Это может быть достигнуто с помощью указателя, но если вы еще не используете его, то я предполагаю, что вы не знакомы с концепцией. Таким образом, первое решение без использования указателя.

Решение 1

В этом решении. перед использованием переменной too_a выполняется проверка, чтобы увидеть, изменилось ли значение a. Это не автомат c и, следовательно, не может рассматриваться как решение. Но это то, что вы получите от меня без использования указателей.

#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: Что происходит в случае a и also_a, там две отдельные переменные в двух разных местах памяти. У каждого свои: имя, значение и адрес. Таким образом, есть два места, где мы можем хранить наше целое число без знака. Любые изменения, которые происходят в a, не влияют на also_a.

Чтобы разрешить изменение also_a на a, мы можем проверить, изменилось ли a, а затем присвоить значение a also_a.

Использование указателей в решении 2 В решении 2 есть только 1 переменная a. Таким образом, есть только одно: имя, значение и местоположение. also_a с другой стороны - это специальный тип специального типа переменной, называемый указателем, который может хранить только адрес некоторого другого местоположения. Таким образом, есть только одно место, где мы можем хранить целое число без знака. Вторая переменная, которую мы будем называть указателем, «указывает» на это место. Таким образом, любое изменение, внесенное в значение, хранящееся в этом месте: влияет на переменную и значение, указанное указателем.

Нам не нужно ничего проверять. Просто измените значение, и все переменные и указатели будут обновлены.

Я бы порекомендовал узнать больше об указателях, если у вас есть такие требования. Вот хорошее видео, которое может помочь . Хотя это видео на C ++, оно полностью соответствует C.

1 голос
/ 17 апреля 2020

Да, вам нужно использовать указатели. Краткое объяснение об использовании указателей.

Короче говоря, используя указатель 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
0 голосов
/ 17 апреля 2020

Под a += b положить also_a = a.
Это должно работать.
Вы также можете использовать указатель, но так проще.
Вы также можете использовать int* also_a = &a

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...