C & C++

[C언어] 포인터

우준세 2021. 5. 8. 23:33
728x90
반응형

 

 

 

C언어 포스팅은 '혼자 공부하는 C언어' 책을 보고 공부하고 정리한 것입니다.

내용의 잘못된 부분이나 질문이 있으면 댓글로 남겨주세요! 


1. 포인터의 기본 개념

결론부터 얘기하면 포인터는 변수의 메모리 주소를 저장하는 변수입니다.

 

C언어는 데이터를 사용할 때 메모리에 접근해서 원하는 방식으로 활용하는 언어입니다.

포인터가 C언어에서 중요한 부분이지만, 공부하시는 많은 분들이 포인터에서 

책을 덮는 경우가 많습니다. 그렇기에 포인터의 기본개념을 정확하게 이해하고 확인해야 합니다.

 

포인터를 배우기 전은 변수를 선언하여 메모리 공간을 확보하고

그 메모리에 데이터를 넣고 썼습니다. 변수명은 메모리 공간을 구분하게 해주는 이름이었습니다. 

변수는 선언되어 있는 블록 혹은 함수 내부로 사용이 제한됐습니다. 

그렇기 때문에 포인터를 사용하여 사용 범위가 벗어나고 사용할 수 있게 했습니다. 

 

주소 연산자 : &

앞으로 포인터를 사용하기 위해서는 변수처럼 이름이 아닌 주소를 사용하고 이해해야 합니다.

여기서 주소는 변수가 할당된 메모리 공간의 시작 주소를 얘기합니다! 

 

int a;

printf("int형의 변수 주소 : %u ", &a);

 

이렇게 코드를 작성했을 때 출력은 a의 주소를 10진수로 출력해 줍니다.

이것은 a의 시작 주소이며 int형으로 생성되었기 때문에 4바이트의 크기를 갖습니다.

예를 들어 a의 시작 주소가 50이면 a는 50~53의 까지의 4바이트가 할당된 것입니다.

 

포인터와 간접 참조 연산자 :  * 

포인터는 주소를 저장하는 변수입니다. 변수처럼 선언하고 사용해야 하지만 선언할 때 *를 붙여줘야 합니다.

int a;
int *pa;

pa = &a;    // 포인터에 a의 주소 대입
*pa = 5     // 포인터로 변수 a에 5 대입

 

포인터의 자료형은 변수의 자료형을 적습니다. 

이렇게 포인터 pa가 변수 a의 주소를 대입하는 것을 '가리킨다'라고 하며 pa -> a로 표현합니다.

pa는 포인터이며 a의 주소를 저장하고 있다!라고 해석합니다.

 

포인터가 가리키는 변수를 간접 참조 연산자(*)를 사용하여 사용할 수 있습니다. 

간접 참조 연산자는 포인터 연산자라고도 합니다.

 

즉, pa는 변수의 저장 공간이며 *pa는 변수의 값으로 사용됩니다. 

 


2. 포인터의 이해

정리하면 포인터는 주소를 저장하는 메모리 공간입니다. 

포인터를 이해하기 위해서는 주소와 포인터의 차이를 알아야 합니다.

 

주소와 포인터의 차이

주소 : 변수의 할당된 메모리 저장 공간의 시작 주소 값

포인터 : 그 값을 저장하는 또 다른 메모리 공간 

 

어떤 변수의 주소 값은 바뀌지 않지만 포인터는 다른 주소를 사용해 값을 바꿀 수 있다는 의미입니다!

 

int a, b;
int *p;

p = &a;
p = &b;

a의 주소를 50, b의 주소를 100이라고 했을 때 a와 b의 주소는 프로그램이 종료될 때까지 변하지 않지만

포인터 p의 주소는 50에서 100으로 바뀝니다!

 

이 처럼 포인터를 사용하는 이유는 함수 간에 효과적으로 데이터를 공유하기 위해서입니다.

포인터는 처음 보면 이해하기 어렵지만 두세 번 보면 한방에 머리를 딱! 치는 것처럼 

이해가 될 것이라 생각합니다.

 

어려워도 같이 공부하고 포기하지 말아요!

 

포인터를 간략하게 정리해보았고

틀린 부분이나 질문이 있으면 댓글로 남겨주세요!

 

다음 포스팅으로 찾아오겠습니다! 

 

 

 

 

728x90
반응형