본문 바로가기
C언어

세이버의 C언어 강의 25강_ 포인터란 무엇인가

by 비원(Be one) 2019. 6. 18.
반응형

여러분 안녕하세요. 세이버입니다.

 

이번 강에서는 C언어의 꽃이라고 할 수 있는 포인터를 소개해드리고자 합니다.

많은 분들이 포인터를 어렵게 느끼시는데, 개념만 잡히면 그다지 어려운 게 아니라는 걸 알게 되실 겁니다.


1. 포인터란 무엇인가

포인터(Pointer)의 영어사전적 뜻은 '가리키다'입니다. 

 

즉, 포인터는 무엇인가를 가리키는 변수라는 의미입니다.

 

그럼 무엇을 가르키나요??

포인터는 다른 변수의 주소를 가리키는 변수입니다. 

가리킨다는 표현이 어색하면 변수의 주소를 저장하는 변수라고 이해해도 됩니다.

 

기존의 변수는 숫자나 문자와 같은 값들을 저장했었다면, 포인터는 메모리 공간을 저장합니다.

 

 

2. 포인터의 선언

포인터가 무엇인지 알았으니 이제 선언하는 방법을 알아보겠습니다.

포인터는 일반 변수와는 구분되어야 하기 때문에 조금 특별한 부호를 붙입니다.


포인터 선언법


포인터를 선언할 때는 일반 변수와 같이 자료형, 변수 이름이 필요합니다.

단, 포인터는 *를 붙여서 포인터임을 강조하고, NULL로 초기화를 해야 하는 것이 특징입니다.

 

여기서 NULL의 의미는 '값이 없다'입니다.

 

int* p1=NULL; 이렇게 하면 int형 메모리 주소를 저장하는 포인터,

double* p1=NULL; 이렇게 하면 double형 메모리 주소를 저장하는 포인터를 선언한다는 의미입니다.

 

3. 포인터 사용법

그럼 이제 포인터에 주소를 넣는 방법을 배워보겠습니다.

 

변수의 주소를 알기 위해서는 & 연산자를 사용합니다. &num은 num의 주소를 의미합니다.

따라서 포인터에 주소를 넣을 때는 다음과 같이 넣으면 됩니다.


포인터에 주소 넣기


이렇게 하면 포인터 p에 num의 주소가 저장됩니다.

 

num의 주소와 p에 대입된 값이 일치한 것을 확인할 수 있습니다.

 

4. 주소에 의한 변수 접근

그럼 포인터를 어디서 활용하나요?

포인터는 값에 접근하는 용도로 활용됩니다.

포인터의 주소를 보고 그 주소를 가진 변수를 찾은 후, 변수의 값을 처리할 때 사용됩니다.

 

예를 들어 여러분들이 회사에서 A 씨에게 무언가를 지시할 때, 여러분들은 어떻게 하실 건가요??

A 씨에게 직접적으로 찾아가 업무를 지시할 수 있지만, 다른 사람에게 A 씨의 자리에 처리할 업무를 가져다 줌을 부탁함으로써 간접적으로 지시할 수도 있습니다.

 

이처럼 직접적으로 값을 변경하는 것은 직접 접근, 주소를 이용해 간접적으로 접근하는 것을 간접 접근이라 합니다.

 

그럼 포인터로 어떻게 변수에 접근하는지 알려드리겠습니다.

변수의 값에 접근하기 위해서는 * 연산자를 사용합니다. *p는 p에 저장된 주소의 변수의 값을 의미합니다.


변수의 값에 접근하기

*p를 이용하면 num에 접근할 수 있습니다.


*p를 이용해 num에 접근하여 num의 값을 변경할 수 있습니다.

 

13행에서 num의 값을 직접적으로 20으로 바꿨습니다.

17행에서는 p를 이용해 num의 값을 간접적으로 30으로 바꿨습니다.

 

 

5. 잘못된 포인터 사용법

그럼 이제 사람들이 많이 실수하는 포인터 사용법을 알아보겠습니다.

 

1) 포인터에 주소를 저장하지 않고 사용하는 경우

이렇게 p에 아무 변수의 주소도 대입하지 않은 후, *p를 사용하면 에러가 발생합니다.

 

2) 포인터 변수에 임의의 주소를 저장한 경우

이 경우 역시 포인터가 어떤 주소인지를 명확히 알지 못하기에 에러가 발생하게 됩니다.


이번 강의는 여기까지입니다.

 

오늘도 수고하셨습니다.


정리

- 포인터 : 변수의 주소를 저장하는 변수

- 포인터 선언법 : int* p=NULL;와 같이, *와 NULL를 써준다.

- 포인터 사용법 : &연산자를 사용하여 변수의 주소를 대입

- 포인터 활용법 : *연산자로 그 주소의 변수의 값에 접근할 수 있다.

- 잘못된 사용법 : 포인터에 명확한 주소를 넣지 않은 경우


강의가 유익하셨거나 마음에 드셨으면 구독과 좋아요, 댓글 부탁드립니다.

궁금하신 점이나 질문은 댓글이나 메일 남겨주세요.

 

poci5003@gmail.com

 

 

 

 

 

반응형