Указатели в C++: объясняем простыми словами

Всем привет! В этом уроке мы разберём то, что очень тесно связано с памятью в компьютере. С помощью этого можно улучшать работу своей программы. Как вы догадались с названия урока, это - указатели.
Адрес переменной в C++
Поголовно у каждой переменной имеется свой индивидуальный адрес. Адрес переменной - это путь, по которому находится значение самой переменной. Он записывается в шестнадцатеричном виде. Так, компьютер может записать переменную, как в такой адрес 0x155,
так и в такой 0x212
.
Давайте приведем аналогию с круизным лайнером. В нем, как и в отеле, имеются номера. Вот, например, при покупке номера вам могут дать номер - 0x155
(да, мы понимаем, что не в одном лайнере или отеле не станут записывать номера в шестнадцатеричном виде, но давайте все таки немного отвлечемся). А друг может оказаться в номере 0x212
- так и с переменными, они могут получить разный путь. И только сам компьютер при создании переменной знает, где она находится.
Переменные, которые вы создаете в программе, по её завершению автоматически удаляются, чтобы не нагружать операционную память вашего компьютера.
Пример удаления переменных
В играх присутствует хорошая графика, различные спецэффекты. Например, тот же дым. Все это - переменная (может не одна!), которой в будущем придётся уничтожиться навсегда. А вот, если бы она не удалилась, то она бы своей фоновой работой понемножку нагружала бы наш компьютер.
Поэтому в C/C++ присутствует возможность обратиться к переменной, и, если требует ситуация, удалить и создать её вовсе в другом участке программы, когда это, конечно, нам будет нужно.
Что такое указатели в C++
Указатели - это с самого начала переменные, уже в которых хранится адрес других переменных.
Чтобы пользоваться указателями, вам нужно использовать два оператора:
*
- показывает значение переменной по заданному адресу (показывает, кто живет в этом номере). Если вы используете операто р*
, то вы занимаетесь операцией разыменование указателя.&
- показывает адрес переменной (говорит, по какому адресу проживает этот человек).
Как создать указатели в C++
Давайте посмотрим, какую конструкцию нужно использовать, чтобы создать указатели:
*<имя переменной> = &<имя другой переменной>
Давайте подробно разберем, как эта она работает:
- В самом начале мы ставим оператор
*
(звездочку). Так мы говорим компилятору, что хотим использовать тип данных - указатель. - Дальше мы должны указать имя нашей переменной.
- После знака равно нам нужно передать указателю адрес какой-то переменной, что мы и делаем с помощью оператора
&
(амперсанд).
Чтобы передать адрес какой-то переменной, от одного указателя другому, нужно опускать оператор *
для одного указателя (от которого мы передаем второму):
int a = 15 + 5;
int *ykazatel = &a;
int *ykazatel_second = ykazatel; // присвоили адрес переменной a
cout << *ykazatel_second;
В нашем случае мы опустили оператор *
для ykazatel
.
Используем указатели на примере
Чтобы получше понять указатели, давайте их разберем на примере ниже.
Отец работает программистом в крупной компании, которая находится в 0x145
городе, и ему предложили поехать в командировку в 0x195
город, которую он так долго ждал. Он смог оповестить только своего сына о том, что уезжает. Поэтому сыну придется передать это маме самому.
Пример выше мы сейчас реализуем на C++ с помощью указателей.
#include <iostream>
using namespace std;
int main() {
setlocale(0, "");
int dad_gorod;
int *dad_son = &dad_gorod;
int *mama = dad_son;
system("pause");
return 0;
}
Давайте подробно разберем код выше:
- В строке 8: создали переменную
dad_gorod
, в которой находится адрес (город, в который уехал отец). - В строке 9: создали указатель
dad_son
(это сын), он узнает имя города. - В строке 11: объявили указатель
mama
, которая уже от сына получает имя города.
Так сын (dad_son
) в нашем примере является указателем.
Часто у новичков есть некоторое недопонимание, как работает указатель. Они начинают путать операторы *
, &
.
Вам нужно помнить, что:
*
- используется, когда вам нужно значение переменной.&
- используется, когда вам понадобилось узнать адрес переменной.
Как передать указатели функциям
Вы, наверное, заметили, передавая функции аргумент и изменяя его в функции, переменная, значение которой мы передавали, никак не изменятся. И это понятно, потому что мы передаем значение одной переменной - другой переменной. Вот на примере ниже мы решили изменить значение передаваемой переменной:
#include <iostream>
using namespace std;
void func(int func_number) {
func_number = 5;
}
int main() {
setlocale(0, "");
int main_number = 10;
cout << "Значение main_number до использования функции: " << main_number << endl;
func(main_number);
cout <<"А это значение main_number после использования функции: "<< main_number;
system("pause");
return 0;
}
Давайте запустим эту программу:
Значение main_number до использования функции: 10
А это значение main_number после использования функции: 10
Process returned 0 (0x0) execution time : 0.010 s
Press any key to continue.
Как видно выше, у нас ничего не получилось, что и сразу было понятно. А вот если нам по-настоящему нужно изменить значение переменной в функции, нам понадобится оперировать указателями.
Чтобы изменить значение переменной, нам понадобится:
- В аргументах функции создать указатель.
- Далее при вызове функции передать адрес переменной, которую мы собираемся изменить.
Вот и все! На примере ниже вы можете увидеть, как это реализовать:
#include <iostream>
using namespace std;
void func(int *func_number) {
*func_number = 5;
}
int main() {
setlocale(0, "");
int main_number = 10;
func(&main_number);
cout << main_number;
system("pause");
return 0;
}
Закрепляем указатели
Чтобы закрепить данный материал, мы предлагаем вам выполнить это задание:
- Создайте переменную и сразу же присвойте ей значение 5.
- Создайте указатель на эту переменную.
- Измените значение переменной с помощью указателя.
- Выведите значение переменной снова с помощью указателя.
В этом уроке мы разобрали, как нужно пользоваться указателями в C++. Если у вас есть вопрос, то напишите его в комментариях ниже. Удачи!
Обсуждение