указатели в C++

Указатели в C++: адрес и удаление


Всем привет! В этом уроке мы разберём то, что очень тесно связано с памятью в компьютере. С помощью этого можно улучшать работу своей программы. Как вы догадались с названия урока, это — указатели.

адрес переменной Адрес переменной в C++

Поголовно у каждой переменной имеется свой индивидуальный адрес. Адрес переменной — это путь, по которому находится значение самой переменной. Он записывается в шестнадцатеричном виде. Так, компьютер может записать переменную, как в такой адрес 0x155, так и в такой 0x212.

Давайте приведем аналогию с круизным лайнером. В нем, как и в отеле, имеются номера. Вот, например, при покупке номера вам могут дать номер — 0x155 (да, мы понимаем, что не в одном лайнере или отеле не станут записывать номера в шестнадцатеричном виде, но давайте все таки немного отвлечемся). А друг может оказаться в номере 0x212 — так и с переменными, они могут получить разный путь. И только сам компьютер при создании переменной знает, где она находится.

Переменные, которые вы создаете в программе, по её завершению автоматически удаляются, чтобы не нагружать операционную​ память вашего компьютера.

удаление переменной Пример удаления переменных

В играх присутствует хорошая графика, различные спецэффекты. Например, тот же дым. Все это — переменная (может не одна!), которой в будущем придётся уничтожиться навсегда. А вот, если бы она не удалилась, то она бы своей фоновой работой понемножку нагружала бы наш компьютер.

Поэтому в C/C++ присутствует возможность обратиться к переменной, и, если требует ситуация, удалить и создать её вовсе в другом участке программы, когда это, конечно, нам будет нужно.

Что такое указатели в C++ Что такое указатели в C++

Указатели — это с самого начала переменные, уже в которых хранится адрес других переменных.

Чтобы пользоваться указателями, вам нужно использовать два оператора:

  • * — показывает значение переменной по заданному адресу (показывает, кто живет в этом номере). Если вы используете оператор *,  то вы занимаетесь операцией разыменование указателя.
  • & — показывает адрес переменной (говорит, по какому адресу проживает этот человек).

Как работают указатели в C++ Как создать указатели в C++

Давайте посмотрим, какую конструкцию нужно использовать, чтобы создать указатели:

Давайте подробно разберем, как эта она работает:

  • В самом начале мы ставим оператор * (звездочку). Так мы говорим компилятору, что хотим использовать тип данных —  указатель.
  • Дальше мы должны указать имя нашей переменной.
  • После знака равно нам нужно передать указателю адрес какой-то переменной, что мы и делаем с помощью оператора (амперсанд).

Чтобы передать адрес какой-то переменной, от одного указателя другому, нужно опускать оператор * для одного указателя (от которого мы передаем второму):

В нашем случае мы опустили оператор * для ykazatel.

Применение указателей на примере Используем указатели на примере

Чтобы получше понять указатели, давайте их разберем на примере ниже.

Отец работает программистом в крупной компании, которая находится в 0x145 городе, и ему предложили поехать в командировку в 0x195 город, которую он так долго ждал. Он смог оповестить только своего сына о том, что уезжает. Поэтому сыну придется передать это маме самому.

Пример выше мы сейчас реализуем на C++ с помощью указателей.

Давайте подробно разберем код выше:

  • В строке 8: создали переменную dad_gorod, в которой находится адрес (город, в который уехал отец).
  • В строке 9: создали указатель dad_son (это сын), он узнает имя города.
  • В строке 11: объявили указатель mama, которая уже от сына получает имя города.

Так сын (dad_son) в нашем примере является указателем.

Часто у новичков есть некоторое недопонимание, как работает указатель. Они начинают путать операторы *, &.

Вам нужно помнить, что:

  • * — используется, когда вам нужно значение переменной.
  • & — используется, когда вам понадобилось узнать адрес переменной.

Как изменить переменную в функции с помощью указателей Как передать указатели функциям

Вы, наверное, заметили, передавая функции аргумент и изменяя его в функции, переменная, значение которой мы передавали, никак не изменятся. И это понятно, потому что мы передаем значение одной переменной — другой переменной. Вот на примере ниже мы решили изменить значение передаваемой переменной:

Давайте запустим эту программу:

ykazately.cpp
Значение main_number до использования функции: 10
А это значение main_number после использования функции: 10
Process returned 0 (0x0) execution time : 0.010 s
Press any key to continue.

Как видно выше, у нас ничего не получилось, что и сразу было понятно. А вот если нам по-настоящему нужно изменить значение переменной в функции, нам понадобится оперировать указателями.

Чтобы изменить значение переменной, нам понадобится:

  • В аргументах функции создать указатель.
  • Далее при вызове функции передать адрес переменной, которую мы собираемся изменить.

Вот и все! На примере ниже вы можете увидеть, как это реализовать:

Закрепление указателей в С++ Закрепляем указатели

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

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



Тест на тему «Указатели». Проверь себя!

Пожалуйста, подождите пока страница загрузится полностью.
Если эта надпись не исчезает долгое время, попробуйте обновить страницу. Этот тест использует javascript. Пожалуйста, влкючите javascript в вашем браузере.

If loading fails, click here to try again

Если ты полностью разобрался в данном материале, то попробуй пройти несложный тест, который сможет выявить твои слабые стороны.
Начать


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




Комментарии к записи “Указатели в C++: адрес и удаление”

Добавить комментарий

Ваш адрес email не будет опубликован.

  • Alex:

    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
      ?

    • DCel:

      Насколько я понимаю, функция func() должна возвращать целочисленное значение. Чтобы исправить, нужно либо сделать return какого-то значения, или переписать первую строку как
      void func(int *func_number) {

    • Cable:

      Кажется ты забыл сделать из func_number указатель. Наверное просто звездочку поставь вот так *func_number=5; и вес.

    • Дмитрий:

      Тебе либо нужно использовать амперсант при обновлении параметра:
      void func(int& func_number) {...}
      , либо, как сказал Cable, разыменовывать указатель при присваивании:
      *func_number = 5;
      Ну и про return не забудь :).

  • anonim:

    *func_number = 5;