C++의 역참조 포인터
이 튜토리얼은 C++의 역참조 포인터에 대한 간략한 설명입니다.
실제 주제로 이동하기 전에 먼저 포인터가 무엇이며 C++ 프로그래머가 포인터가 필요한 이유를 이해해야 합니다.
C++의 포인터
C++에서 변수는 식별자가 액세스하는 메모리 위치로 간주됩니다. 이 방법을 사용하면 프로그래머는 특정 변수가 저장된 메모리의 물리적 주소를 인식하지 못하고 식별자 또는 변수 이름으로 액세스합니다.
C++ 프로그램에서 물리적 메모리는 각 셀이 1바이트 크기인 일련의 메모리 셀입니다. 1바이트 이상의 변수가 메모리에 저장되면 연속 메모리 위치를 차지합니다.
예를 들어 int
변수는 크기가 4바이트이므로 정수 값을 저장하려면 4개의 연속 메모리 셀이 필요합니다.
변수가 C++에서 선언되면 필요한 양의 메모리가 특정 주소(물리적 주소라고 함)에 할당됩니다. 이것은 일반적으로 운영 체제 또는 해당 물리적 주소가 있는 프로그램의 환경에 의해 런타임에 결정됩니다.
이 메모리 주소는 일부 변수에 액세스하고 저장할 수 있습니다. address-of
연산자로 알려진 연산자를 사용하여 &
기호로 표시됩니다.
&
연산자를 사용하여 C++에서 메모리 주소 얻기
address-of
연산자는 특정 변수가 저장된 메모리 주소를 얻습니다. 변수 이름 앞에 &
연산자를 붙여서 사용합니다.
아래 코드 스니펫을 참조하십시오.
addr = &newvar
이렇게 하면 변수 newvar
의 주소가 변수 addr
에 할당되지만 내용에는 할당되지 않습니다. 이것은 아래 그림에 묘사되어 있습니다.
예:
newvar = 25;
addr = &newvar
출력:
이 코드에서는 먼저 값 25
를 변수 newvar
에 할당했으며 newvar
는 메모리 위치 3
에 저장됩니다. 그런 다음 newvar
의 주소를 addr
변수에 할당했습니다.
따라서 newvar
의 주소를 저장한 addr
변수는 newvar
의 메모리 주소인 3
값을 가집니다.
C++에서 포인터 선언
다른 변수의 주소를 저장하는 변수를 포인터 변수라고 합니다. 위의 예에서 addr
변수는 포인터입니다.
포인터는 프로그래밍에서 매우 강력한 기능입니다. 특정 유형의 포인터 변수는 동일한 유형의 변수를 가리킵니다.
포인터 변수 선언 시 별표(*
) 연산자를 사용하여 선언합니다. 아래 코드 스니펫을 고려하십시오.
#include <iostream>
using namespace std;
int main() {
int num = 5;
int* pNum;
pNum = #
cout << "Value of num is: " << num << endl;
cout << "Address of num is: " << pNum << endl;
return 0;
}
출력:
프로그램 출력은 5
인 newvar
의 값과 pNum
포인터에 저장된 주소를 보여줍니다.
포인터는 변수 값을 직접 가리키는 기능 때문에 포인터가 가리키는 변수와 동일한 데이터 유형을 가져야 합니다.
통사론:
datatype * nameOfPointer;
여기서 데이터 유형
은 그것이 가리키는 변수의 유형입니다.
예:
int* numPtr;
char* charPtr;
double* doublePtr;
이 코드 스니펫에는 세 가지 포인터 선언이 있지만 서로 다른 유형입니다. 그것들은 메모리에서 같은 양의 공간을 차지하도록 의도되었습니다(공간의 양은 프로그램의 환경에 따라 다름).
둘 다 다른 유형의 변수를 가리킬 수 없습니다.
C++에서 *
연산자를 사용하여 포인터 역참조
이전 예제에서는 address-of
연산자를 사용하여 포인터에 변수의 주소를 저장했습니다. 역참조 연산자(*
)는 포인터가 가리키는 변수의 내용을 가져옵니다.
포인터에 주소가 저장된 변수 값을 얻을 수 있습니다.
아래 예제에서는 포인터를 역참조하고 변수를 직접 사용하여 변수 newvar
값에 액세스합니다. 출력에서 둘 다 동일하다는 것을 관찰할 수 있습니다.
#include <iostream>
using namespace std;
int main() {
int num = 5;
int* pNum;
pNum = #
cout << "Value of num is: " << num << endl;
cout << "Address of num is: " << pNum << endl;
cout << "Value of num by using pointer: " << *pNum << endl;
return 0;
}
출력:
다음과 같이 다른 변수에서 역참조된 값을 저장할 수도 있습니다.
num2 = *pNum;
이는 num2
가 pNum
이 가리키는 변수 값과 같음을 의미합니다. 이는 다음 그림에 설명되어 있습니다.
여기서 num2
는 역참조 연산자를 사용하여 num
과 동일한 값을 할당합니다.
역참조가 복사본을 만드는가
역참조보다 더 많은 작업을 수행하면 역참조가 복사본을 만드는 경우가 있습니다. 따라서 역참조된 값을 사용하여 새 변수를 초기화하면 위의 예와 같이 복사본이 됩니다.
그러나 역참조된 값을 사용하여 일부 참조 변수에 참조로 저장하면 복사본이 아니라 별칭이 생성됩니다.
int num = 5;
int* pNum = #
int& num2 = *pNum;
역참조 연산자는 마지막 줄에서 참조 변수 num2
를 초기화했습니다. 이 참조 변수 num2
는 이제 num
의 주소를 포함하고 num
의 별칭입니다. 값을 복사하지 않습니다.
이것은 아래 그림에 설명되어 있습니다.
이제 num2
도 num
의 메모리 주소를 포함하기 때문에 num
을 가리킵니다. 따라서 포인터는 프로그래밍에 유용한 도구이며 프로그래밍 중에 효율적인 메모리 및 시간 관리를 제공합니다.
Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.
LinkedIn