인프런 커뮤니티 질문&답변

최지로님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C++

6.19 다중 포인터와 동적 다차원 배열

다중포인터에서 문법이 이해가 안갑니다..

21.07.05 00:55 작성

·

355

0

    int *ptr = nullptr;

    int **ptrptr = nullptr;

    int va = 5;

    ptr = &va;

    ptrptr = &ptr;

    cout << ptr << " "<< *ptr<<" "<< &ptr<< endl;

    cout << ptrptr << " " << *ptrptr << " " << **ptrptr << " " << &ptrptr << endl;

이렇게 출력을 해보면

003FF784 5 003FF79C

003FF79C 003FF784 5 003FF790

003FF784

이렇게 나오는데

**ptrptr 에서 *ptr로 출력하는 부분이 이해가 잘 안됩니다..

제가 이해한대로 설명하자면

*ptr부분은

ptr << *ptr << &ptr

ptr은 va에 대입 했으니 va 주소값이 나오고

*ptr은 주소안의 있는 값이 나오는거니 5 나오고

&ptr은 자신 주소값이 나오고

**ptrptr 부분은

ptrptr << *ptrptr << **ptrptr << &ptrptr에서

ptrptr은 ptr에 대입했으니 그 ptr은 va에 대입했으니 va주소값

*ptrptr과 **ptrptr 부분이 이해가 안갔는데

이렇게 출력해보고  제 생각은 

**ptrptr의*ptrptr를 출력했을떄

*ptr의 ptr과 같은 맥락이고

**ptrptr를 출력했을떄

*ptr과 같은 맥락이다..라고 이해했습니다

즉 *ptr == ptr 같고 **ptrptr == *ptr 같다

제가 이해한게 맞을까요??

답변 2

1

안소님의 프로필 이미지

2021. 07. 06. 14:47

포인터도 변수에요. 그냥 int a = 2 이런 변수와 마찬가지라고 생각하시면 이해하시는데 편합니다. 

int 변수는 int 데이터 값을 담을 수 있는 저장공간인 셈이죠. int 인 값을 저장합니다.

마찬가지로 int * 변수는 어떤 int 데이터가 위치한 메모리 주소값을 담는 저장공간인 셈입니다. 

또한 int ** 변수는 어떤 int * 데이터가 위치한 메모리 주소값을 담는 저장공간인 셈입니다. 포인터(주소값을 저장하는 변수)의 포인터인셈이에요. 

이런 그림이라고 생각해주시면 됩니다. 주소는 제가 임의로 붙여본거에요. 

**ptrptr 은 *(*ptrptr) 이나 마찬가지에요. 괄호가 있다고 생각하면 이해가 좀 더 편하실거에요.

*ptrptr 즉 ptrptr 을 간접참조 한다는건 ptrptr 이 가지고 있는 값에 해당하는 주소로 가서 그 원본 메모리를 참조한다는 것입니다. 즉, *ptrptr 은 ptr 이 가지고 있는 값이 되겠죠. ptrptr 은 ptr 의 주소를 담으니까요. 근데 ptr 또한 포인터이기 때문에 ptr 이 가지고 있는 값은 또 va 의 주소에요. 결론적으로 *(*ptrptr) = *ptr = 이 되어 va 메모리를 참조하는게 됩니다. 

최지로님의 프로필 이미지
최지로
질문자

2021. 07. 10. 02:01

그렇군요
제가 설명이 부족하긴 했지만

제가 이해한게 맞는거네요??

안소님의 프로필 이미지

2021. 07. 11. 09:42

최지로님의 프로필 이미지
최지로
질문자

2021. 07. 11. 22:29

귀찮을텐데 항상 답변 감사합니다!

0

최지로님의 프로필 이미지
최지로
질문자

2021. 07. 05. 01:19

질문쓰고 다시한번 생각을 정리해서 써봅니다..

역참조가 주소에 접근해 주소안의 값을 가져오는거라

이해했었습니다

그래서 *ptr에 역참조해서 출력하면

대입했던 va주소안에 있는 5를 가져왔던거고

강의를 보면 초반에 *ptrptr도 역참조를 해준다 하셨습니다

역참조 연산자 *가 있으니 당연한건데

이중포인터 **라 좀 햇갈리더라구요

그래서 왜 va의 주소값이 나왔을까..? 의문이 들었습니다..

va = ptr = ptrptr 이 순서라

ptrptr의 역참조를 하면

ptrptr에 대입한 &ptr에 주소로 가면

ptr에 대입한 va의 주소값이 있으니 &va에 주소값이 나온건가?

그럼 **ptrptr은 역참조를 두번 한건가??

그럼 ptrptr에 대입한 &ptr에 주소로 가면

ptr에 대입한 &va의 주소값이 있고

&va의 주소로 가면 가르키는 값인 5를 가져온건가??

그럼 역참조 연산자가 * 일떈 

역참조를 한번밖에 못하는거고

**역참조가 두개일떈 역참조를 두번할 수 있다..

이렇게 생각한게 맞을까요??

이게 맞다면 이중 포인터는

    ptr = &va;

    ptrptr = &ptr

이런식으로 역참조를 두번 사용 해야 할떄 사용하는게 맞고

삼중포인터는 ***역참조 연산자를 세번 사용하니

역참조를 세번 사용할 코딩이 있을시 사용하는거겠네요??

머리가 나빠 한번에 이해를 못하고

생각을 계속 정리하다 보니 이렇게 정리가 되었습니다..

제가 맞게 이해한걸까요??