Адреса и указатели
Помимо ссылок, в C++ есть ещё один способ добраться до переменной из другого места: указатели. Чтобы их понять, нужно знать, что такое адрес.
Каждая переменная живёт в памяти компьютера. Память можно представить как длинный ряд пронумерованных ячеек, а номер ячейки, где живёт переменная, называется её адресом. Адрес переменной получают знаком & перед её именем:
#include <iostream>
int main() {
int age = 15;
std::cout << age << std::endl;
std::cout << &age << std::endl;
return 0;
}Это выводит, например:
15
0xfff4Адрес выводится как шестнадцатеричное число, поэтому он начинается с 0x, а среди цифр могут быть буквы. На вашем компьютере он будет другим и длиннее, например 0x7ffc1b2a3c4c. Вам не нужно знать, какое это число. Важно, что адрес можно сохранить в переменной и через неё добраться до самой переменной.
Переменная, в которой хранится адрес, называется указателем. Её тип — это тип переменной, на которую она указывает, со звёздочкой после него. Указатель на int имеет тип int*, указатель на double — тип double*:
int age = 15;
int* pointer = &age;Читайте вторую строку так: «pointer — указатель на int, и он хранит адрес переменной age». Мы говорим, что pointer указывает на age.
До переменной, на которую указывает указатель, можно добраться через звёздочку перед указателем: *pointer. Так её можно и читать, и записывать:
#include <iostream>
int main() {
int age = 15;
int* pointer = &age;
std::cout << *pointer << std::endl;
*pointer = 16;
std::cout << age << std::endl;
return 0;
}Это выводит:
15
16Инструкция *pointer = 16; записала 16 в переменную, на которую указывает указатель, то есть в age. Это похоже на ссылку, но звёздочку приходится писать каждый раз.
Частые ошибки:
int* pointer = age;без&заканчивается ошибкойcannot initialize a variable of type 'int *' with an lvalue of type 'int': указатель хранит адрес, а не число.pointer = 16;без звёздочки заканчивается ошибкойincompatible integer to pointer conversion assigning to 'int *' from 'int': вы пытаетесь записать число в сам указатель, а не в переменную, на которую он указывает.- Тип указателя должен совпадать с типом переменной.
double price = 9.5;и затемint* pointer = &price;заканчивается ошибкойcannot initialize a variable of type 'int *' with an rvalue of type 'double *'. Дляdoubleнуженdouble*. - Если вывести
pointerбез звёздочки, программа не упадёт, но выведет адрес вместо значения, например0xfff4.
Задание
- 1
Под переменной
valueсоздайте указатель типаint*с именемpointer, который указывает наvalue. - 2
Под ним с помощью указателя измените значение переменной на
10. Не записывайте вvalueнапрямую: пишите через*pointer. Тогда программа выведетЗначение переменной: 10. - 3
В конце программы (перед
return 0;) выведите значение через указатель: текстЧерез указатель:и значение, на которое указываетpointer. Программа выведетЗначение переменной: 10, а затемЧерез указатель: 10.