rueki

함수 포인터 본문

C,C++ 기초 및 자료구조

함수 포인터

륵기 2020. 7. 26. 21:26
728x90
반응형

이번 시간에는 함수포인터에 대해서 알아보는 시간이다.

포인터의 개념이 처음 듣게 될 때는 아마 변수의 포인터 선언에 대한 내용에서 나왔을 것이다.

여기서는 변수 대신에 함수라고 생각을 하면 될 것 같다.

#include <iostream>
using namespace std;

int func()
{
	return 5;
}


int main()
{
	cout << func << endl;
	return 0;
}

위의 예제는 5를 반환받는 func()라는 함수를 생성했다.

메인에서 생성하면 5가 나올까? 답은 '아니다' 이다. 메인 부분을 실행하면 func()에대한 주소값이 출력이 된다.

 

#include <iostream>
using namespace std;

int func()
{
	return 5;
}

int goo()
{
	return 10;
}



// 함수도 주소만 가지고 무언가를 할 수가 있다.
// 함수포인터 선언
int main()
{	
	// func의 주소값을 받아와서 *fcnptr로 전달
	int(*fcnptr)() = func;
	cout << fcnptr() << endl; // 5
	fcnptr = goo; // goo 함수의 주소를 넣음
	cout << fcnptr() << endl; // 10
	return 0;
}

위의 코드에서 메인부분에 포인터 변수를 선언했다. 대입값은 함수의 주소값을 넣었다.

그 변수를 실행하면, 대입한 함수의 실행 값이 출력되게 되고,

그 변수에 새로운 함수의 주소를 넣고 실행하면 마지막에 넣은 함수의 값이 나오는 것을 알 수가 있었다.

 

void printNumbers(const array<int, 10>& my_arr, bool print_even)
{
	for (auto element : my_arr)
	{
		if (print_even && element % 2 == 0) { cout << element; }
		if (!print_even && element % 2 == 1) cout << element;
	}
	cout << endl;

}

int main()
{	
	array<int, 10> my_arr = { 0,1,2,3,4,5,6,7,8,9 };
	
	printNumbers(my_arr,true);

	return 0;
}

여기서는 이제 홀수와 짝수를 출력하는 예제인데, 출력함수에 boolean형을 사용해서 코드를 구현해보았다. 그러나 

밑의 코드처럼 boolean함수를 선언하고  넣으면 더 간결한 것도 있지만, printNumbers의 boolean형 변수 파라메터에 무엇이 들어갔는지 보자. 함수포인터를 넣은 것을 볼 수가 있다. 그리고 그 안에 이제 함수의 주소를 전달하게 된다면,

그 대입한 함수의 기능이 실행이 되는 것을 알 수가 있다.

bool isEven(const int& number)
{
	if (number % 2 == 0) return true;
}

bool isOdd(const int& number)
{
	if (number % 2 != 0) return true;
}

void printNumbers(const array<int, 10>& my_arr, bool (*check_fcn)(const int&))
{
	for (auto element : my_arr)
	{
		if (check_fcn(element)) { cout << element; }
		
	}
	cout << endl;

}


int main()
{	
	array<int, 10> my_arr = { 0,1,2,3,4,5,6,7,8,9 };
	
	printNumbers(my_arr, isEven);

	return 0;
}
728x90
반응형

'C,C++ 기초 및 자료구조' 카테고리의 다른 글

생성자와 소멸자  (0) 2020.10.06
C++ 입출력  (0) 2020.09.16
매개변수의 기본값  (0) 2020.07.21
함수 오버로딩(Function Overloading)  (0) 2020.07.18
다양한 타입의 return  (0) 2020.07.15
Comments