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;
}