Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Указатели в 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). Этот оператор называется оператором разыменования.

Примечание: В C++ pointVar (указатель) и *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;

Рекомендуемые темы для изучения:

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

Язык C

  1. Понимание типов данных C++: основы, модификаторы и лучшие практики
  2. Освоение операторов C++: полное руководство с практическими примерами
  3. Комментарии в C++: лучшие практики для читаемого и поддерживаемого кода
  4. Шаблоны классов в C++: практическое руководство
  5. Освоение указателей в C: практическое руководство от экспертов
  6. Указатели в C++: концепции, примеры и практические применения
  7. Указатели в C: полное руководство — объявление, арифметика, массивы, функции и динамическая память
  8. Язык программирования C++: обзор и ключевые особенности
  9. Константы и литералы в C++: типы, синтаксис и лучшие практики
  10. Полное руководство по операторам C++: типы, использование и лучшие практики