국비지원으로 에티버스러닝에서 VR언리얼 과정을 듣고 있는데, 주 2회씩은 CPP 언어 수업을 듣고 있다. 저번주 포인터 수업을 듣고, 오늘(7번째 수업) 역참조에 대해 리뷰했다. 매번 내 발목을 잡았던 포인터에 대해 간단히 정리해보고자 한다!
먼저 알고 갈 내용!
- 포인터는 변수인데,
- 포인터는 주소를 담는 변수다
int money = 10000; // int타입의 money의 값은 10000, 주소값은 100번지
int* moneyP = &money; // int 타입의 주소(100)를 저장하는 포인터 moneyP
*moneyP = 15000; // 역참조
cout << money << endl;
여기서 그럼 질문,
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를 만들어서 역참조로 원본값을 바꿔주는 중이다.
나와 같은 사람이라면.. 그럼 또 함수에 포인터를 매개변수로 넣을 때 헷갈릴 것이다.
하하! 부끄럽지만 내가 쓴 예시는 이렇다.
그래서 정리해보자면, 포인터를 쓰는 이유는 메모리에 접근해서 원본값을 바꿀 수 있어서다.
(해당 주소로 접근해서 같은 스택(함수) 내부에 있는 변수 혹은 전역 변수가 아닐 때도 그 값을 바꾸려고!)
나의 경우는 다른 함수에서 포인터 역참조를 사용해서 원본값을 바로 바꿔주고 싶어서였다.
화이팅..
추가 수정해야 할 내용이 보인다면 코멘트 남겨주세요 :)
'언어' 카테고리의 다른 글
[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 |