Чтение через указатель
Указатель знает, где лежит переменная. Чтобы получить значение из этой ячейки, напишите * перед указателем: *p означает «значение, на которое указывает p». Получение значения по адресу называется разыменованием указателя.
#include <stdio.h>
int main(void) {
int age = 15;
int *p = &age;
printf("%d\n", *p);
printf("%d\n", *p + 1);
return 0;
}Программа выведет:
15
16*p — это int, поэтому выводите его через %d и считайте с ним, как с любым целым числом.
& и * — противоположности. & спрашивает «где это лежит?» и превращает переменную в её адрес. * спрашивает «что там лежит?» и превращает адрес обратно в значение. Поэтому *&age — это снова просто age.
Указатель не хранит копию значения. Он знает только адрес, а *p каждый раз заглядывает в ячейку. Поэтому, когда переменная меняется, *p даёт новое значение:
int age = 15;
int *p = &age;
age = 16;
printf("%d\n", *p);Программа выведет:
16Теперь у звёздочки три значения. Важно, где она стоит:
- В объявлении, после типа:
int *p = &age;создаёт указатель. Здесь звёздочка говорит: «p— указатель». - Перед указателем в любом другом месте:
*p— это значение, на которое он указывает. - Между двумя значениями:
price * 2— умножение, как всегда.
Значит, *p * 2 означает «значение, на которое указывает p, умноженное на два». Первая звёздочка берёт значение по адресу, вторая умножает.
Типичная ошибка — забыть звёздочку. Тогда вы работаете с адресом вместо значения, и компилятор сообщает об этом:
printf("%d\n", p);заканчивается ошибкойformat specifies type 'int' but the argument has type 'int *':%dожидаетint, аp— адрес.p * 2заканчивается ошибкойinvalid operands to binary expression ('int *' and 'int'). Операнды — это значения по обе стороны от оператора, здесьpи2, а умножать адрес нельзя.
Задание
- 1
Программа не компилируется. Прочитайте сообщение об ошибке и исправьте последний
printfтак, чтобы он выводил значение, на которое указываетp, а не адрес. Программа выведетСчёт: 50иЧерез указатель: 50. - 2
Ниже выведите удвоенный счёт, снова через указатель: текст
Удвоенный счёт:и*p * 2. На следующей строке программа выведетУдвоенный счёт: 100. - 3
Ещё ниже измените счёт напрямую, без указателя:
score = 60;. Затем выведите текстТеперь:и*p. Указатель даёт новое значение:Теперь: 60.