이전 정리글 ↓

 

[자료구조] 4. 배열의 응용 : 다항식

이전 정리글 ↓ [자료구조] 3. C언어 배열과 구조체글을 쓰기에 앞서, C언어를 기반으로 서술함을 알립니다. 이전 정리글 ↓ [자료구조] 2. 자료구조 기본 개념[자료구조] 1. 자료구조 쉽게 이해하

w8err.tistory.com

 

이번 정리글에선 자료구조에서 필수적으로 알아야 하는, C언어의 포인터에 대해 제대로 알아보려 한다.

 


포인터

포인터의 사전적 정의는 이렇다.

변수의 메모리 공간(주소)를 가리키는 변수를 일컫는다.

 말 그대로, 다른 변수의 주소를 가리키는 변수다. 

모든 변수는 주소를 가지고 있다. 컴퓨터의 메모리는 Byte로 구성되어 있으며, 각 바이트마다 순차적으로 주소가 매겨진다. 

웃기지만, 이해가 굉장히 쉽다.

int n1 = 300; 
int *p;		// int 자료형을 가리키는 p 포인터 변수
*p = &n1;	// p 포인터변수에 n1의 주소를 넣음

int의 변수 n1이 선언되었다. 

포인터 변수 p는 int형을 가리키는 포인터로 선언되었다.

p가 n1을 가리키게 하려면 a의 주소를 p에 대입한다(*p = &n1). 

 

포인터는 이런 식으로 사용된다. 

 


포인터 관련 연산자

* 연산자 - 간접참조 연산자(or 역참조 연산자)
& 연산자 - 주소 연산자

 

먼저, * 연산자는 포인터가 가리키는 곳에 값을 저장하는 연산자다. 

p가 가리키는 장소에 정수 3을 넣어보자. (p는 int형이라 가정)

*p = 3;

이런 식으로 계산된다.

100번지 집(주소)에 찾아가서, 3이라는 변수를 집어넣는다고 생각하면 된다.

 

여러 가지 자료형의 포인터

포인터는 여러 가지 자료형을 가질 수 있다.

char *p1;		// p1은 char형 변수를 가리킴
double *p2; 		// p2는 double형 변수를 가리킴
int *p3; 		// p3은 int형 변수를 가리킴
float *p4;		// p4는 float형 변수를 가리킴

 


널(NULL) 포인터 

왜 있는거지...?

널 포인터는 아무것도 가리키지 않는 포인터다. 일반적으로 NULL이라는 매크로로 표시한다.

포인터를 사용하기 전엔, 이 포인터가 NULL인지를 검사해야 한다.

if(p == NULL) {
fprintf(stderr, "오류! 포인터가 아무 것도 가리키지 않는 상태입니다.");
exit(1);
}

이렇게 오류를 체크하는 느낌으로 사용된다. 

 

포인터가 실제로 아무 것도 가리키지 않을 때, 널 포인터로 두면 좋다. 

널 포인터를 가지고 간접참조하려면 시스템에서 오류가 나 쉽게 알 수 있기 때문이다.

 


함수의 매개변수로 포인터 사용

포인터는 함수의 매개변수로 전달될 수 있다. 

swap.c 를 한번 구현해보자.

#include <stdio.h>

void swap(int *px, int *py)
{
	int tmp;
	tmp = *px;
	*px = *py;
	*py = tmp;
}

int main(void)
{
	int a = 1, b = 2;
	printf("swap 호출 전 : a = %d, b = %d\n", a, b);
	swap(&a, &b);    // *px는 주소 a를 가리키고, *py는 주소 b를 가리키게 된다.
	printf("swap 호출 후 : a = %d, b = %d", a, b);
	return 0;
}

 

결과 : 

swap 호출 전 : a = 1, b = 2
swap 호출 후 : a = 2, b = 1

 


배열 + 포인터

함수로 배열이 전달되면, 함수 안에서 배열의 내용을 변경할 수 있다.

배열의 이름이 배열의 시작위치를 가리키는 포인터이기 때문.

다음 장에는 배열 포인터 관련된 과제를 알아보자.

728x90
반응형