Уроки модуля (2/2)
Указатели
Указатели — одна из самых мощных и отличительных особенностей C++. Они позволяют получить прямой доступ к физической памяти компьютера, обеспечивая эффективное управление ресурсами и высокую производительность.
1. Что такое память и адрес?
Каждая переменная, которую вы объявляете в своей программе, хранится в ячейке оперативной памяти. Каждая ячейка имеет уникальный адрес памяти (обычно выражаемый в шестнадцатеричном формате, например 0x7ffee3bf87ac).
C++ позволяет нам получить адрес памяти любой переменной с помощью оператора адреса &:
int x = 42;
std::cout << &x; // Prints the memory address of x (e.g., 0x7ffee3bf87ac)2. Определение указателя
Указатель — это специальная переменная, которая хранит в качестве своего значения адрес памяти другой переменной.
Синтаксис требует использования звездочки * после типа данных:
int x = 42;
int* ptr = &x; // ptr is a pointer to an integer that contains the address of x3. Оператор разыменования (*)
Чтобы получить доступ к значению, хранящемуся по адресу, на который указывает указатель, или изменить его, мы используем оператор разыменования (или оператор косвенного направления), также представленный символом *:
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):
int* ptr = nullptr; // Safe null pointerПопробуйте сами
В main есть целочисленная переменная, значение которой инициализируется значением 42. Объявите указатель на целочисленный ptr, который указывает на адрес значения. Используйте разыменование ptr, чтобы установить значение value равным 100, и, наконец, напечатайте значение с помощью std::cout.
Показать подсказку
Объявите указатель с помощью `int* ptr = &value;`, измените значение, разыменовав `*ptr = 100;`, и напечатайте `std::cout << value;`.
Решение доступно после 3 попыток
Определите функцию doubleValue, которая принимает указатель на целое число (int* ptr) и умножает значение, на которое оно указывает, на 2 (если указатель не равен нулю). В main вызовите doubleValue, передав адрес переменной num, и распечатайте его.
Показать подсказку
Функция должна принимать `int* ptr`. Внутри используйте `*ptr = (_ptr) _ 2`. В основном вызовите его с помощью `doubleValue(&num);`.
Решение доступно после 3 попыток
Учитывая предоставленный код, какое выражение позволяет вам напрямую изменить значение a, установив его равным 10?
int a = 5;
int* p = &a;
// quale istruzione assegna 10 ad a?