C++/C++ : Study

C++ 포인터 참조자 (2) 역참조

더블유제이플로어 2024. 9. 16. 02:22

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