Перейти к основному содержимому
Модуль 5 · Урок 2 из 212/18 в курсе~15 min
Уроки модуля (2/2)

Указатели

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


1. Что такое память и адрес?

Каждая переменная, которую вы объявляете в своей программе, хранится в ячейке оперативной памяти. Каждая ячейка имеет уникальный адрес памяти (обычно выражаемый в шестнадцатеричном формате, например 0x7ffee3bf87ac).

C++ позволяет нам получить адрес памяти любой переменной с помощью оператора адреса &:

C++
int x = 42;
std::cout << &x; // Prints the memory address of x (e.g., 0x7ffee3bf87ac)

2. Определение указателя

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

Синтаксис требует использования звездочки * после типа данных:

C++
int x = 42;
int* ptr = &x; // ptr is a pointer to an integer that contains the address of x

3. Оператор разыменования (*)

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

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

std::cout << *ptr; // Prints 42 (the value ptr points to)

*ptr = 100; // Modifies the value of x through the pointer
std::cout << x;    // Now prints 100!

4. Нулевые указатели: nullptr

Указатель, который не указывает ни на какой действительный адрес, должен быть инициализирован с помощью ключевого слова nullptr (введенного в C++11):

C++
int* ptr = nullptr; // Safe null pointer

Попробуйте сами

Упражнение#cpp.m5.l2.e1
Попыток: 0Загрузка…

В main есть целочисленная переменная, значение которой инициализируется значением 42. Объявите указатель на целочисленный ptr, который указывает на адрес значения. Используйте разыменование ptr, чтобы установить значение value равным 100, и, наконец, напечатайте значение с помощью std::cout.

Загрузка редактора…
Показать подсказку

Объявите указатель с помощью `int* ptr = &value;`, измените значение, разыменовав `*ptr = 100;`, и напечатайте `std::cout << value;`.

Решение доступно после 3 попыток

Упражнение#cpp.m5.l2.e2
Попыток: 0Загрузка…

Определите функцию doubleValue, которая принимает указатель на целое число (int* ptr) и умножает значение, на которое оно указывает, на 2 (если указатель не равен нулю). В main вызовите doubleValue, передав адрес переменной num, и распечатайте его.

Загрузка редактора…
Показать подсказку

Функция должна принимать `int* ptr`. Внутри используйте `*ptr = (_ptr) _ 2`. В основном вызовите его с помощью `doubleValue(&num);`.

Решение доступно после 3 попыток

Quiz#cpp.m5.l2.q1
Готово

Учитывая предоставленный код, какое выражение позволяет вам напрямую изменить значение a, установив его равным 10?

C++
int a = 5;
int* p = &a;
// quale istruzione assegna 10 ad a?
Варианты ответа