F.R.I.D.A.Y.

포인터(pointer) part4. 함수 포인터 배열 본문

DEV/C C++

포인터(pointer) part4. 함수 포인터 배열

F.R.I.D.A.Y. 2020. 1. 30. 23:10
반응형

 함수 포인터 또한 자료형입니다. 모든 자료형은 배열로 만들 수 있다고 했는데요, 이번에는 함수 포인터 배열을 만들어봅니다.

 

# 배열, 함수 포인터를 먼저 알고 있어야 합니다.


선언 방법

 먼저 배열의 선언 방법을 되돌아봅니다.

type arrayName[length];

// ex)
int arr[10];

 함수 포인터의 선언 방법은 다음과 같습니다.

returnType (*var)(parameters);

// ex)
int (*user_abs)(int);
  • returnType: 함수 포인터로 가리킬 함수의 반환형
  • parameters: 함수 포인터로 가리킬 함수의 인자

 만일 printf를 가리킬 수 있는 함수 포인터 배열을 선언하고자 한다면 아래와 같이 작성하면 됩니다.

int (*fp)(const char *, ...);

// 아래는 printf 함수 원형
int printf(const char *format, ...);

 즉, 함수 원형과 일치하도록 만들어주어야 함수 포인터가 그 함수를 가리킬 수 있습니다.

 

 이 두 가지 방법을 섞으면 함수 포인터 배열을 만들 수 있습니다. 함수 포인터 '배열'입니다. 따라서 변수는 자료형이 배열이며 각 요소의 자료형은 함수 포인터입니다.

int (*fp[10])(int);

 

 이렇게 선언을 하였다면 배열을 초기화하듯이 이용할 수 있습니다.

int (*fp[10])(int) = {func1, func2, func3};

fp[3] = func4;

 원래 값을 대입할 때는 함수 이름 앞에 주소 연산자 작성이 정석이지만, 주소 연산자를 사용하지 않아도 됩니다.

 사용 방법

 함수 포인터는 배열과 함수 사용 방법을 엮어서 사용하면 됩니다.

int (*fp[10])(const char *, ...) = {printf,};

(*fp[0])("Hello world!\n");

 배열 연산자[# 대괄호 연산자]를 통해 인덱스를 지정하고 포인터 사용하듯 간접 참조 연산자를 걸어줍니다. 그리고 함수 호출 연산자인 소괄호를 작성, 그 안에 인수를 넣어주게 되면 함수 포인터로 printf를 호출해 사용할 수 있게 됩니다.

 

 그런데 계속 간접 참조 연산자를 사용하기에는 불편합니다. 함수 포인터 파트에서 말한 것처럼 간접 참조 연산자는 작성하지 않아도 이용할 수 있습니다.

fp[0]("Hello world!\n");

어디에 사용할까

 함수 포인터는 배우는 중이라면 많이 사용하지 않습니다. 그러나 실제 상용 프로그램에서는 주기적인 업데이트와 관리를 위해 사용하는 기능입니다. 또한 동시에 코드의 능률을 높이는 방법으로도 사용합니다.

 함수 포인터를 이용하는 것은 다음 포스트를 참고하세요.

 

함수 포인터를 배워야 하는 이유 : 코드 간결화

많은 사람들이 C언어를 배우기 시작하다가 중간에 막히는 부분이 있습니다. 대표적으로 포인터가 있는데요, 이번에 배울 것 또한 포인터입니다. 이번에 배울 포인터는 기존의 포인터와는 약간 다른, 함수 포인터입..

pang2h.tistory.com

# index

728x90
반응형

'DEV > C C++' 카테고리의 다른 글

XOR: 배타적 논리합  (0) 2020.02.28
부동소수점  (2) 2020.02.22
포인터(pointer) part3. 함수 포인터  (0) 2020.01.30
구조체(struct) part2. 비트 필드  (0) 2020.01.29
공용체(union) part1. default  (0) 2020.01.28
Comments