C++의 포인터에 대한 포인터

C Ui Pointeoe Daehan Pointeo



이 문서는 C++의 포인터 개념에 대한 포인터입니다. 포인터에 대한 포인터는 다른 포인터의 주소를 가리키거나 저장하며 포인터 자체를 조작할 수 있습니다. 이 개념을 사용하면 메모리의 다른 위치에서 포인터를 쉽게 수정할 수 있습니다. 이중 포인터는 동적으로 할당된 메모리나 다차원 배열에서 배열 요소를 조작하는 데 유용합니다. 우리는 적절한 예제를 통해 C++에서의 포인터 작동 및 사용법에 대한 이 포인터에 대해 논의할 것입니다.

시나리오 1:  포인터 대 포인터의 메모리 표현

이 시나리오에서 이중 포인터 선언은 포인터 이름 앞에 추가 별표(*)가 있는 포인터 선언과 유사합니다. C++에서는 이중 포인터의 메모리 위치를 쉽게 나타낼 수 있습니다. 포인터에 대한 포인터의 코드 조각은 다음과 같습니다.







#include
네임스페이스 std 사용;
정수 메인 ( )
{
정수 숫자  = 오십 ;
정수 * ptrr;
ptrr = & 숫자;
정수 ** ptrr1;
ptrr1 = & ptrr;
시합 << '포인터 메모리 주소는 다음과 같습니다. \N ' ;
시합 << 'ptrr(포인터): ' << ptrr << ' \N ' ;
시합 << '*ptrr1(이중 포인터): ' <<* ptrr1 << ' \N ' ;
시합 << ' 포인터에 저장되는 값은 다음과 같습니다. \N ' ;
시합 << '*ptrr = ' <<* ptrr << 끝;
시합 << '**ptrr1(포인터에 대한 포인터) = ' <<** ptrr1 << 끝;
반품 0 ;
}


메인 함수에서는 메모리 주소를 포인터에 저장해야 하는 변수를 사용합니다. 이제 'digit' 변수를 초기화합니다. 그런 다음 '숫자' 메모리 주소를 저장하는 'ptrr' 포인터를 선언합니다. 이제 '*ptrr' 포인터의 주소를 저장하는 '**ptrr1'이라는 이름의 이중 포인터를 선언합니다. 코드 마지막에는 포인터와 이중 포인터의 메모리와 값을 콘솔 화면에 표시합니다. 이 코드의 출력은 다음과 같습니다.




'ptrr' 포인터의 메모리 주소는 '0x6ffe04'이고, '*ptrr1' 포인터도 'ptrr' 포인터의 메모리 주소를 저장합니다. 포인터 내부에 저장되는 값은 '50'입니다. 기본적으로 이중 포인터의 주소는 항상 포인터의 메모리 주소와 동일합니다.



시나리오 2:  함수 매개변수로서의 포인터에 대한 포인터

이 시나리오에서는 모든 변수에서 임시 메모리 할당을 수행하기 위해 모든 함수의 이중 포인터를 매개 변수로 전달하는 방법을 알아봅니다. 이중 포인터가 있는 함수 매개변수의 코드 조각은 다음과 같습니다.





#include
무효 getMemoryAddress ( 정수 ** double_ptr ) {
당신 날씨 = 200 ;
* double_ptr = & 온도;
}

정수 메인 ( ) {
정수 * ptr_1;
정수 ** double_ptr;
double_ptr = & ptr_1;
getMemory주소 ( double_ptr ) ;
표준::cout << '**double_ptr의 값은 다음과 같습니다: ' << ** double_ptr << 표준::endl;
반품 0 ;
}


여기서는 C++에서 포인터 개념에 대한 포인터가 어떻게 작동하는지 알아봅니다. 이중 포인터와 함께 작동하도록 프로그램에서 하나의 포인터가 선언되었음을 기억하십시오. 그래서 우리는 'getMemoryAddress' 함수를 구축합니다. 우리는 매개변수를 전달하면 자동으로 이중 포인터의 메모리 주소를 얻도록 이 함수를 설계합니다.

함수에서는 'tempp' 변수와 '**double_ptr' 이중 포인터를 사용합니다. 'tempp'라는 지정된 변수의 주소를 이중 포인터에 전달하고 이중 포인터 값을 함수의 인수로 전달합니다. 프로그램은 메인 함수 코드의 결과를 콘솔 화면에 표시하므로, 메인 함수에 있는 모든 것이 실행 가능합니다. main 함수에서는 'ptr_1' 포인터와 이중 포인터를 'double_ptr'로 사용합니다. 포인터의 주소를 이중 포인터에 전달합니다.



이제 override 함수에 이중 포인터 변수를 전달하고 'cout' 출력 스트림 문에 포인터 변수에 포인터를 전달하여 이중 포인터의 결과를 표시합니다.

컴파일러가 재정의 함수에 도달하면 이 함수가 정의된 컴파일러 검사기는 함수 내부의 코드를 실행하고 결과를 기본 함수에 반환합니다.

