Указатели в 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;
}

Закрепляем указатели

Чтобы закрепить данный материал, мы предлагаем вам выполнить это задание:

  1. Создайте переменную и сразу же присвойте ей значение 5.
  2. Создайте указатель на эту переменную.
  3. Измените значение переменной с помощью указателя.
  4. Выведите значение переменной снова с помощью указателя.

В этом уроке мы разобрали, как нужно пользоваться указателями в C++. Если у вас есть вопрос, то напишите его в комментариях ниже. Удачи!

Цикл do while в C++ »

« Динамические массивы и переменные в C++

Обсуждение