Итоги
В этом уроке вы узнали, что:
- Каждая переменная хранится в памяти и имеет адрес.
&x— адрес переменнойx, а%pего выводит. - Указатель — это переменная, в которой лежит адрес:
int *p = &x;. Его тип говорит, на что он указывает:int *,double *,char *. *p— значение, на которое указываетp(разыменование). Его можно прочитать,printf("%d\n", *p);, и изменить,*p = 20;. Без звёздочкиp = &y;меняет то, куда указывает указатель.- В объявлении
*создаёт указатель. Перед указателем она берёт значение по адресу. Между двумя значениями она умножает.&и*— противоположности. - Функция с параметром-указателем может изменить переменную вызывающей стороны:
void add_bonus(int *points, int bonus), вызовadd_bonus(&score, 5). Забытый&в вызове — ошибка компиляции; забытая*внутри функции — баг без всякой ошибки. - С помощью указателей функция может поменять местами две переменные или вернуть сразу несколько результатов (выходные параметры).
- Имя массива — адрес его первого элемента, поэтому работают
int *p = numbers;иp[1]. Параметрint numbers[]— указатель, то же самое, чтоint *numbers. Вот почему функция меняет массив вызывающей стороны и ей нужно количество элементов. NULL— указатель, который не указывает никуда. Функция, возвращающая указатель, например адрес найденного элемента, возвращаетNULL, если ничего не нашла. Указатель, который может бытьNULL, проверяйте перед использованием:if (p != NULL). Чтение черезNULLостанавливает программу здесь с ошибкойRuntimeError: unreachable.const int *numbers— указатель, через который функция только читает. Текст в кавычках получает указательconst char *:const char *name = "Анна";.
В следующем уроке, о структурах, вы научитесь объединять связанные значения, например имя ученика и его баллы, в одну переменную. Указатели пригодятся и там.
Задание
- 1
Давайте потренируемся. В массиве
scoresлежат результаты контрольной, и учитель добавляет каждому бонус. Вышеmainнапишите функциюadd_bonusс параметрамиint *scores,int countиint bonus. Она прибавляет бонус к каждому баллу, но ни один балл не должен превысить 100: больший становится равным 100. Вызовите её с бонусом10перед циклом. Программа выведет55,82,100,48и76, по одному числу в строке. - 2
Ниже
add_bonusнапишите функциюfind_min_maxс параметрамиconst int *scores,int count,int *lowestиint *highest. Через два указателя она записывает наименьший и наибольший баллы, то есть возвращает сразу два результата. Начните с того, что запишете в оба первый элемент. В концеmainсоздайте две переменные, передайте их адреса функции и выведите их:Наименьший: 48, наибольший: 100.