Указатели в C++: адрес и удаление
Всем привет! В этом уроке мы разберём то, что очень тесно связано с памятью в компьютере. С помощью этого можно улучшать работу своей программы. Как вы догадались с названия урока, это — указатели.
Адрес переменной в C++
Поголовно у каждой переменной имеется свой индивидуальный адрес. Адрес переменной — это путь, по которому находится значение самой переменной. Он записывается в шестнадцатеричном виде. Так, компьютер может записать переменную, как в такой адрес 0x155,
так и в такой 0x212
.
Давайте приведем аналогию с круизным лайнером. В нем, как и в отеле, имеются номера. Вот, например, при покупке номера вам могут дать номер — 0x155
(да, мы понимаем, что не в одном лайнере или отеле не станут записывать номера в шестнадцатеричном виде, но давайте все таки немного отвлечемся). А друг может оказаться в номере 0x212
— так и с переменными, они могут получить разный путь. И только сам компьютер при создании переменной знает, где она находится.
Переменные, которые вы создаете в программе, по её завершению автоматически удаляются, чтобы не нагружать операционную память вашего компьютера.
Пример удаления переменных
В играх присутствует хорошая графика, различные спецэффекты. Например, тот же дым. Все это — переменная (может не одна!), которой в будущем придётся уничтожиться навсегда. А вот, если бы она не удалилась, то она бы своей фоновой работой понемножку нагружала бы наш компьютер.
Поэтому в C/C++ присутствует возможность обратиться к переменной, и, если требует ситуация, удалить и создать её вовсе в другом участке программы, когда это, конечно, нам будет нужно.
Что такое указатели в C++
Указатели — это с самого начала переменные, уже в которых хранится адрес других переменных.
Чтобы пользоваться указателями, вам нужно использовать два оператора:
*
— показывает значение переменной по заданному адресу (показывает, кто живет в этом номере). Если вы используете оператор*
, то вы занимаетесь операцией разыменование указателя.&
— показывает адрес переменной (говорит, по какому адресу проживает этот человек).
Как создать указатели в C++
Давайте посмотрим, какую конструкцию нужно использовать, чтобы создать указатели:
1 |
*<имя переменной> = &<имя другой переменной> |
Давайте подробно разберем, как эта она работает:
- В самом начале мы ставим оператор
*
(звездочку). Так мы говорим компилятору, что хотим использовать тип данных — указатель. - Дальше мы должны указать имя нашей переменной.
- После знака равно нам нужно передать указателю адрес какой-то переменной, что мы и делаем с помощью оператора
&
(амперсанд).
Чтобы передать адрес какой-то переменной, от одного указателя другому, нужно опускать оператор *
для одного указателя (от которого мы передаем второму):
1 2 3 4 5 6 7 |
int a = 15 + 5; int *ykazatel = &a; int *ykazatel_second = ykazatel; // присвоили адрес переменной a cout << *ykazatel_second; |
В нашем случае мы опустили оператор *
для ykazatel
.
Используем указатели на примере
Чтобы получше понять указатели, давайте их разберем на примере ниже.
Отец работает программистом в крупной компании, которая находится в 0x145
городе, и ему предложили поехать в командировку в 0x195
город, которую он так долго ждал. Он смог оповестить только своего сына о том, что уезжает. Поэтому сыну придется передать это маме самому.
Пример выше мы сейчас реализуем на C++ с помощью указателей.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#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
) в нашем примере является указателем.
Часто у новичков есть некоторое недопонимание, как работает указатель. Они начинают путать операторы *
, &
.
Вам нужно помнить, что:
*
— используется, когда вам нужно значение переменной.&
— используется, когда вам понадобилось узнать адрес переменной.
Как передать указатели функциям
Вы, наверное, заметили, передавая функции аргумент и изменяя его в функции, переменная, значение которой мы передавали, никак не изменятся. И это понятно, потому что мы передаем значение одной переменной — другой переменной. Вот на примере ниже мы решили изменить значение передаваемой переменной:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#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; } |
Давайте запустим эту программу:
Как видно выше, у нас ничего не получилось, что и сразу было понятно. А вот если нам по-настоящему нужно изменить значение переменной в функции, нам понадобится оперировать указателями.
Чтобы изменить значение переменной, нам понадобится:
- В аргументах функции создать указатель.
- Далее при вызове функции передать адрес переменной, которую мы собираемся изменить.
Вот и все! На примере ниже вы можете увидеть, как это реализовать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#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.
- Создайте указатель на эту переменную.
- Измените значение переменной с помощью указателя.
- Выведите значение переменной снова с помощью указателя.
Тест на тему «Указатели». Проверь себя!
Если эта надпись не исчезает долгое время, попробуйте обновить страницу. Этот тест использует javascript. Пожалуйста, влкючите javascript в вашем браузере.
В этом уроке мы разобрали, как нужно пользоваться указателями в C++. Если у вас есть вопрос, то напишите его в комментариях ниже. Удачи!
int 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;
}
Неправильно работает. Точнее вообще не работает
Не забыли в начале программы написать
#include
?
Насколько я понимаю, функция func() должна возвращать целочисленное значение. Чтобы исправить, нужно либо сделать return какого-то значения, или переписать первую строку как
void func(int *func_number) {
Исправил
Кажется ты забыл сделать из func_number указатель. Наверное просто звездочку поставь вот так *func_number=5; и вес.
Тебе либо нужно использовать амперсант при обновлении параметра:
void func(int& func_number) {...}
, либо, как сказал Cable, разыменовывать указатель при присваивании:
*func_number = 5;
Ну и про
return
не забудь :).*func_number = 5;