Адреса
Добро пожаловать в урок об указателях. Многие считают указатели самой трудной частью C, поэтому этот урок идёт неспешно, по одному маленькому шагу за упражнение. Это окупится: указатели позволяют функции менять ваши переменные и показывают, как на самом деле устроены массивы.
Всё начинается с памяти. Пока программа работает, её переменные хранятся в памяти компьютера. Представьте память как длинный ряд пронумерованных ячеек, вроде шкафчиков в школьном коридоре. У каждой переменной своя ячейка, а номер ячейки — это адрес переменной.
Чтобы получить адрес переменной, напишите & перед её именем: &age означает «адрес переменной age». Чтобы вывести адрес, используйте %p (p от pointer — «указатель»), так же как целое число выводят через %d:
#include <stdio.h>
int main(void) {
int age = 15;
int score = 80;
printf("Возраст: %d\n", age);
printf("Адрес age: %p\n", &age);
printf("Адрес score: %p\n", &score);
return 0;
}Программа выведет:
Возраст: 15
Адрес age: 0xfffc
Адрес score: 0xfff8Адреса выводятся в шестнадцатеричной системе (с основанием 16). Поэтому они начинаются с 0x, а среди цифр могут встречаться буквы от a до f. Читать их вам не нужно. На вашем компьютере адреса были бы намного длиннее, например 0x7ffd5e8c3a4c, и могли бы меняться при каждом запуске программы. Важны только две вещи: у каждой переменной есть адрес, и у разных переменных адреса разные.
Два адреса отличаются на 4, потому что int занимает 4 байта памяти (байт — самая маленькая единица памяти). Считать байты в этом курсе не придётся: за вас это делает компьютер.
Символ & перед переменной не имеет отношения к && из условий. Один & прямо перед именем означает «адрес».
Остерегайтесь таких ошибок:
- Если забыть
&, компилятор вас остановит.printf("%p\n", age);заканчивается ошибкойformat specifies type 'void *' but the argument has type 'int'.%pожидает адрес (void *— так в C записывают «адрес чего угодно»), аage— этоint, число 15. - Обратная ошибка:
printf("%d\n", &age);заканчивается ошибкойformat specifies type 'int' but the argument has type 'int *'.%dожидает целое число, а&age— адрес. Типint *означает «адресint». С ним вы познакомитесь в следующем упражнении.
Задание
- 1
В конце программы (перед
return 0;) выведите адрес переменнойlives: текстАдрес lives:и%pс&lives. Тогда программа выведет ещё и строку видаАдрес lives: 0xfffc(число может быть другим). - 2
Ниже выведите адрес
coinsтак же, с текстомАдрес coins:. Два адреса разные: у каждой переменной своя ячейка.