Указатели как параметры
Функция может принимать и указатель. Тогда у неё есть адрес переменной, и она может менять эту переменную через *. Так передают переменные в функции в программах на C: C++ вырос из языка C, в котором нет ссылок. Поэтому такой стиль вы увидите в старом коде и во многих библиотеках:
#include <iostream>
void addPoint(int* points) {
*points = *points + 1;
}
int main() {
int score = 10;
addPoint(&score);
std::cout << "Очки: " << score << std::endl;
return 0;
}Это выводит:
Очки: 11Сравните это с функцией addPoint из первого упражнения урока, у которой был параметр int& points. Теперь у параметра тип int*, внутри функции перед ним пишут *, а вызов передаёт адрес: addPoint(&score). Плюс в том, что сам вызов показывает, что функция может изменить score. Минус в том, что символов больше, а значит, и ошибиться проще.
Частые ошибки:
- Вызов без
&,addPoint(score), заканчивается ошибкойno matching function for call to 'addPoint'и примечаниемcandidate function not viable: no known conversion from 'int' to 'int *' for 1st argument; take the address of the argument with &. Компилятор даже подсказывает, что делать: передать адрес с помощью&. - Наоборот, когда функция ждёт ссылку, а вы передаёте ей адрес, примечание заканчивается словами
remove &. - Если забыть звёздочку внутри функции и написать
points = points + 1;, программа скомпилируется без ошибки, но изменит адрес, хранящийся в указателе, а не очки. Переменнаяscoreостанется равной10.
Задание
- 1
В игре жизнь можно купить за 100 монет. На месте первого комментария напишите функцию
buyLifeс двумя параметрами типаint*: указателямиlivesиcoins. Через указатели функция вычитает 100 монет и прибавляет одну жизнь. - 2
В
mainвызовитеbuyLifeна месте комментария перед первой строкой вывода и передайте ей адреса переменныхlivesиcoins. Программа дважды выведетЖизни: 4, монеты: 50. - 3
Жизнь можно купить, только если у вас не меньше 100 монет. Добавьте в функцию условие: если у игрока меньше 100 монет, функция ничего не меняет и выводит
Не хватает монет. Затем вызовитеbuyLifeвторой раз, на месте последнего комментария. Программа выведетЖизни: 4, монеты: 50, затемНе хватает монет, а потом сноваЖизни: 4, монеты: 50.