Указатели в C++: практическое руководство
Указатели в C++
Это руководство объясняет указатели в C++, их механику и практические примеры для освоения этой важнейшей особенности языка.
В C++ указатель — это переменная, хранящая адрес памяти другой переменной. Указатели обеспечивают прямую манипуляцию памятью, динамическое выделение и эффективную работу с данными.
Адрес в C++
Для переменной var выражение &var возвращает её адрес в памяти. Например:
Пример 1: Вывод адресов переменных в C++
#include <iostream>
using namespace std;
int main() {
// Объявление переменных
int var1 = 3;
int var2 = 24;
int var3 = 17;
// Вывод адреса var1
cout << "Address of var1: " << &var1 << endl;
// Вывод адреса var2
cout << "Address of var2: " << &var2 << endl;
// Вывод адреса var3
cout << "Address of var3: " << &var3 << endl;
}
Вывод
Address of var1: 0x7fff5fbff8ac Address of var2: 0x7fff5fbff8a8 Address of var3: 0x7fff5fbff8a4
Адреса отображаются в шестнадцатеричном формате. Разница в 4 байта между последовательными адресами отражает 4-байтовый размер int в 64-битной системе.
Указатели в C++
Как показано, указатели хранят адреса, а не прямые значения. Объявление указателя просто:
int *pointVar;
Здесь pointVar — указатель на int. Предпочтительный синтаксис ставит звёздочку рядом с типом:
int* pointVar; // предпочтительный синтаксис
Множественные объявления также возможны:
int* pointVar, p;
В этой строке pointVar — указатель, а p — обычный int. Звёздочка ассоциируется с именем переменной, а не с типом.
* здесь используется для объявления указателей, а не для умножения.Присваивание адресов указателям
Чтобы связать указатель с адресом переменной, используйте оператор взятия адреса &:
int* pointVar, var;
var = 5;
// Присвоить адрес var указателю pointVar
pointVar = &var;
Теперь pointVar содержит адрес памяти переменной var.
Получение значения по адресу через указатели
Оператор разыменования * получает значение, хранящееся по адресу, на который указывает указатель:
int* pointVar, var;
var = 5;
pointVar = &var;
cout << *pointVar << endl; // Вывод: 5
Здесь *pointVar даёт значение var (5). Этот оператор называется оператором разыменования.
*pointVar (значение, на которое он указывает) — это разные сущности.Пример 2: Работа с указателями в C++
#include <iostream>
using namespace std;
int main() {
int var = 5;
// Объявление указателя
int* pointVar;
// Сохранение адреса var
pointVar = &var;
// Вывод значения var
cout << "var = " << var << endl;
// Вывод адреса var
cout << "Address of var (&var) = " << &var << endl << endl;
// Вывод указателя pointVar
cout << "pointVar = " << pointVar << endl;
// Вывод содержимого адреса, на который указывает pointVar
cout << "Content of the address pointed to by pointVar (*pointVar) = " << *pointVar << endl;
return 0;
}
Вывод
var = 5 Address of var (&var) = 0x61ff08 pointVar = 0x61ff08 Content of the address pointed to by pointVar (*pointVar) = 5
Изменение значения, на которое указывает указатель
Если pointVar указывает на var, изменение *pointVar меняет исходную переменную:
int var = 5;
int* pointVar;
pointVar = &var;
*pointVar = 1;
cout << var << endl; // Вывод: 1
И pointVar, и &var содержат один и тот же адрес; изменение разыменованного значения обновляет var.
Пример 3: Изменение значения через указатель
#include <iostream>
using namespace std;
int main() {
int var = 5;
int* pointVar;
// Сохранение адреса var
pointVar = &var;
// Вывод var
cout << "var = " << var << endl;
// Вывод *pointVar
cout << "*pointVar = " << *pointVar << endl << endl;
cout << "Changing value of var to 7:" << endl;
// Изменение значения var на 7
var = 7;
// Вывод var
cout << "var = " << var << endl;
// Вывод *pointVar
cout << "*pointVar = " << *pointVar << endl << endl;
cout << "Changing value of *pointVar to 16:" << endl;
// Изменение значения var на 16 через указатель
*pointVar = 16;
// Вывод var
cout << "var = " << var << endl;
// Вывод *pointVar
cout << "*pointVar = " << *pointVar << endl;
return 0;
}
Вывод
var = 5 *pointVar = 5 Changing value of var to 7: var = 7 *pointVar = 7 Changing value of *pointVar to 16: var = 16 *pointVar = 16
Частые ошибки при работе с указателями
Ниже приведены типичные ошибки и правильные способы работы с указателями:
int var, *varPoint;
// Ошибка! varPoint — это адрес, а var — нет
varPoint = var;
// Ошибка!
// &var — это адрес
// *varPoint — это значение, хранящееся в &var
*varPoint = &var;
// Правильно!
// varPoint — адрес, &var — тоже адрес
varPoint = &var;
// Правильно!
// и *varPoint, и var — значения
*varPoint = var;
Рекомендуемые темы для изучения:
- Как использовать указатели на void для обобщённых типов данных?
- Как представить массив с помощью указателя?
- Как использовать указатели с функциями?
- Как использовать указатели со структурами?

Язык C
- Понимание типов данных C++: основы, модификаторы и лучшие практики
- Освоение операторов C++: полное руководство с практическими примерами
- Комментарии в C++: лучшие практики для читаемого и поддерживаемого кода
- Шаблоны классов в C++: практическое руководство
- Освоение указателей в C: практическое руководство от экспертов
- Указатели в C++: концепции, примеры и практические применения
- Указатели в C: полное руководство — объявление, арифметика, массивы, функции и динамическая память
- Язык программирования C++: обзор и ключевые особенности
- Константы и литералы в C++: типы, синтаксис и лучшие практики
- Полное руководство по операторам C++: типы, использование и лучшие практики