본문 바로가기
Etc./C

[C/C++] 포인터

by ahj 2021. 9. 19.

고등 학교 때도 간단히 devc++ 수업 들어보고, 학부 교양으로 들었던 컴퓨터 언어 및 실습에서 다루었던 C를 유튜브 무료 강의로 6시간 과정 올라와 있던 것을 보고 한번 독파해야겠다 생각하다가 다 듣고 기본 C에 대해서 알게되었다.

 

교양 수업 때 시간표 때문에 전전분반 애들이랑 들었는데 수업을 나쁘지 않게 들었다. 당시 기말에 바쁜 일정이 있어서 포인터부터 수업 내용을 놓쳐서 A를 받았는데 그렇기에 C에 대해서는 마음 한켠 아쉬움이 남아있었다.

 

이번에 C 문법을 한번 쭉 보았던 강의는 나도코딩님의 6시간 강의였다.

https://youtu.be/q6fPjQAzll8

이동 간에도 쉬운 내용은 2배속으로 빠르게 보고 파악하고 후반부 들어 드디어 포인터부터는 따라 적어보면서 컴퓨터로 실습을 해보았다.

 

포인터 : 미션맨 이라는 쉬운 개념으로 설명해주셨는데 학부때는 이해하지 못했던 개념을 게임처럼 또 예시로 설명이 들어가니까 이해가 훨씬 잘 되었다.

 

 

 

1. 포인터

 

우리가 C에서 어떤 변수(variable)를 선언할 때마다 그 변수가 메모리에 저장되는 주소가 있다. 보통 해시 함수를 통해 정해지는 key값? index? 랄까 

 

@@해시에 대해 궁금하다면@@

https://davinci-ai.tistory.com/19?category=905792 

 

파이썬으로 구현하는 자료구조 요약 정리 - 해쉬 테이블(Hash Table)

Writer: Harim Kang 해당 내용은 코딩 테스트 및 기술 면접을 대비하기 위해서 자료구조를 공부하며 정리한 내용입니다. 각각 자료구조의 종류와 특성, 장단점, 파이썬을 이용한 간단한 구현 코드까

davinci-ai.tistory.com

위 페이지의 글을 참고해서 공부해보면 좋을 것 같다.

블로그 운영자분께서 직접 그림을 그려서 첨부해놓으셨는데 그림과 함께 생각해보면 이해가 잘 될 것이다. 더불어 파이썬 딕셔너리까지 어떻게 쓰면 될지 포인터와 함께 이해하기에 좋다.

 

아무튼 우리가 보통

int a; 를 선언하고나서

scanf("%d", &a); 이렇게 적어주지 않는가

생각해보면 python 등에서는 a= input() 이런식으로 작성해줄 때 따로 &등을 붙이지 않는데, 포인터를 공부하면 이 '&'이 무엇인지 또 포인터가 무엇인지 이해할 수 있게된다.

 

포인터는 

int * b; 이런식으로 * (Asterisk, 애스터리스크)를 붙임으로써 변수를 선언할 수 있는데 이렇게 포인터 변수를 선언(여기서는 b)해주면 선언된 b가 위에 있는 a가 메모리에 저장된 주소에 접근할 수 있게 된다.

 

접근하고 싶으면

b = &a;

이렇게 선언해주면 되는데 여기서 &(참조 연산자)는 뒤에 따라온 변수가 저장된 주소를 반환해준다.

이렇게 되면 b라는 변수는 a의 주소가 된다. 그런데 여기서 b는 &a의 값을 그냥 한번 받아오고 끝난 것이 아니라 b 자체가 &a가 된 것을 기억하자

 

이런 상황일 때 위에서 scanf로 a에 5를 입력해 놓았다면

print("%d", *b);

로 *b를 출력해보면 이상하게 *b에 무엇인가 선언한 적이 없는데 5로 출력되는 것을 확인할 수 있다.

이는 포인터 변수 b에 *을 붙여서 *b로 표현하면 이는 b가 가지고 있는 주소(&a)에 저장되어 있는 값(a)를 출력해주는 것이기 때문이다.

다시 말해 *b=a인 것이다.

너무 재밌다ㅎㅎ

 

그래서 나도코딩님 강의에서는 포인터 변수 미션맨이 돌아다니면서 각 사람들 집 주소의 비밀번호를 바꾸는데 각 사람들은 호출되어서 자신들의 값을 바꾼적이 없기 때문에 놀란다고 표현한다. 재밌는 접근이다.

 

 

암튼 다시 정리하면

b == &a 이고 어디서든 b는 &a를 말하는 것이고 &a는 b를 말하는 것이다.

a의 주소(&a)에 저장된 값 a == *b와 같다. 그래서 만약 *b의 값을 수정한다면 a도 자동으로 바뀐다.

중요하고 재밌는 개념이다. 마치 컴퓨터 메모리 자체에 접근한 기분

이래서 c가 컴퓨터와 가장 가까운 개념이라고 하나보다 ㅎㅎ

 

구조체 정리는 다음에 다시 해야겠다.

 

'Etc. > C' 카테고리의 다른 글

[C] 포인터, 배열, 동적메모리할당  (0) 2021.10.09
[C] 문자열 공백/띄어쓰기 입력  (0) 2021.09.26
[C] 데이터 처리  (0) 2021.09.21
[C] 삼항연산자  (0) 2021.09.21

댓글