[C++ 01] 포인터 - 야 이게 어렵냐?

2024. 9. 27. 02:07카테고리 없음

 

 

네. 어려워요.

 

아니 근데 C++ 얘기한다면서 포인터로 시작하는건 뭔가 싶겠지만

C++ 얘기하면서 포인터 얘기를 안하는게 더 이상한거 아님?

 

일단 포인터가 뭔지 현대 지식의 창고 나무위키 로 빠르게 알아보자.

 

https://namu.wiki/w/C(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%20%EC%96%B8%EC%96%B4)/%ED%8F%AC%EC%9D%B8%ED%84%B0

 

그렇다고 한다.

 

 

....

 

 

 

 

그걸 누가 모름?

 

 

 

 

 

저런 말로 설명할거같으면 글도 안씀ㅇㅇ

 

별거 없는 주소값만 저장하는 주제에 어때서 C의 뉴비분쇄기가 되었을까?

우선 매우 생소하기 때문이라고 생각한다.

 

 

처음 C를 배우면 이런느낌으로 시작한다.

그러다 if, for, while 등등을 배우고 배열을 배우고

그러다 갑자기 포인터가 등장한다.

 

갑자기 무슨 주소값이 어쩌구 하고있으면 어질어질할수도 있다고 생각한다.

사실 나도 처음할때 여기서 런마려웠다.

 

거기다 주소를 가지고 뭘 하고싶은건지도 도저히 모르겠고

배우는 단계에서는 어디다 써먹을지도 감이 잘 안오기도 하고

이거 굳이 배워야함? 이라는 생각이 들기도 한다.

 

 

喝!!!!!!!

 

당연히 배우고 잘 이해하고 넘어가는것이 중요하다.

 

*로 선언하고 *로 역참조하고 어쩌고 다들 아는건 넘어가고

 

여기선 좀더 이해를 돕기 쉽게 이야기 하려고 한다.

 

보통 포인터를 설명하는 기술 블로그들을 보면 집주소에 많이 비유를 하는데

아주 좋은 비유다.

 

 

이 가족들을 지금부터 int 타입의 a 라고 하자.

 

그러면 이런식으로 a 가족이 사는 집의 주소를 int* 타입의 p_a로 나타낼 수 있다.

 

 

아까부터 다 아는 얘기만 하네

님 맞으실?

 

 

"느려"

 

이해를 위해 그림보고 글보고 하는건 이제 됬고

직접 까보면서 뭔지 알아보는게 더 이해가 잘될것 같다고 생각한다.


아까 위에서 말한 주소는 메모리에서의 주소를 의미하는 것인데

주소를 가지고 a 가족이 잘 지내시는지 관음을 해보려고 한다.

 

비주얼 스튜디오에서는 메모리를 까보는 것이 가능하다.

어줍잖은 코드말고 집 뚜껑따서 직접 알아보자.

 

 

대충 빠르게 써주고

F10으로 디버거를 이용하여 뚜따 준비를 해주자.

 

 

디버그 중에 상단 옵션바에서

디버그->창->메모리->메모리 1을 선택하면 

 

 

대충 이런식으로 생긴놈이 나타난다.

왼쪽에 0x 으로 시작하는 놈들이 메모리 주소임.

 

 

C를 처음 배우거나

아니면 뭐 전산학기초 이런거 배우면 나오는 그림인데

지금 이걸 직접 보고있다고 생각하면 된다.

 

아무튼 이제 저 메모리 창에서

"주소 : " <- 이부분에다가 &a를 검색해보자.

 

 

그러면 저렇게 대려가준다.

0x0000004E500FF644 <- 이게 a 가 살고있는 집 주소인 것이다.

16진수 숫자 2개씩 줄줄줄 나열되어있는데

저게 각 메모리 주소의 값이다.

 

16진수 한자리가 4비트

2개씩 있으니까 8비트

8비트 = 1바이트

 

즉, 1바이트씩 나와있는거고

int 가 4바이트니까

02 00 00 00 -> 이만큼이 int a 라고 보면 된다.

 

00 00 00 02 가 아닌 이유는...

 

어....

 

 

설명하기엔 너무 귀찮고 길다.

그냥 구글에 "리틀 엔디안 빅 엔디안" 검색하고 읽어보고

지금 리틀 엔디안 시스템이라 그런거.

 

지금은 그런건 중요하지 않고

결국 변수는 어딘가에 저장되어 있고

그 저장되어있는 곳에 고유한 주소가 있음을 알 수 있다.

 

 

그러면 이번에는

&a를 저장한 int* p_a 를 까보자.

마찬가지로 검색해서 찾아가면 됨ㅇㅇ

 

 

위랑 같은사진 아니고 p_a를 검색한 결과다. (진짜)

a가 있는곳으로 친절하게 대려가주는 것을 볼 수 있다.

 

저기있는값을 꺼내서 쓸 수 있는데

이게 사실상 포인터의 존재 이유라고 생각한다.

이를 역참조라고 하는데 하필 이새끼도 * 연산자를 사용한다.

 

 

변수의 주소값은 실행시마다 변경된다.

뭔가 복잡한 이유가 막 있는데

대충 주소가 매번 같다면 한번 털리면 계속 털리기 딱 좋기 때문이다.

사실 저 주소도 실제 물리적인 주소가 아니다.

저건 사실 ......

 

 

 

 

 

 

역시 여기서 중요한게 아니니 넘어가자.

 

 

 

 

아무튼 포인터 선언시 *는 "자 이건 포인터야" 라는 뜻이고

사용시 * 는 "자 저기가서 사는사람 끄집어와~" 같은 의미라고 보면 된다.

 

 

그러면 포인터의 포인터도 있겠네용?

 

 

있다.

다만 저거 이상을 넘어갈일이 있다면

"내가 뭔가 잘못하고 있는건가?" 라는 생각을 한번 해보는것도 좋을 것 같다.

 

*은 수십번 수백번도 쓸수 있으므로 포인터의 포인터의 포인터의 포인터의......

대충 아무튼 그런것도 가능하긴 하나

천하제일 더러운 C 프로그래밍 대회 <- 이딴거 나갈게 아니면 굳이?

 

https://www.ioccc.org/index.html <- 나가고 싶으면 여기로

 

아무튼

이중 포인터까진 간간히 만나볼 수 있지만 진짜 삼중 넘어가면 쉽지않다.

 

 

그래서 이걸 어디에다 쓰냐면...

어... 다음시간에 알아보자