C++ 포인터 참조자 (2) 역참조
Accessing Pointer Address
◆ 포인터의 타입
● 컴파일러는 포인터가 가리키는 타입이 맞는지 확인한다.
☞ int* 는 int가 저장된 주소만, double*은 double이 저장된 주소만 가리킬 수 있다.
int score = 10;
double score_precise = 100.7;
int* score_ptr = nullptr;
score_ptr = &score;
score_ptr = &score_precise; // 컴파일 에러!
score_ptr = nullptr; 될 때까지의 stack 메모리 값이다.
score_ptr = &score;
까지는 문제 없으나
score_ptr = &score_precise; 하게 되면 컴파일 에러가 된다.
int* 선언하였으면 int 주소값만 메모리로 받을 수 있다.
기술적으로는 받을 수 있으나 C++ 컴파일러가 막아놨다.
(* 그래서 파이썬은 var라는 함수로 형 변환에 자유롭게 배열을 나눌 수 있으나
C++는 안된다는것을 알았다.)
중요한 Part 이다. ★★★★★
Dereferencing a Pointer
◆ 포인터의 역참조
● 포인터의 주소에 저장된 데이터에 접근
● * 연산자를 사용
int score = 10;
int* score_ptr = &score;
cout << *score_ptr << endl; // 10
*score_ptr = 20;
cout << *score_ptr << endl; // 20
cout << score << endl; // 20
역참조란 타연산자를 사용한다.
변수를 사용할때 * 를 붙이면 포인터의 역참조이다.
역참조를 하게 된다면 주소값을 가지고 저장된 데이터를 접근하여
변동(업데이트)을 할 수 있다.
* 는 포인터 변수 선언과 역참조 둘 다 사용된다.
변수를 선언할때 * 기호를 쓰는 것은 포인터 변수 선언이며
선언 이후에 * 기호를 붙는거는 역참조를 위해 사용하는 것이며,
역참조는 그 포인터 변수에 저장되어 있는 것을 해당 주소값으로 가서
값을 읽어오거나 변동하기 위해서 사용한다.
(역참조의 개념은 강조하기 때문에 꼭 알아두자.)
double high_temp = 100.7;
double low_temp = 37.4;
double* temp_ptr = &high_temp;
cout << *temp_ptr << endl; // 100.7
temp_ptr = &low_temp;
cout << *temp_ptr << endl; // 37.4
temp_ptr을 역참조 해서 선언하였다.
temp_ptr = & low_temp; 을 선언하면
이렇게 변동되며, *temp_ptr은 37.4가 된다.
고급 Part이다. ★★★
Memory Debugging
◆ 포인터에 대한 메모리 디버깅
● 메모리 창에서 저장된 변수를 볼 때는 &a와 같이 변수 이름 앞에 & 를 붙여 주었다
☞ 그 이유는?
● 포인터가 가리키는 값을 보기 위해서는 &가 필요 없을까?
☞ 그 이유는?
주소 : 보고 싶은 메모리의 주솟값을 작성.
&num을 선택하면 num의 주소로 간다.
0x0133 d800 -> num의 메모리 주소이다.
num_ptr의 주소를 검색하여도
0x0133 F800으로 나온다.
&num_ptr를 검색하게 된다면
순서가 뒤집혔지만
00 f8 33 01으로 들어가 있음이 확인된다
10 33 8F 00 => &num과 num_ptr의 주소와 동일하다.
num_ptr를 작성한 경우에는 0x0133 F800의 주소값에 존재하는 값으로 들어간다.
그렇기에 num_ptr 은 10이며
& num_ptr은 주솟값 0x0133 F7 F4이다.
이번 강의 요약은
포인터도 변수이기에 메모리 스택이 할당되며
할당된 값은 주솟값으로 한정되어 있다.
대신 앞서 쓴 변수형에 있는 주소값만 쓸 수 있다.
https://youtu.be/aJ7 oMCVW0 z0? si=-gl8 QAnOFS072 ItF