[C++] 함수 포인터 1
함수 포인터 1
인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다.
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!
포인터
int main() { int a = 10; // 바구니 주소 // pointer[ 주소 ] -> 주소 [ ] typedef int DATA; // 1) 포인터 * // 2) 변수 이름 pointer // 3) 데이터 타입 int DATA* pointer = &a; // 함수 typedef int(FUNC_TYPE)(int a, int b); using FUNC_TYPE = int(int a, int b); }
함수 포인터
함수 포인터는 함수를 가리키는 포인터다.
반환형(*포인터변수명)(매개변수형);
ex. int (*fp)(int, int);
일반적인 포인터 변수는 데이터의 메모리 주소를 저장하는 반면, 함수 포인터는 함수의 메모리 주소를 저장한다. 이를 통해 함수를 동적으로 호출하거나, 함수를 매개변수로 전달할 수 있다.
#include <iostream> using namespace std; int Add(int a, int b) { return a + b; } int Sub(int a, int b) { return a - b; } int main() { // 함수 typedef int(FUNC_TYPE)(int a, int b); // 방법1 using FUNC_TYPE = int(int a, int b); // 방법2(Modern C++방식). 위와 동일한 의미 // 1) 포인터 * // 2) 변수 이름 fn // 3) 데이터 타입 함수 (인자는 int, int 반환은 int) FUNC_TYPE* fn; // 함수 포인터 fn = Add; // fn = Sub; 으로 바꾸면 함수가 바뀌기 때문에 상황에 따라 매우 편리하게 사용할 수 있다. // 함수의 이름은 함수의 시작 주소 (배열과 유사) int result = fn(1, 2); // 기본 문법 cout << result << endl; int result2 = (*fn)(1, 2); // 함수 포인터는 *(접근 연산자) 붙어도 함수 주소! cout << result2 << endl; return 0; }
함수의 이름은 함수의 시작 주소다!!


어셈블리 코드를 확인해보면 두 개 방식이 같다는 것을 알 수 있다.
함수 포인터 예시 - Item
#include <iostream> using namespace std; class Item{ public: Item() : _itemId(0), _rarity(0), _ownerId(0) { } public: int _itemId; // 아이템을 구분하기 위한 ID int _rarity; // 희귀도 int _ownerId; // 소지자 ID }; typedef bool(ITEM_SELECTOR)(Item* , int); Item* FindItem(Item items[], int itemCount, ITEM_SELECTOR* selector /* bool (*selector)(Item* item) */ /* 동작 */, int value) { for (int i = 0; i < itemCount; i++) { Item* item = &item[i]; if (selector(item, value)) return item; } return nullptr; } bool IsRareItem(Item* item, int value) { return item->_rarity >= value; } bool IsOwnerItem(Item* item, int ownerId) { return item->_ownerId == ownerId; } int main() { Item items[10] = {}; items[3]._rarity = 2; // RARE Item* rareItem = FindItem(items, 10, IsRareItem, 2); Item* ownerItem = FindItem(items, 10, IsOwnerItem, 100); return 0; }
전체 코드
더보기
#include <iostream> using namespace std; int Add(int a, int b) { return a + b; } int Sub(int a, int b) { return a - b; } class Item{ public: Item() : _itemId(0), _rarity(0), _ownerId(0) { } public: int _itemId; // 아이템을 구분하기 위한 ID int _rarity; // 희귀도 int _ownerId; // 소지자 ID }; //Item* FindItem(Item items[], int itemCount, int itemId) //{ // for (int i = 0; i < itemCount; i++) // { // Item* item = &item[i]; // if (item->_itemId == itemId) // return item; // } // // return nullptr; //} typedef bool(ITEM_SELECTOR)(Item* , int); Item* FindItem(Item items[], int itemCount, ITEM_SELECTOR* selector /* bool (*selector)(Item* item) */ /* 동작 */, int value) { for (int i = 0; i < itemCount; i++) { Item* item = &item[i]; if (selector(item, value)) return item; } return nullptr; } bool IsRareItem(Item* item, int value) { return item->_rarity >= value; } bool IsOwnerItem(Item* item, int ownerId) { return item->_ownerId == ownerId; } int main() { int a = 10; // 바구니 주소 // pointer[ 주소 ] -> 주소 [ ] typedef int DATA; // 1) 포인터 * // 2) 변수 이름 pointer // 3) 데이터 타입 int DATA* pointer = &a; // 함수 typedef int(FUNC_TYPE)(int a, int b); using FUNC_TYPE = int(int a, int b); // 1) 포인터 * // 2) 변수 이름 fn // 3) 데이터 타입 함수 (인자는 int, int 반환은 int) FUNC_TYPE* fn; // 함수 포인터 fn = Add; // fn = Sub; 으로 바꾸면 함수가 바뀌기 때문에 상황에 따라 매우 편리하게 사용할 수 있다. // 함수의 이름은 함수의 시작 주소 (배열과 유사) int result = fn(1, 2); // 기본 문법 cout << result << endl; int result2 = (*fn)(1, 2); // 함수 포인터는 *(접근 연산자) 붙어도 함수 주소! cout << result2 << endl; Item items[10] = {}; items[3]._rarity = 2; // RARE Item* rareItem = FindItem(items, 10, IsRareItem, 2); return 0; }
'⭐ Programming > C++' 카테고리의 다른 글
[C++] 함수 객체 (0) | 2022.04.16 |
---|---|
[C++] 함수 포인터 2 (0) | 2022.04.16 |
[C++] 전방선언 (0) | 2022.04.12 |
[C++] 캐스팅: static, dynamic, const, reinterpret cast (0) | 2022.04.10 |
[C++] 얕은 복사 vs 깊은 복사 2 (0) | 2022.04.10 |
댓글
이 글 공유하기
다른 글
-
[C++] 함수 객체
[C++] 함수 객체
2022.04.16 -
[C++] 함수 포인터 2
[C++] 함수 포인터 2
2022.04.16 -
[C++] 전방선언
[C++] 전방선언
2022.04.12 -
[C++] 캐스팅: static, dynamic, const, reinterpret cast
[C++] 캐스팅: static, dynamic, const, reinterpret cast
2022.04.10
댓글을 사용할 수 없습니다.