본문 바로가기
언어

[C/CPP] 포인터 개념

by 송파감자 2023. 3. 17.

국비지원으로 에티버스러닝에서 VR언리얼 과정을 듣고 있는데, 주 2회씩은 CPP 언어 수업을 듣고 있다. 저번주 포인터 수업을 듣고, 오늘(7번째 수업) 역참조에 대해 리뷰했다. 매번 내 발목을 잡았던 포인터에 대해 간단히 정리해보고자 한다!
 
 

 먼저 알고 갈 내용!

  • 포인터는 변수인데,
  • 포인터는 주소를 담는 변수다

 
int money = 10000;         // int타입의 money의 값은 10000, 주소값은 100번지
int* moneyP = &money;  // int 타입의 주소(100)를 저장하는 포인터 moneyP
*moneyP = 15000;          // 역참조
cout << money << endl; 
 

오른쪽 콘솔에 15000 보이쥬? 원본값을 바꿔버림!


여기서 그럼 질문,

1번이 맞는가, 2번이 맞는가 골라주세요!
 
1번

 
2번

 
 
 
정답은 1번!

 
2번 오답을 골랐다면 아마 나와 같은 혼란을 겪었을 것 같다.
별*만 붙으면 너무 헷갈렸는데, 포인터인 moneyP가 money의 주소(&money)를 담는 변수라고 생각해야 한다.

  • int moneyP라면? 인트타입을 저장하는 변수
  • int* moneyP라면? 인트타입의 주소를 저장하는 변수
  • *은 주소를 저장하기 위해 찍는다고 생각하면 된다.

 


그럼 대체 왜 포인터를 쓰는가?

난 지금 예제 문제를 푸는 중인데 포인터가 넘 필요하다고 느낀다. 
그 문제는 아래와 같다.. (아직 푸는 중)
 
// 연습 14. 초밥집에서 주문 (스택 연습, 함수 단위로 구현, 구조체/힙 활용)
// 1. 초밥 리스트 보기 (Ex. 1. 연어 2천원 2. 계란 1천원 3. 소고기 3천원 4.새우 1천원)
// 2. 먹을 초밥 번호 선택하고 먹기(돈 지불, 돈 부족 시 주문 불가) ->먹으면 접시가 아래서부터 쌓인다
// 3. 접시를 위에서부터 꺼내서 버리기 (가장 최근에 먹은 접시 사라짐)
// 4. 현재까지 남아있는 접시 보여주기(버린 접시 제외)
// 5. 알바하기(알바 리스트 선택해서 알바에 해당하는 만큼 돈 벌기)
// 6. 현재 보유한 돈 보기
 
위 문제를 보면 일단 난 초밥 사먹으면서 money를 계속 쓰거나 알바하면서 벌거나 해서 잔액을 계속 업데이트 해 줘야한다. 그래서 난 int* moneyP를 만들어서 역참조로 원본값을 바꿔주는 중이다.
 
나와 같은 사람이라면.. 그럼 또 함수에 포인터를 매개변수로 넣을 때 헷갈릴 것이다.
하하! 부끄럽지만 내가 쓴 예시는 이렇다.

위에서 설명했던 그 머니....내 머니..
Cook함수의 호출부. moneyP가 money의 주소를 갖고 있어서 이렇게 써줬당
역참조로 money값을 바꿔주려고 했다

 

그래서 정리해보자면,  포인터를 쓰는 이유는 메모리에 접근해서 원본값을  바꿀 수 있어서다.

(해당 주소로 접근해서 같은 스택(함수) 내부에 있는 변수 혹은 전역 변수가 아닐 때도 그 값을 바꾸려고!)

나의 경우는 다른 함수에서 포인터 역참조를 사용해서 원본값을 바로 바꿔주고 싶어서였다. 

 

화이팅..
추가 수정해야 할 내용이 보인다면 코멘트 남겨주세요 :)

'언어' 카테고리의 다른 글

[C++] rand()  (0) 2023.09.13
[C++] cmath 라이브러리  (0) 2023.09.13
[C++] find() / npos  (0) 2023.09.07
[c++] 헷갈리던 vector, 다시 공부  (0) 2023.08.30
[C++] 2차원 배열을 X좌표 Y좌표로 생각하기!  (1) 2023.03.24