이 코드의 출력은 다음에 첨부되어 있습니다.


결과: 이중 포인터의 값은 200입니다.

시나리오 3:  포인터 대 포인터와 함께 2D 배열 사용

이번 예제에서는 이중 포인터를 갖는 2차원 배열을 다루겠습니다. 배열을 가져와 포인터에 배열의 주소를 전달합니다. 이 시나리오의 전체 코드는 다음과 같이 제공됩니다.

정수 메인 ( ) {
const int 행 = ;
const int 열 = 2 ;
정수 ** 행렬 = 새로운 정수 * [ ] ;
~을 위한 ( 정수 나는 = 0 ; 나 < 행; ++나는 ) {
행렬 [ ] = 새로운 정수 [ ] ;
}
~을 위한 ( 정수 나는 = 0 ; 나 < 행; ++나는 ) {
~을 위한 ( 정수 j = 0 ; 제이 < 열; ++j ) {
행렬 [ ] [ 제이 ] = 나 * 열 + j;
}
}
~을 위한 ( 정수 나는 = 0 ; 나 < 행; ++나는 ) {
~을 위한 ( 정수 j = 0 ; 제이 < 열; ++j ) {
시합 << 행렬 [ ] [ 제이 ] << ' ' ;
}
시합 << 끝;
}
~을 위한 ( 정수 나는 = 0 ; 나 < 행; ++나는 ) {
삭제 [ ] 행렬 [ ] ;
}
삭제 [ ] 행렬;
반품 0 ;
}


우리 모두 알고 있듯이 2D 배열에는 많은 행과 여러 열이 있습니다. main 함수에서는 'const int'를 갖는 행과 열을 초기화합니다. 그런 다음 모든 행을 따라 행에 대한 메모리 공간과 열에 대한 메모리 공간을 할당합니다. 행 수 값을 행렬 이중 포인터의 포인터로 “**matrix”로 전달합니다. 이 이중 포인터에서는 행 수의 루프가 실행되거나 true입니다. 그런 다음 조건이 거짓이 될 때까지 또 다른 내부 루프가 실행됩니다.

메모리 할당 후에는 배열에 값을 다시 할당합니다. 즉, 2D 배열의 행에 대한 외부 루프와 열에 대한 내부 루프입니다. 내부 루프에서는 행과 열의 값이 이중 포인터에 할당되고 필요한 산술 연산을 수행합니다. 메모리에 할당된 행과 열의 수와 같은 2D 배열의 값을 표시합니다. 행과 열의 수는 항상 행과 열 값을 저장하는 이중 포인터를 가리킵니다. 결국 우리는 메모리를 정리하고 C++의 메모리에서 이 배열을 할당 해제합니다.

이중 포인터가 있는 2D 배열의 출력은 다음과 같습니다.

시나리오 4:  포인터 대 포인터를 사용하여 포인터 교환

여기서는 C++에서 이중포인터를 선언하여 포인터를 바꾸는 방법을 알아보겠습니다. 이 시나리오의 코드 조각은 다음에 첨부되어 있습니다.

#include
무효 교환 ( 정수 ** ptrr_1, 당신 ** ptrr_2 ) {
정수 * 임시_var = * ptrr_1;
* ptrr_1 = * ptrr_2;
* ptrr_2 = 임시_var;
}
정수 메인 ( ) {
정수 x = 열 다섯 , y = 25 ;
정수 * ptrrA = & 엑스, * ptrrB = & 그리고;
표준::cout << '스왑 전: *ptrrA는 = ' << * ptrrA << ', *ptrrB는 = ' << * ptrrB << 표준::endl;
교환 ( & ptrrA, & ptrrB ) ;
표준::cout << '교체 후: *ptrrA  is = ' << * ptrrA << ', *ptrrB  is= ' << * ptrrB << 표준::endl;
반품 0 ;
}


먼저 두 포인터를 함수 인수로 전달하여 스왑 함수를 작성합니다. 스왑 함수에서는 'temp' 포인터를 가져와 'temp'의 'pointer1' 값을 한동안 전달합니다. 그런 다음 'pointer2'의 값을 'pointer1'에 전달합니다. 마지막으로 'temp' 포인터의 값을 'pointer2'에 전달합니다.

메인 함수에는 'swap' 함수에서 전달하거나 재정의하는 두 개의 포인터가 필요합니다. 변수의 주소를 주어진 포인터에 전달합니다. 그런 다음 포인터를 교체하기 전과 후의 포인터 값이 표시됩니다.

이 코드의 출력은 다음에 첨부되어 있습니다.


보시다시피, 포인터의 값은 C++의 이중 포인터를 사용하여 성공적으로 교체되었습니다.

결론

우리는 포인터에 대한 포인터가 항상 C++의 모든 포인터의 메모리 주소를 저장한다는 결론을 내렸습니다. 이중 포인터를 사용하면 언제든지 포인터의 메모리 위치를 일시적으로 사용할 수 있습니다. 이는 메모리 주소를 간접적으로 조작하고 데이터에 접근하는 매우 효과적인 방법입니다.