Найти тему
IT Nation

Указатели в C/C++ простым языком

Привет, сегодня хотелось бы поговорить об указателях в языках программирования Си и С++ (дело в том что работа с памятью в С++ такая же как и в Си). Ну что же ? Поехали!

Что такое указатели?

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

Да-да, если вы не знали, то указатели это тип данных и весит указатель всего 4 байта (8 если компилировать под x64) 

Давайте подробнее! 

Указатель — такая переменная, которая хранит в себе адрес чего-то в оперативной памяти компьютера.

Но давайте по порядку, у каждой переменной есть свой адрес. Представьте, что вы хотите узнать адрес какой-то переменной в оперативной памяти. Как это сделать?

Взгляните на этот код
Взгляните на этот код

В шестой строке мы просто вывели на печать адрес переменной variable.

& - Это оператор взятия адреса. Он возвращает адрес [чего-то]

Мы вывели адрес переменной, но на самом деле адреса нужны не для этого.

Нам нужно хранить адрес переменной и соответственно как-то с ним работать .

Но возникает логичный вопрос "А где хранить адрес переменной?"

Для этого есть специальный тип данных — указатели, например int*, char*, double*

И так далее, но возникает еще один вопрос

"Указатели весят одинаково, по 4/8 байт, почему есть разные типы указателей?"

В принципе вы можете хранить указатели в void*, но потом придется кастить тип, об этом вы узнаете позже.

Взгляните на этот код
Взгляните на этот код

Здесь, в 5 строке, мы создали переменную-указатель которая должна хранить адрес по которому расположено целое число, а в 6 строке мы просто присвоили нашей переменной-указателю адрес переменной variable, как видите ничего сложного в этом нет .

Теперь мы можем выводить на печать наш указатель и так далее, но что если мы захотим узнать, что хранится по адресу, который хранится в нашей переменной ? (знаю, звучит странно)

  • Для этого нужно подставить оператор * перед переменной-указателем.

Например, вот так:

Взгляните на этот код.
Взгляните на этот код.

Здесь мы вывели содержимое, которое хранилось по адресу при помощи операции звездочка! Кстати, это называется разыменование.

Что такое разыменование?

Переход по адресу называется разыменованием.

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

Swap (своп) - это обмен значений между переменными.
Вот код нашей функции
Вот код нашей функции

И так, наша функция должна получить два адреса, я думаю, это понятно.

Потом создается некий буфер, я думаю, это тоже понятно.

А в шестой строке мы разыменовываем left и передаем содержимое в буфер.

В седьмой строке мы меняем левое значение на правое, а потом правое значение на значение из буфера и все!

Чтобы сделать свап нужно всего лишь вызвать функцию вот так .
swap(&a, &b); // Передаем адреса в своп-функцию

На этом пока что все!

Обязательно подписывайтесь на наш телеграмм-канал, если хотите увидеть продолжение, удачи!