C언어의 포인터는 프로그래밍 세계에서 매우 중요한 역할을 합니다. 포인터를 제대로 이해하는 것이 고급 프로그래밍에 필수적입니다. 이 문서에서는 포인터의 기본 개념부터 다양한 활용법까지 정리하겠습니다.
포인터란 무엇인가
포인터의 정의
포인터는 메모리 주소를 저장하는 변수입니다. 변수의 메모리 주소를 가리킬 수 있으며, 간접적으로 변수 값을 조작할 수 있습니다.
int a = 10;
int *p = &a;
printf("a의 값: %d", *p); // 출력: a의 값: 10
포인터의 유형
포인터는 저장하는 데이터 타입에 따라 여러 유형이 있습니다. 예를 들어, int
포인터, float
포인터, char
포인터 등이 있습니다.
포인터의 선언 및 초기화
포인터 변수 선언
포인터 변수를 선언하려면 데이터 타입 뒤에 '*'을 사용합니다. 예를 들어, int
유형의 포인터는 int *p;
형식으로 선언합니다.
포인터의 초기화
포인터를 초기화하려면 변수의 주소를 할당합니다. 주소를 얻기 위해서는 '&' 연산자를 사용합니다.
int a = 5;
int *p = &a;
포인터와 배열
배열과 포인터의 관계
배열의 이름은 배열의 첫 번째 요소의 주소를 가리키는 포인터입니다. 따라서 배열 이름을 포인터로 사용할 수 있습니다.
int arr[3] = {1, 2, 3};
int *p = arr;
printf("첫 번째 값: %d", *p); // 출력: 첫 번째 값: 1
포인터와 배열의 접근
포인터를 사용하여 배열 요소에 접근할 수 있습니다.
int arr[3] = {4, 5, 6};
int *p = arr;
for (int i = 0; i < 3; i++) {
printf("값: %d", *(p + i));
}
포인터와 함수
함수의 인수로서 포인터
포인터를 함수의 인수로 사용할 수 있습니다. 포인터를 사용하면 변수 값을 직접 수정할 수 있습니다.
void updateValue(int *p) {
*p = 20;
}
int main() {
int a = 10;
updateValue(&a);
printf("업데이트된 값: %d", a); // 출력: 업데이트된 값: 20
return 0;
}
함수 포인터
함수 포인터는 함수의 주소를 가리킵니다. 이를 통해 함수도 변수처럼 전달할 수 있습니다.
#include <stdio.h>
void hello() {
printf("Hello, World!\n");
}
int main() {
void (*funcPtr)() = hello;
funcPtr(); // 출력: Hello, World!
return 0;
}
포인터 연산
포인터와 산술 연산
포인터는 덧셈과 뺄셈 같은 산술 연산을 수행할 수 있습니다. 포인터에 숫자를 더하거나 빼면, 해당 타입의 크기만큼 이동합니다.
int arr[3] = {7, 8, 9};
int *p = arr;
p += 2;
printf("세 번째 값: %d", *p); // 출력: 세 번째 값: 9
포인터 비교
포인터는 비교 연산을 사용할 수 있습니다. 같은 타입의 포인터 간에 크기를 비교할 수 있습니다.
int a = 10;
int b = 20;
int *p1 = &a;
int *p2 = &b;
if (p1 < p2) {
printf("p1이 p2보다 작은 주소를 가리킵니다.\n");
} else {
printf("p2가 p1보다 같거나 작은 주소를 가리킵니다.\n");
}
다중 포인터
이중 포인터
이중 포인터는 다른 포인터를 가리키는 포인터입니다. 보통 다차원 배열이나 동적 메모리 할당에 사용합니다.
int a = 10;
int *p1 = &a;
int **p2 = &p1;
printf("a의 값: %d", **p2); // 출력: a의 값: 10
다중 포인터의 활용
다중 포인터는 복잡한 데이터 구조를 처리할 때 유용합니다. 동적 메모리 할당이나 다차원 배열을 관리할 때 자주 사용됩니다.
int **arr;
arr = (int**)malloc(3 * sizeof(int*));
for (int i = 0; i < 3; i++) {
arr[i] = (int*)malloc(3 * sizeof(int));
}
// 메모리 해제
for (int i = 0; i < 3; i++) {
free(arr[i]);
}
free(arr);