포인터 보고서

포인터의 개념

위키백과에선 포인터를

프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수

위와 같이 설명합니다.

‘값을 저장하는게 아닌, 값의 주소를 저장한다’ 라는 느낌입니다.

포인터 변수 선언 방법

포인터 변수 선언은 일반 변수 선언과 같이
(데이터형) (변수명);
위와 같이 선언하는데, 일반 변수 선언과 다른점은 변수명 앞에 *을 붙입니다.

int ex;
일반 변수가 위와 같이 선언한다면, 포인터 변수는

int *ex;
위와 같이 선언한다.

포인터의 초기화

포인터 변수는 주소를 저장합니다. 값을 일반 변수와 같이 그냥 대입할 순 없습니다.

int *ex = 1;

일반 변수 였다면 정수형 변수 ex에 1이라는 값이 들어갔겠지만,
포인터 변수에 저렇게 넣으면 원하는 동작을 하지 않을겁니다.

그럼 어떻게 해야 포인터가 값을 가진 주소를 가리키게 할 수 있을까요?

간단합니다. 일반 변수를 만들고, 그 변수의 주소를 포인터 변수에 대입해 주면 됩니다. 아래의 코드가 그 예시입니다.

#include <stdio.h>
int main() {
int *pex, ex;

printf("입력 : ");
scanf("%d", &ex);

pex = &ex; // &를 변수 앞에 붙이면 그 변수의 주소값을 나타냄

printf("일반 변수의 값 : %d\n", ex);
printf("일반 변수의 주소 : %p\n", &ex);
printf("포인터 변수의 값 (가리키는 주소) : %p\n", pex);
printf("포인터 변수가 가리키는 값 : %d\n", *pex);

return 0;
}

포인터가 필요한 이유

  1. 함수로부터 하나 이상의 값을 리턴하기 위함
  2. 배열을 인자로 편리하게 전달하기 위함
  3. 복잡한 자료 구조를 효율적으로 처리하기 위함
  4. 한 함수에서 다른 함수의 변수 값을 변경하기 위함
  5. 메모리 공간을 효율적으로 사용하기 위함

위와 같은 이유들로 포인터를 사용합니다.

하지만 포인터를 사용하게 되면 코드를 이해하는게 힘들어지고, 그로 인해 디버깅이 힘들어질 수 있습니다.
포인터는 C의 알파이자 오메가이며, 많은 사람들이 C를 포기하게 만드는 이유 중 하나입니다.

예시

#include <stdio.h>
int main() {
int a, b, *pab;

printf("a : ");
scanf("%d", &a);
printf("b : ");
scanf("%d", &b);

pab = &a; // 포인터 변수 pab에 a의 주소 저장
printf("(a address) %p | (pab address) %p\n", &a, &pab);
printf("*pab = %d\n\n", *pab); // pab가 가리키는 주소의 값 출력

pab = &b; // pab에 b의 주소 저장
printf("(b address) %p | (pab address) %p\n", &b, &pab);
printf("*pab = %d\n", *pab); //pab가 가리키는 주소의 값 출력

return 0;
}
Total views

댓글

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×