프로그래밍/C

[C] 기초문법 포인터 핵심 정리 (1) 포인터 변수 선언하기

정정훈훈 2022. 1. 23. 13:41
반응형

포인터, 메모리, 주소, 몇 번지, 접근, 참조, ... 다 필요 없다.

 

비전공자 또는 프로그래밍을 막 배우기 시작한 입문자들에겐 어려운 말들이 너무 많다.

그래서 필자는 C의 포인터를 간략하게 알기 쉽게끔 정리하려고 한다.

필자도 C를 공부한지 얼마 되지 않은 입문자 전공 대학생으로 오개념이 있을 수 있으니 주의하길 바란다.


 

포인터(변수) : 메모리의 주소 값을 저장하기 위한 변수이다.

 

이 정의를 보면 와닿지가 않는다.

 

메모리 공간에는 왜 접근해야 하고

주소 값을 왜 저장하는지도 모르겠고

왜 갑자기 포인터라는 단어가 튀어나오는 건지도 이해가 되지 않는다.

 

 

 

여러 전문가들은 집 주소를 예로 들면서 설명한다.

(집 주소와 연계한 설명은 다른 사이트나 개념서에서도 확인할 수 있으니 생략하겠다.)

내 머릿속은 '그래. 그건 이해했어. 그런데 코딩은 어떻게 해야하는 거야?' 라는 생각으로 가득찼다.

그림은 그려지는데 막상 코드를 보면 이해가 전혀 되질 않았던 것이다.

 

 

 

우리가 그들의 설명을 이해하지 못한 이유는 내 생각엔 이렇다.

 

1) 결과물이 안 보여

반복문, 조건문, 함수 등을 공부할 때 우리는 주어진 문제 상황을 해결하는 코드를 작성해서 바로바로 결과물을 얻어낼 수 있었다. 하지만, 보이지 않는 메모리의 주소를 읽어낸다는 건, 우리한테는 와닿지 않는다.

 

2) 포인터 말고 이해 못한 부분 앞에서 있었을 걸?

int, double, char, long 등의 자료형의 크기 등을 공부한 적이 있을 것이다.

하지만 우리는 그냥 char이 1바이트, int가 4바이트라는 것 정도만 외우고 넘어갔다.

왜냐하면, 우리는 메모리 공간을 1바이트, 4바이트 차지한다는 게 무슨 말인지 몰랐으니까.

 

 

포인터도 마찬가지로 다소 우리에겐 추상적으로 다가오는 메모리의 개념을 조금 많이 깊게 다뤄야 한다.

그런데 많이 문제를 풀어보지 않는 이상 포인터를 이해하긴 어려울 것이다.

하지만 모순적이게도 우리는 문제를 풀 만큼 포인터를 이해하지 못했고, 코드를 짤 능력도 없다.

 

 

 


그렇다면 최후의 방법, 외우자!

공식처럼, C가 약속한 '포인터 사용법'을 어느정도 외우고

외워 놓은 다음에 집 주소를 떠올리며 여러 번 되새김질을 해보자.

 

지금부터 나름대로 필자가 설명해보겠다.


 

바로 코드로 분석하며 설명해볼 건데,

코드는 다음과 같다.

 

int num = 3;

int *pnum;

pnum = #

 

 

 

int num = 3;

int *pnum;

pnum = #

 

 

여기서 *의 의미는 다음과 같다.

 

"내가 pnum이라는 변수를 선언할 건데,

그냥 변수가 아니라 '포인터 변수'라고 할 거야."

라는 표시를 해준 것이다.

다시 말해, [포인터 변수의 선언 방식]인 것!

 

 

 

포인터 변수라고 정하고 싶은 pnum 앞에 *을 입력하지 않으면,

int num = 3;

// num이라는 int형 변수(포인터 변수가 아니라 그냥 변수)를 선언하고 3으로 초기화

int pnum;

// pnum이라는 int형 변수(포인터 변수가 아니라 그냥 변수)를 선언하고 초기화하지 않음

 

이렇게 되어버린다.

 

 

pnum의 'p'는 사용자가 변수 이름을 구분하기 위해 입력해놓은 것이다.

p를 쓴다고 포인터가 아니라!!

 

 

만약 num과 pnum을 바꿔서 코드를 작성하면

 

int pnum = 3;

int *num;

 

pnum이라는 그냥 변수

num이라는 포인터 변수를 선언한 것이다.

 

즉, p는 아무런 의미가 없고,

*로 포인터 변수라고 선언한다.

 

 


다시 코드로 돌아오자.

 

int num = 3;

int *pnum;

pnum = #

 

여기서 첫번째 줄과 두번째 줄[빨간색 줄]까지의 코드에서

변수 num포인터 변수 pnum과의 관계는 정의되지 않았다.

 

그냥 변수 두 개가 선언된 것일 뿐!

그 두 변수가 성격이 다를 뿐이다.

 

그런데, 세 번째 줄의 코드로 인해서

변수 num과 포인터 변수 pnum의 관계성이 발생한다.

 

 

 

int num = 3;

int *pnum;

pnum = #

 

여기서 &의 의미는 num 변수에 저장한 3이 아닌, num의 주소값을 반환하겠다는 의미이다.

 

num은 int형 그냥 변수

pnum은 int형 포인터 변수였는데,

포인터 변수 pnum에 변수 num의 주소값을 저장하겠다, 라는 세번째 줄에 의해

변수 num과 포인터 변수 pnum의 관계성이 생기는 것이다.

 

 

 

 


정리하자면-

 

 

int num = 3;

// 변수 num을 선언하고 3으로 초기화할게

int *pnum;

// 변수 pnum을 선언할 건데, 포인터 변수로 할래. 포인터 변수라는 걸 *로 표시해둘게.

pnum = # 

// 이제 *가 없어도 pnum은 포인터 변수야. 포인터 변수 pnum에 변수 num의 주소를 저장할게. &로 표시해둘게.

 

 

여기서 포인터 변수의 정의로 다시 돌아와보자.

포인터 변수 : 메모리의 주소 값을 저장하기 위한 변수이다.

 

 

이제 이해가 되었는가?

 

위 코드를,

int num = 3;

int *pnum = #

 

으로 줄여서 사용할 수도 있다.

 

우리가 첫번째 줄을

변수 num을 선언하고 3으로 초기화하겠다

라고 해석하듯이

 

두번째 줄을

포인터 변수 pnum을 선언하고 num의 주소값으로 초기화하겠다

라고 해석하면 된다!!!!

 

 

 

 

https://like-a-happy-cat.tistory.com/ 

 

키보드 꾹꾹이하는 대학생

 

like-a-happy-cat.tistory.com

 

 

https://blog.naver.com/snake6862

 

정훈 블로그 : 네이버 블로그

 

 

반응형