일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Win32
- 백준
- Kotlin
- c++
- 포인터
- 리뷰
- VS ERROR
- CS
- Programming
- 티스토리
- 문법
- Desktop
- Direct2D
- 프로그래밍
- 이지스퍼블리싱
- 함수
- 배열
- doit코틀린프로그래밍
- c
- Javascript
- c#
- Tips프로그래밍강좌
- Windows
- 김성엽
- 연산자
- 지식나눔강좌
- tipssoft
- Visual Studio
- Tips강좌
- 알고리즘
- Yesterday
- Today
- Total
F.R.I.D.A.Y.
포인터(pointer) part4. 함수 포인터 배열 본문
함수 포인터 또한 자료형입니다. 모든 자료형은 배열로 만들 수 있다고 했는데요, 이번에는 함수 포인터 배열을 만들어봅니다.
선언 방법
먼저 배열의 선언 방법을 되돌아봅니다.
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");
어디에 사용할까
함수 포인터는 배우는 중이라면 많이 사용하지 않습니다. 그러나 실제 상용 프로그램에서는 주기적인 업데이트와 관리를 위해 사용하는 기능입니다. 또한 동시에 코드의 능률을 높이는 방법으로도 사용합니다.
함수 포인터를 이용하는 것은 다음 포스트를 참고하세요.
# index
'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 |