본문 바로가기
공부/C언어

[C언어] C언어 포인터 완전 정복: 함수 포인터와 다양한 포인터 활용법

by 강갱갱 2025. 6. 14.

 

 

포인터 완전 정복: 함수 포인터와 다양한 포인터 활용법

포인터는 C언어에서 가장 강력하면서도 복잡한 개념 중 하나입니다. 이번 글에서는 포인터 중에서도 함수 포인터, 포인터 배열, 그리고 특수한 포인터 선언법에 대해 정리하고, 함께 알아두면 좋은 팁과 주의사항을 소개하겠습니다.

1. 포인터 선언과 기본 개념

포인터는 기본적으로 메모리 주소를 저장하는 변수입니다. 포인터 선언 시 int* p하나의 자료형으로 생각할 수 있습니다. 그리고 p = &a;a가 가리키는 주소를 p에 저장한다는 뜻입니다.

즉, 포인터 변수는 ‘가리키는 대상의 주소’를 저장하는 변수이며, 선언된 자료형에 따라 가리키는 데이터의 크기와 의미가 결정됩니다.

2. 포인터 배열

포인터 배열은 포인터를 요소로 하는 배열입니다. 예를 들어:

int* ap[10];

이 선언은 apint* 형 포인터 10개를 요소로 가진 배열이라는 의미입니다.

3. 함수 포인터란?

함수 포인터는 함수를 가리키는 포인터입니다. 함수 이름은 함수의 주소로 평가되므로, 이를 변수에 저장해 함수 호출을 간접적으로 할 수 있습니다.

기본적인 함수 포인터 선언과 활용 예시는 다음과 같습니다:

int add(int x, int y) {
    return x + y;
}

int (*pf)(int, int); // 함수 포인터 선언: int형 두 개 매개변수, int 반환
pf = add;            // 함수 add의 주소를 pf에 대입
int result = pf(10, 20); // 함수 호출: add(10, 20)과 동일

4. 함수 포인터 배열

여러 개의 함수 주소를 배열로 관리할 수 있습니다. 선언은 다음과 같습니다:

int (*pf[5])(int, int); // 5개 함수 포인터 배열 선언

// 예제: 여러 함수 포인터를 초기화
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) { return a / b; }

int (*pf[4])(int, int) = { add, sub, mul, div };

주의할 점은 (*pf [5])처럼 괄호를 꼭 넣어야 한다는 것입니다. 괄호가 없으면 배열이 함수 포인터를 가리키는 것으로 해석되지 않을 수 있습니다.

5. const, volatile, void 포인터

  • const char *p;p가 가리키는 내용이 변경 불가. 즉, 포인터는 바뀔 수 있으나 가리키는 데이터는 읽기 전용.
  • char *const p;포인터 p 자체는 변경 불가, 가리키는 데이터는 변경 가능.
  • volatile char *p;p가 가리키는 데이터는 언제든 바뀔 수 있으니 매번 메모리에서 다시 읽어야 한다는 의미로 주로 하드웨어 레지스터 접근 시 사용.
  • void *p;자료형 미정 포인터, 어떤 타입이든 저장 가능하지만 사용하려면 적절히 형변환 해야 한다.

6. 포인터의 장점과 활용

포인터를 잘 활용하면 연결 리스트, 이진트리, 해시 테이블 같은 복잡한 자료구조 구현이 가능합니다. 또한 하드웨어 메모리 매핑, 동적 메모리 할당에도 필수적입니다.

7. 포인터 사용 시 주의사항과 깨달은 점

  • 포인터 선언 후 반드시 어떤 것을 가리키도록 초기화하세요. 초기화 안 된 포인터는 NULL이나 안전한 주소로 지정하는 습관이 필요합니다.
  • 포인터는 매우 예민한 친구입니다. 잘못 다루면 프로그램이 망가질 수 있으니 조심 또 조심해야 합니다.
  • 주소를 출력할 때는 %p 포맷을 사용하세요. 잘못하면 이상한 값이 나오거나 오류가 납니다.
  • 함수 포인터 배열을 선언할 때 괄호 ( )를 빼먹지 말고 꼭 넣으세요.

마무리

이번 글을 통해 포인터와 함수 포인터의 핵심 개념과 사용법을 정리했습니다. 포인터는 어렵지만 한번 익히면 C언어의 진정한 힘을 느낄 수 있는 중요한 도구입니다. 꾸준히 연습하시면서 이해를 넓혀보시길 추천드립니다.

반응형