C언어 포인터의 기초
요약
C언어 포인터의 기본 개념, 주소 연산자(&)와 역참조 연산자(*)를 알아봅니다. 정보처리기사 실기에 자주 출제되는 포인터 문제를 풀기 위한 핵심 개념을 정리합니다.
포인터 핵심 정리
| 개념 | 설명 | 예시 |
|---|---|---|
| 포인터 | 메모리 주소를 저장하는 변수 | int *p; |
| 주소 연산자 (&) | 변수의 주소를 반환 | &num |
| 역참조 연산자 (*) | 포인터가 가리키는 값에 접근 | *p |
포인터란?
포인터(Pointer) 는 다른 변수의 메모리 주소를 저장하는 변수입니다.
모든 변수는 메모리에 저장되고, 각 메모리 공간은 고유한 주소를 가집니다. 포인터는 이 주소를 저장해서 해당 변수를 간접적으로 접근할 수 있게 해줍니다.

주소 연산자 (&)
주소 연산자 & 는 변수의 메모리 주소를 반환합니다.
&num은 "num의 주소"를 의미합니다. 이렇게 변수에서 주소를 가져오는 것을 참조(Reference) 라고 합니다.
참조와 역참조
| 용어 | 의미 | 방향 | 연산자 |
|---|---|---|---|
| 참조 | 변수의 주소를 가져옴 | 변수 → 주소 | & |
| 역참조 | 주소로 값에 접근 | 주소 → 값 | * |
역(逆)참조의 "역"은 반대라는 뜻입니다.
- 참조: 변수 → 주소 (변수에서 주소로)
- 역참조: 주소 → 값 (주소에서 값으로, 반대 방향)
역참조 연산자 (*)
역참조 연산자 * 는 포인터가 가리키는 주소에 저장된 값에 접근합니다.
| 표현 | 의미 | 결과 |
|---|---|---|
p | 포인터 변수 (주소 저장) | 0x1000 |
*p | p가 가리키는 값 | 10 |
&num | num의 주소 | 0x1000 |
포인터 타입 이해하기
포인터 변수의 타입은 "무엇을 가리키는가"에 따라 결정됩니다.
int * - 정수 하나를 가리키는 포인터
int (*)[3] - 배열을 가리키는 포인터
배열 포인터 는 배열 전체를 가리키는 포인터입니다. 괄호로 *와 변수명을 묶어서 선언합니다.
왜 괄호가 필요한가?
연산자 우선순위 때문입니다. []가 *보다 우선순위가 높습니다.
2차원 배열에서의 타입
| 표현 | 타입 | +1 하면 |
|---|---|---|
arr | int (*)[3] | 다음 행으로 이동 (12바이트) |
arr[0] | int * | 다음 요소로 이동 (4바이트) |
arr[0][0] | int | - |
arr은 "크기 3인 배열"이 2개 모인 2차원 배열입니다. 따라서 arr은 첫 번째 행(크기 3인 배열)을 가리키고, 타입은 int (*)[3]이 됩니다.
포인터 활용
포인터는 구조체와 함께 자주 사용됩니다. 구조체 포인터에서는 화살표 연산자(->)로 멤버에 접근합니다. 또한 동적 메모리 할당에서 malloc()의 반환값을 저장하는 데 사용됩니다.
포인터의 주소를 저장하는 이중 포인터도 시험에 자주 출제됩니다. 포인터를 요소로 가지는 포인터 배열은 2차원 배열과 함께 자주 출제됩니다. 포인터를 증가시키면서 문자열을 복사하는 함수나 두 개의 포인터를 활용해 문자열을 뒤집는 알고리즘도 자주 출제되는 유형입니다.