← Назад к вопросам

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

1.6 Junior🔥 131 комментариев
#Язык C++

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

Указатель — это переменная, которая хранит адрес памяти другой переменной. Это фундаментальная концепция в C/C++, позволяющая работать с памятью напрямую и создавать сложные структуры данных.

Основные характеристики указателей

Объявление и инициализация:

int x = 42;
int* ptr = &x;  // ptr хранит адрес переменной x
                // & — оператор получения адреса (address-of)

Разыменование:

int value = *ptr;  // *ptr — получить значение по адресу
                   // value = 42

Оператор * работает в двух контекстах:

  • При объявлении: означает "это указатель"
  • При использовании: разыменование — доступ к значению по адресу

Типы указателей

Указатель на переменную:

int x = 10;
int* ptr = &x;  // Обычный указатель
*ptr = 20;      // x теперь 20

Указатель на массив:

int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr;  // arr автоматически преобразуется в указатель на первый элемент
int val = ptr[2];  // Эквивалентно arr[2], значение 3
ptr++;             // Смещение на sizeof(int) байт

Константные указатели:

int x = 10;
const int* ptr1 = &x;   // Указатель на константу (значение не менять)
int* const ptr2 = &x;   // Константный указатель (адрес не менять)
const int* const ptr3 = &x;  // Оба не менять

Указатель на указатель:

int x = 42;
int* ptr1 = &x;
int** ptr2 = &ptr1;  // Указатель на указатель
**ptr2 = 100;        // Изменить x через двойное разыменование

Указатели в памяти

Каждый указатель занимает место в памяти (обычно 8 байт на 64-битных системах) и хранит численное значение — адрес объекта.

int x = 42;
int* ptr = &x;

cout << &x << endl;   // Адрес x
cout << ptr << endl;  // То же, что &x
cout << *ptr << endl; // 42

Динамическое выделение памяти

Указатели незаменимы при работе с динамической памятью:

int* arr = new int[100];   // Выделить память на heap
arr[0] = 42;
delete[] arr;              // Освободить память
arr = nullptr;             // Хорошая практика

Указатели и функции

void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int x = 1, y = 2;
swap(&x, &y);  // Передаём адреса

Частые ошибки

Dangling pointer — указатель на удалённую память:

int* ptr;
{
    int x = 42;
    ptr = &x;
}  // x выходит из области видимости
*ptr;  // Undefined behavior!

Null pointer dereference:

int* ptr = nullptr;
*ptr = 42;  // Crash!

Когда использовать указатели?

  • Динамическое выделение памяти — работа с данными неизвестного размера
  • Передача по ссылке в функции для изменения оригинального значения
  • Полиморфизм — указатели на базовый класс для работы с наследованием
  • Сложные структуры данных — связные списки, деревья, графы
  • Оптимизация памяти — избегание копирования больших объектов

В современном C++ рекомендуется использовать умные указатели (std::unique_ptr, std::shared_ptr), которые автоматически управляют памятью и предотвращают утечки.

Что такое указатель? | PrepBro