Знаки & и *
Теперь у каждого из знаков & и * вы знаете по два значения, и начинающие часто их путают. Важно, где они стоят:
- В объявлении, когда вы создаёте переменную или параметр, они стоят сразу после типа и входят в тип. Читайте
int&как «ссылка на int», аint*как «указатель на int». - В выражении, то есть в коде, который что-то вычисляет, присваивает или выводит, они стоят перед именем переменной и что-то с ней делают.
& | * | |
|---|---|---|
| В объявлении (после типа) | int& r = x; ссылка: r — другое имя для x | int* p = &x; указатель: p хранит адрес переменной типа int |
| В выражении (перед переменной) | &x — адрес переменной x | *p — переменная, на которую указывает p |
А когда * стоит между двумя значениями, как в price * 2, это обычное умножение. Двойной && вы знаете из условий, где он означает «и». В этом примере встречаются почти все значения:
#include <iostream>
int main() {
int x = 5;
int& r = x; // объявление: r — ссылка на x
int* p = &x; // объявление: p — указатель; выражение &x: адрес x
*p = r * 2; // выражение: *p — это переменная x, r — тоже x, * между ними умножает
std::cout << x << std::endl;
return 0;
}Это выводит:
10Когда вы их путаете, компилятор обычно сообщает об этом, причём часто находит сразу несколько ошибок. Исправляйте их, как обычно, начиная с первой.
Задание
- 1
Программа не компилируется: компилятор находит ошибки в строках 5, 6 и 9. С помощью таблицы исправьте знаки
&и*так, чтобы каждая строка делала то, что сказано в её комментарии. Тогда программа выведетОчки: 120. - 2
Но последняя строка выводит адрес вместо очков, например
Через указатель: 0xfff4. Исправьте её так, чтобы она выводила значение через указатель:Через указатель: 120.