Указатель на указатель в C++

Ukazatel Na Ukazatel V C



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

Сценарий 1. Представление в памяти указателя на указатель

В этом сценарии объявление двойного указателя аналогично объявлению указателя с дополнительной звездочкой (*) перед именем указателя. Мы можем легко представить расположение двойного указателя в памяти в C++. Фрагмент кода указателя на указатель приведен ниже:







#include
использование пространства имен std;
int главный ( )
{
целая цифра  = пятьдесят ;
интервал * Птрр;
птрр = & цифра;
интервал ** птрр1;
птр1 '=' & Птрр;
расчет << «Адрес памяти указателя: \п ' ;
расчет << 'ptrr (указатель): ' << птрр << ' \п ' ;
расчет << '*ptrr1 (двойной указатель): ' <<* птр1 << ' \п ' ;
расчет << 'Значения, хранящиеся в указателе: \п ' ;
расчет << '*ptrr = ' <<* птрр << конец;
расчет << '**ptrr1 (указатель на указатель) = ' <<** птр1 << конец;
возвращаться 0 ;
}


В основной функции мы берем переменную, адрес памяти которой нужно сохранить в указателе. Теперь мы инициализируем переменную «цифра». После этого мы объявляем указатель «ptrr», хранящий «цифровой» адрес памяти. Теперь мы объявляем двойной указатель с именем «**ptrr1», в котором хранится адрес указателя «*ptrr». В конце кода мы отображаем память и значение указателя и двойного указателя на экране консоли. Вывод этого кода упоминается ниже:




Адрес памяти указателя «ptrr» — «0x6ffe04», а указатель «*ptrr1» также хранит адрес памяти указателя «ptrr». Значение, хранящееся внутри указателя, — «50». По сути, адрес двойного указателя всегда совпадает с адресом указателя в памяти.



Сценарий 2. Указатель на указатель как параметр функции.

В этом сценарии мы научимся передавать двойной указатель в любую функцию в качестве параметра для выполнения временного выделения памяти в любой переменной. Фрагмент кода параметра функции с двойным указателем упоминается ниже:





#include
недействительный getMemoryAddress ( интервал ** двойной_ptr ) {
твоя погода = 200 ;
* двойной_птр = & температура;
}

int главный ( ) {
интервал * птр_1;
интервал ** двойной_птр;
двойной_птр = & птр_1;
getMemoryAddress ( двойной_ptr ) ;
станд::cout << 'Значение **double_ptr: ' << ** двойной_ptr << станд::эндл;
возвращаться 0 ;
}


Здесь мы узнаем, как концепция указателя на указатель работает в C++. Помните, что в программе объявлен один указатель для работы с двойным указателем. Итак, мы создаем функцию getMemoryAddress. Мы спроектировали эту функцию так, чтобы при передаче параметра она автоматически получала адрес памяти двойного указателя.

В функции мы берем переменную «tempp» и двойной указатель «**double_ptr». Мы передаем адрес указанной переменной «tempp» в двойной указатель и значения двойного указателя в качестве аргумента функции. Программа отображает результат кода основной функции на экране консоли, поэтому все, что есть в основной функции, является исполняемым. Мы принимаем указатель «ptr_1» и двойной указатель как «double_ptr» в основной функции. Мы передаем адрес указателя двойному указателю.



Теперь мы передаем переменную двойного указателя в функцию переопределения и передаем указатель на переменную указателя в операторе выходного потока «cout», чтобы показать результат двойного указателя.

Когда компилятор достигает функции переопределения, программа проверки компилятора, в которой определена эта функция, выполняет код внутри функции и возвращает результат основной функции.

Вывод этого кода прилагается следующим образом:


Результат: значение двойного указателя равно 200.

Сценарий 3. Использование двумерного массива с указателем на указатель.

В этом примере мы будем иметь дело с 2D-массивом, имеющим двойной указатель. Мы берем массив и передаем адрес массива в указателе. Полный код этого сценария представлен следующим образом:

int главный ( ) {
константные целые строки = 3 ;
константное целое число столбцов = 2 ;
интервал ** матрица = новый int * [ ряды ] ;
для ( интервал я = 0 ; я < ряды; ++я ) {
матрица [ я ] = новый интервал [ столбцы ] ;
}
для ( интервал я = 0 ; я < ряды; ++я ) {
для ( интервал j = 0 ; дж < столбцы; ++j ) {
матрица [ я ] [ дж ] = я * столбцы + j;
}
}
для ( интервал я = 0 ; я < ряды; ++я ) {
для ( интервал j = 0 ; дж < столбцы; ++j ) {
расчет << матрица [ я ] [ дж ] << ' ' ;
}
расчет << конец;
}
для ( интервал я = 0 ; я < ряды; ++я ) {
удалить [ ] матрица [ я ] ;
}
удалить [ ] матрица;
возвращаться 0 ;
}


Как мы все знаем, в двумерном массиве много строк и несколько столбцов. В основной функции мы инициализируем строки и столбцы, имеющие «const int». После этого мы выделяем пространство памяти для строк и пространство памяти для столбцов вдоль каждой строки. Мы передаем значение количества строк в качестве указателя в двойном указателе матрицы как «**matrix». В этом двойном указателе выполняется цикл количества строк или true. Затем выполняется еще один внутренний цикл, пока условие не станет ложным.

После выделения памяти мы снова присваиваем значение в массиве: внешний цикл для строк и внутренний цикл для столбцов 2D-массива. Во внутреннем цикле значения строк и столбцов присваиваются двойному указателю и выполняют необходимую арифметическую операцию. Мы отображаем значения двумерного массива, такие как количество строк и столбцов, выделенных в памяти. Количество строк и столбцов всегда указывает на двойной указатель, в котором хранятся значения строк и столбцов. В конце мы очищаем память и освобождаем этот массив из памяти в C++.

Вывод двумерного массива с двойным указателем прикреплен следующим образом:

Сценарий 4. Обмен указателями с помощью указателя на указатель

Здесь мы узнаем, как менять местами указатели в C++, объявляя двойной указатель. Фрагмент кода этого сценария прилагается ниже:

#include
недействительный своп ( интервал ** птр_1, ты ** ptrr_2 ) {
интервал * темп_вар = * птр_1;
* птр_1 = * птр_2;
* ptrr_2 = temp_var;
}
int главный ( ) {
интервал х = пятнадцать , у = 25 ;
интервал * птррА = & Икс, * птрБ = & и;
станд::cout << 'Перед заменой: *ptrrA is = ' << * птрра << ', *ptrrB = ' << * птррБ << станд::эндл;
менять ( & птрра, & птррБ ) ;
станд::cout << 'После замены: *ptrrA  is = ' << * птрра << ', *ptrrB  is= ' << * птррБ << станд::эндл;
возвращаться 0 ;
}


Сначала мы создаем функцию swap, передавая оба указателя в качестве аргумента функции. В функции swap мы берем указатель «temp» и в течение некоторого времени передаем значение «pointer1» в «temp». Затем мы передаем значение «pointer2» в «pointer1». В конце мы передаем значение указателя «temp» в «pointer2».

В основной функции нам нужны два указателя, которые мы передаем или переопределяем в функции swap. Мы передаем адреса переменных по заданным указателям. Затем отображается значение указателя до и после замены указателя.

Вывод этого кода прилагается следующим образом:


Как мы видим, значения указателя успешно меняются местами с использованием двойного указателя в C++.

Заключение

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