작성
·
358
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
포인터도 변수에요. 그냥 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 메모리를 참조하는게 됩니다.
0
질문쓰고 다시한번 생각을 정리해서 써봅니다..
역참조가 주소에 접근해 주소안의 값을 가져오는거라
이해했었습니다
그래서 *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
이런식으로 역참조를 두번 사용 해야 할떄 사용하는게 맞고
삼중포인터는 ***역참조 연산자를 세번 사용하니
역참조를 세번 사용할 코딩이 있을시 사용하는거겠네요??
머리가 나빠 한번에 이해를 못하고
생각을 계속 정리하다 보니 이렇게 정리가 되었습니다..
제가 맞게 이해한걸까요??
그렇군요
제가 설명이 부족하긴 했지만
제가 이해한게 맞는거네요??