C++기초
221324(3)_함수(3)_함수 포인터
hyrule
2022. 4. 5. 15:29
#include <iostream>
//함수 포인터 확인을 위한 함수들 선언
void Test()
{
int Number = 100;
std::cout << "Test : " << Number << std::endl;
++Number;
}
void TestStatic()
{
static int Number1 = 100;
std::cout << "TestStatic : " << Number1 << std::endl;
++Number1;
}
int Add(int Number1, int Number2 = 20)
{
return Number1 + Number2;
}
float Add(float Number1, float Number2)
{
return Number1 + Number2;
}
/*함수포인터 : 함수도 메모리주소가 존재한다.
왜냐하면 바이너리코드가 코드영역에 올라가게 되면 코드를 구성하고 있는
각 함수들도 메모리에 저장이 되기 떄문에 주소를 가질 수 있게 되는것이다.
실제 우리가 함수를 호출을 한다는 의미는 해당 메모리 주소로 이동하여 코드를 동작시키라는 의미가 된다.
그렇다면 함수의 주소를 알 수 있어야 하는데, 함수의 이름이 곧 해당함수의 메모리 주소가 된다.
*/
int main()
{
//함수의 주소를 보는 법: 함수의 이름이 곧 메모리 주소가 됨(배열과 비슷)
std::cout << Test << std::endl;
std::cout << TestStatic << std::endl;
/*
함수의 포인터 타입은 반화타입, 인자에 영향을 받는다.
Test나 TestStatic은 void 반환타입에 인자가 없다
반환타입(*포인터명)(인자타입); 의 형태로 함수 포인터 변수를 선언할 수 있다.
*/
void(*Func)() = Test;
Func();
Func = TestStatic;
Func();
//출력값이 달라지는것을 알 수 있다.
int(*Func1)(int, int) = Add;
float(*Func2)(float, float) = Add;
//float(*Func2)(float, float) = Add;
std::cout << Func1(10, 20) << std::endl;
std::cout << Func2(3.14f, 33.22f) << std::endl;
//오버로딩까지 정상적으로 작동함을 확인할 수 있다.
return 0;
}