akdlzhf2008   2년 전

C++ 공부 도중에 더블 포인터에 대한 의문이 생겨서 글을 남깁니다.

아래 코드를 실행하고 결과가 같은 것끼리 묶어보면

a = *p = **pp

&a = p = &(*p) = *pp = &(**pp)

&p = pp = &(*pp)

&pp

이렇게 나옵니다.

여기서 p는 a에 대한 포인터이므로 p = &a 인것이고 이 포인터 p를 가리키는 더블 포인터 pp = &p 인것도 이해가 됩니다.

그런데 *pp에서 좀 의문이 생깁니다.

저는 **pp를 선언했는데 *pp가 에러없이 사용될 수 있다는 것과 *pp = p = &a 라는 점이 궁금합니다.

단순히 asterisk가 참조 연산자라서 pp의 주소에 저장된 값을 참조하는데 pp가 p의 포인터라서 p의 주소가 나온건지

전반적으로 *pp에 대해서 이해가 되지 않습니다.

또 포인터를 선언했을때 메모리에 만들어지는건 p에 대한 메모리가 만들어지는게 맞나요? 그래서 *(asterisk)를 써서 그 메모리 주소에 저장된 값을 참조하는 거고 이 원리가 맞나요?

djm03178   2년 전

더블 포인터라는 것이 특별한 것이 아니라, 그냥 싱글 포인터의 포인터라고 생각하면 쉽습니다. 포인터 자체도 특별한 것이 아니라 그냥 주소를 담기 위한 하나의 자료형으로 생각해도 됩니다. int * 자체를 하나의 자료형, 대충 X라고 이름지어 보면,

X p;

X *pp = &p;

를 한 것과 같고, 그러면 여기서 pp와 p의 관계는 p와 a의 관계와 다를 것이 하나도 없다는 것을 볼 수 있습니다.

lcr7324   2년 전

컴퓨터의 메모리는 정말 단순하게 생각하시면 됩니다.

어딘가(주소)에 0101 뭐시기(값)를 저장한다

이건 포인터건 int형이건 double형이건 복잡한 struct형이던 다 똑같습니다.

중요한 건 이 저장된 값을 해석하는 방법입니다.

int형이라면 이 값을 정수로 해석하겠다는 뜻이고,

int*형이라면 이 값을 주소로 해석하겠다는 뜻이고,

int**형이라면 이 값을 주소로 해석하는데 그 주소로 찾아갔을 때 저장된 값도 주소로 해석하겠다는 뜻입니다.

a가 333번지에 10을 저장하고 있다고 합시다.

p는 555번지에 만들어졌습니다.

p = &a; 가 실행되면 555번지에 333이 저장됩니다.

pp는 777번지에 만들어졌습니다.

pp = &p; 가 실행되면 777번지에 555가 저장됩니다.

이제 * 연산자가 뭘 하는 건지만 정확히 이해하면 헷갈릴게 없습니다.

* 연산자는 이 변수가 가지고 있는 값이 주소로 해석된다는 사실을 알고 있을 때 (= 이 변수가 포인터일 때), 이 변수가 가지고 있는 값에 해당하는 주소로 찾아가서 거기에 저장된 값을 가져오겠다는 의미입니다.

그러니까 *p로 생각하면, p는 333이라는 값을 가지고 있는데 우리는 이 333이라는 값을 주소로 해석해서 333번지에 찾아가 거기 저장된 10을 가져오는 겁니다.

*pp도 똑같습니다.

pp는 555라는 값을 가지고 있고 555를 주소로 해석해서 찾아가면, 555번지에는 333이 저장되어 있죠. 이 값을 쓰겠다는 게 *pp의 의미입니다.

akdlzhf2008   2년 전

두 분 모두 감사합니다. 제가 너무 복잡하게 생각했던 것 같네요.. 설명해주신 덕분에 이해가 쉽게 됐습니다!

댓글을 작성하려면 로그인해야 합니다.