포인터(pointer)는 다른 변수의 메모리 주소를 저장하는 특수한 변수입니다. C 언어에서 포인터는 메모리를 직접 다룰 수 있게 해주는 강력한 도구로, 배열·문자열 처리나 함수 간 데이터 전달 등에 폭넓게 활용됩니다.
포인터의 선언, 초기화 및 접근
먼저 다음 문장을 살펴보겠습니다.
int qty = 179;

포인터 선언하기
int *p;
'p'는 다른 정수형(int) 변수의 주소를 저장하는 포인터 변수입니다.
포인터 초기화하기
포인터 변수는 주소 연산자(&)를 사용해 초기화합니다. 주소 연산자는 해당 변수가 메모리에 위치한 주소값을 반환합니다.
int qty = 175; int *p; p = &qty;

포인터를 이용한 산술 연산
포인터 변수도 일반 변수처럼 수식에 사용할 수 있습니다. 포인터 변수가 올바르게 선언되고 초기화되었다면 아래 문장들은 모두 유효합니다.
a) *p1 + *p2
b) *p1 - *p2
c) *p1 * *p2
d) *p1 / *p2 ※ '/'와 '*' 사이에는 반드시 공백이 있어야 합니다.
그렇지 않으면 주석(comment)의 시작으로 해석됩니다.
e) p1 + 4
f) p2 - 2
g) p1 - p2 ※ p1과 p2가 같은 배열을 가리킬 때,
두 포인터 사이의 요소 개수를 반환합니다.
h) p1++
i) --p2
j) sum += *p2
k) p1 > p2
l) p1 == p2
m) p1 != p2 ※ 비교 연산은 배열과 문자열 처리 시
의미 있게 활용됩니다.
반면, 다음 문장들은 유효하지 않습니다.
a) p1 + p2 b) p1 * p2 c) p1 / p2 d) p1 / 3
포인터끼리의 덧셈, 곱셈, 나눗셈은 허용되지 않습니다. 역참조된 값(*p1, *p2)끼리의 연산은 가능하지만, 주소값 자체를 대상으로 한 산술 연산은 의미가 없거나 위험할 수 있기 때문입니다. 단, 같은 배열 안에서의 포인터 뺄셈(p1 - p2)은 두 요소 사이의 거리를 구하는 용도로만 예외적으로 허용됩니다.
예제 프로그램
#include<stdio.h>
main (){
int a,b,x,y,z;
int *p1, *p2;
a =12;
b = 4;
p1= &a;
p2 = &b;
x = *p1 * * p2 – 6;
y= 4 - *p2 / *p1+10;
printf (“Address of a = %d”, p1);
printf (“Address of b = %d”, p2);
printf (“a= %d b =%d”, a,b);
printf (“x= %d y =%d”, x,y);
}
실행 결과
Address of a = 1234 Address of b = 5678 a = 12 b= 4 x = 42 y= 14
코드 설명
p1은 변수 a의 주소를, p2는 변수 b의 주소를 저장합니다. 따라서 *p1은 a의 값(12), *p2는 b의 값(4)이 됩니다.
- x = *p1 * *p2 - 6 → 12 × 4 − 6 = 42
- y = 4 - *p2 / *p1 + 10 → 4 − (4 ÷ 12) + 10 = 4 − 0 + 10 = 14 (정수 나눗셈이므로 소수점 이하 버림)
출력된 주소 값(1234, 5678)은 예시일 뿐이며, 실제 값은 실행 환경과 시스템에 따라 달라집니다.
