포인터(Pointer)는 다른 변수의 메모리 주소를 저장하는 변수입니다. 포인터를 사용하면 null 값을 다룰 수 있으며, 참조에 의한 전달(pass by reference) 방식으로 데이터에 접근할 수 있습니다. 또한 포인터 변수를 선언할 때 반드시 초기화할 필요는 없습니다.
포인터의 기본 문법
포인터의 기본적인 선언 및 대입 문법은 다음과 같습니다.
pointer_variable = &another_variable;
예를 들어, 변수 a의 주소를 포인터 p에 저장하려면 아래와 같이 작성합니다.
p = &a;
여기서 &(주소 연산자)는 변수가 메모리에 저장된 주소값을 반환하며, 포인터 앞에 붙는 *(간접 참조 연산자)는 해당 주소에 저장된 실제 값에 접근할 때 사용됩니다.
알고리즘
포인터를 활용하여 세 개의 숫자 중 가장 큰 수를 찾는 알고리즘은 다음과 같습니다.
Step 1: 시작
Step 2: 정수형 변수 선언
Step 3: 포인터 변수 선언
Step 4: 콘솔로부터 3개의 숫자 입력받기
Step 5: 각 숫자의 주소를 포인터 변수에 대입
Step 6: 만약 *p1 > *p2라면
- *p1 > *p3이면 → p1이 가장 큰 값 출력
- 그렇지 않으면 → p3이 가장 큰 값 출력
Step 7: 그렇지 않고 *p2 > *p3이면 → p2가 가장 큰 값 출력
- 둘 다 아니면 → p3이 가장 큰 값 출력
Step 8: 종료
C 프로그램 코드
다음은 포인터를 이용해 세 개의 숫자 중 가장 큰 수를 찾는 전체 C 프로그램입니다.
#include <stdio.h>
int main(){
int num1, num2, num3;
int *p1, *p2, *p3;
printf("enter 1st no: ");
scanf("%d",&num1);
printf("enter 2nd no: ");
scanf("%d",&num2);
printf("enter 3rd no: ");
scanf("%d",&num3);
p1 = &num1;
p2 = &num2;
p3 = &num3;
if(*p1 > *p2){
if(*p1 > *p3){
printf("%d is largest ", *p1);
}else{
printf("%d is largest ", *p3);
}
}else{
if(*p2 > *p3){
printf("%d is largest ", *p2);
}else{
printf("%d is largest ", *p3);
}
}
return 0;
}
코드 설명
num1, num2, num3: 사용자에게 입력받은 세 개의 정수를 저장하는 일반 변수입니다.p1, p2, p3: 각각 세 변수의 메모리 주소를 저장하는 포인터 변수입니다.*p1, *p2, *p3: 포인터를 역참조(dereference)하여 실제 저장된 값에 접근합니다.- 중첩된
if-else조건문을 통해 세 값 중 최댓값을 비교하고 출력합니다.
실행 결과
위 프로그램을 실행하면 다음과 같은 결과를 확인할 수 있습니다.
Run 1: enter 1st no: 35 enter 2nd no: 75 enter 3rd no: 12 75 is largest Run 2: enter 1st no: 53 enter 2nd no: 69 enter 3rd no: 11 69 is largest
마무리
이 예제는 포인터의 핵심 개념인 주소 저장과 역참조를 활용한 기초적인 프로그래밍 연습입니다. 포인터를 직접 사용하지 않아도 같은 결과를 낼 수 있지만, 포인터를 통해 변수의 주소에 접근하고 값을 읽어오는 과정을 익히면 함수에서 참조에 의한 전달, 동적 메모리 할당, 배열 처리 등 더 고급 C 언어 기능을 학습하는 데 큰 도움이 됩니다.