포인터를 제대로 활용하면 이중 포인터, 배열 포인터, 함수 포인터 등 메모리를 아주 유연하게 제어하는 심화 기법을 사용할 수 있습니다.
1. 이중 포인터 (Pointer to Pointer)
이중 포인터(**)는 **"포인터 변수의 주소"**를 저장하는 변수입니다.
#include <stdio.h>
int main(void) {
int num = 100;
int *p = # // 1차 포인터
int **pp = &p; // 2차 이중 포인터
printf("num = %d\n", num); // 100
printf("*p = %d\n", *p); // 100
printf("**pp = %d\n", **pp); // 100
return 0;
}
2. 포인터 배열 vs 배열 포인터
- 포인터 배열 (
int *arr[3]): 포인터 3개를 묶은 배열 (포인터들의 모음). - 배열 포인터 (
int (*arr)[3]): 3개짜리 배열 전체를 가리키는 단일 포인터.
3. 함수 포인터 (Function Pointer)
함수도 실행 코드가 메모리에 탑재되므로 주소가 존재합니다. 함수의 주소를 저장하여 함수를 변수처럼 호출하거나 매개변수로 전달할 수 있습니다.
#include <stdio.h>
int add(int a, int b) { return a + b; }
int main(void) {
// 반환타입 (*함수포인터이름)(매개변수타입)
int (*func_ptr)(int, int) = add;
int result = func_ptr(10, 20); // 함수 포인터로 add 호출
printf("결과: %d\n", result); // 30
return 0;
}
4. 자주 묻는 질문 (Q&A)
Q. 이중 포인터는 실무에서 주로 언제 쓰이나요? A. 함수 내부에서 외부의 포인터 변수 값(가리키는 주소 자체)을 직접 변경하고 싶을 때(예: 동적 메모리 재할당 함수, 연결 리스트 Head 노드 변경) 사용합니다.