[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