Изменение через указатель
*p нужен не только для чтения. Это сама переменная, поэтому ей можно и присваивать. *p = 20; кладёт 20 в ячейку, на которую указывает p:
#include <stdio.h>
int main(void) {
int age = 15;
int *p = &age;
*p = 20;
printf("age: %d\n", age);
*p += 1;
printf("age: %d\n", age);
return 0;
}Программа выведет:
age: 20
age: 21Программа нигде не пишет age = ..., и всё же age изменилась. age и *p — два способа добраться до одной и той же ячейки. Поэтому *p работает везде, где подошла бы age: *p = *p * 2;, *p -= 3;.
Осторожно с ++: пишите *p += 1; или (*p)++;. Без скобок *p++; прибавляет 1 к самому указателю (сдвигает его на следующую ячейку) и не меняет age, а ошибки никакой нет.
Без звёздочки вы меняете сам указатель, то есть то, куда он указывает. Это тоже полезно. В этой игре указатель player всегда указывает на счёт того игрока, чей сейчас ход:
int anna = 0;
int peter = 0;
int *player = &anna;
*player += 5;
player = &peter;
*player += 3;
printf("Анна: %d, Павел: %d\n", anna, peter);Программа выведет:
Анна: 5, Павел: 3player = &peter; без звёздочки направляет player на другую переменную. *player += 3; со звёздочкой меняет переменную, на которую он указывает теперь, — peter.
Запомните: *p = ... со звёздочкой меняет значение в ячейке. p = ... без звёздочки меняет то, куда указывает p, и требует адрес. Если забыть звёздочку в *p = 20;, строка p = 20; заканчивается ошибкой incompatible integer to pointer conversion assigning to 'int *' from 'int': вы пытаетесь положить число 20 в сам указатель.
Задание
- 1
Ниже переменных (выше
printf) создайте указательp, который указывает наlives. Ещё ниже задайте жизни равными5через указатель:*p = 5;. Не пишитеlives = 5;. Программа выведетЖизни: 5, щиты: 1. - 2
Ниже (всё ещё выше
printf) добавьте ещё 2 жизни, снова через указатель. Программа выведетЖизни: 7, щиты: 1. - 3
Теперь указатель должен указывать на щиты. В конце программы (перед
return 0;) направьтеpна переменнуюshields. - 4
Ниже добавьте 1 щит через указатель и снова выведите строку с жизнями и щитами тем же способом. Программа выведет
Жизни: 7, щиты: 1, а затемЖизни: 7, щиты: 2.