포인터(pointer)는 무엇인가를 가리키고 있는 것이라는 뜻인데 C 언어에서 포인터는 ‘메모리 주소(memory address)’를 지칭한다. 변수를 선언하면 메모리 공간 어디엔가 그 변수값을 저장하기 위한 기억 공간이 할당되는데 포인터는 그 메모리 공간의 주소값을 가진다. 즉 변수값이 존재하는 물리적인 위치 정보인 것이다.
포인터를 설명하기 앞서서 메모리에 대한 개념적인 설명을 먼저 할 필요가 있다. PC와 같은 디지털 시스템은 메모리(memory)소자가 있어서 여기에 자료를 저장한다. 자료 저장 단위가 8bit 라면 ‘8bit 메모리’, 16bit 라면 “16bit메모리”라고 한다. 8비트 메모리는 매 바이트에 고유의 주소가 정해져 있어서 그 주소를 이용하여 데이터에 접근한다.
[그림 6.1.1[ 8비트 메모리 구조
만약 어떤 변수를 선언하면 내부적으로 변수 값을 저장할 연속된 메모리 공간이 할당되는데 전술한 바와 같이 메모리 공간에는 고유의 주소값이 있다. 그 주소를 포인터라고 한다.
int a = 11; | |
변수명 | a |
주소 | 0x12345678 |
메모리 | 0 |
0 | |
0 | |
11 |
[그림 6.1.2] 포인터 개념도
즉, 변수를 선언하면 메모리, 주소, 그리고 자료를 참조할 이름(변수명) 이 세가지가 생성이 된다.
포인터를 사용하는 경우는 여러 가지가 있으나 보통은 다음 두 가지 이유 때문이다.
어떤 함수 내부에서 다른 함수의 변수값을 직접 변경시켜야 될 경우에 사용될 수 있다. 변수값이 아니라 주소값을 인자로 넘겨서 그 주소에 저장된 데이터를 직접 변경시키는 것이다.
복잡한 구조를 가지는 배열이나 구조체를 함수의 인자로 넘겨줄 경우 보통의 값에 의한 호출(즉, 복사한 후 복사본을 넘겨주는)방식이 사용될 경우 데이터형을 전달하기도 힘들뿐더러 메모리 낭비 및 비효율성으로 인한 속도 저하를 가져올 수 있다. 이럴 경우 포인터를 넘겨주는 방법을 사용한다.
포인터의 다양한 쓰임새 때문에 C 언어에는 관련된 많은 기능을 제공하고 있지만 편리한 만큼 위험부담도 있다. 경우에 따라서 매우 잡기 힘든 버그를 생산하기도 하고 심지어 프로그램이 멈춰서 복구 불능이 되는 경우도 포인터 때문에 발생하기도 한다. 따라서 사용자는 사용법을 정확히 알고 주의해서 사용해야 한다.
'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글
6.5 문자열과 포인터 (0) | 2016.04.15 |
---|---|
6.4 배열과 포인터 (0) | 2016.04.15 |
5장 연습문제 (0) | 2016.04.11 |
C언어의 문자열 (0) | 2016.04.11 |
조건문 예제 2 (0) | 2016.04.04 |