함수포인터Function Pointers

함수도 포인터다. 

즉, 함수도 메모리 주소를 가지고 있다.
함수를 실행하면 함수의 메모리주소를 찾아 실행한다.

int (*포인터명)(파라미터) = 함수명; 형식으로 생성할 수 있다.

함수포인터를 파라미터로 넣을 수 있다.

반복되는 로직이 있으면 포인터를 통해 다 분리해서 사용하는게 가능하다.


함수파라미터도 기본값이 설정가능하다.
함수는 이름 자체가 포인터라 &를 안넣어도 된다.

함수가 파라미터로 자주사용되면 계속쓰기 귀찮으면 typedef로 선언해서 사용할 수 있다.
#include <functional>을 사용해 더 간단히 사용할 수 있다.

 

#include <iostream>
#include <array>
#include <functional>

using namespace std;

int func() {
	return 5;
}

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

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

void printNumbersFunP(const array<int, 10>& myArr, bool (*check_fcn)(const int&)) {
	for (int a : myArr)
	{
		if (check_fcn(a)==true) {
			cout << a << " ";
		}
	}
	cout << endl;
}

void printNumbersFun(const array<int, 10>& myArr, function<bool(const int&)> funct) {
	for (int a : myArr)
	{
		if (funct(a) == true) {
			cout << a << " ";
		}
	}
	cout << endl;
}

int main()
{
	//함수의 주소가 출력된다.
	cout << func << endl;
	
	//함수포인터 설정하기
	int (*funcPtr)() = func;

	//func()함수와 메모리 주소도 같고 같이 사용한다.
	cout << funcPtr << " " << funcPtr() << " " << &funcPtr << endl;

	//함수포인터 사용하기전 홀수 짝수 출력 함수
	std::array<int, 10> myArr{ 1,2,3,4,5,6,7,8,9,10 };
	printNumbers(myArr, true);
	printNumbers(myArr, false);

	//함수포인터 파라미터로 사용하기(함수명)
	printNumbersFunP(myArr, isEven);
	printNumbersFunP(myArr, isOdd);

	std::function<bool(const int&)> funct = isEven;
	//fuction사용해서 함수포인터 파라미터로 이용하기(포인터명)
	printNumbersFun(myArr, funct);
	funct = isOdd;
	printNumbersFun(myArr, funct);

	return 0;
}

함수 포인터

- C언어에서는 함수의 이름을 이용해 특정한 함수를 호출한다.

- 함수 이름은 메모리 주소를 반환한다.

- 함수 포인터는 특정한 함수의 반환 자료형을 지정하는 방식으로 선언할 수 있다.

- 함수 포인터를 이용하면 형태가 같은 서로 다른기능의 함수를 선택적으로 사용할 수 있다.

- 사용법 : 반환 자료형(*이름) (매개변수) = 함수명;


실습내용

함수 이름은 메모리 주소를 반환

형태가 같은 서로 다른기능의 함수를 선택적으로 사용


실습결과


매개변수 및 반환 자료형이 있는 함수포인터

실습내용


실습결과


함수포인터를 반환하여 사용하기

실습내용


실습결과




구조체

- 여러 개의 변수를 묶어 하나의 객체를 표현하고자 할 때 구조체를 사용한다.

+ 배열과는 다름(배열은 동일한 특성을 가진 변수를 나열한것)

- 캐릭터,몬스터,학생,좌표 등 다양한 객체를 모두 프로그래밍 언어를 이용해 표현할 수 있다.


실습내용


구조체의 정의와 선언

- 하나의 구조체 변수만 사용하는 경우 정의와 동시에 선언을 할 수도 있다.

- 이 경우에는 전역변수로 사용된다.


실습내용

실습결과(위 2개의 실습내용 동일)



구조체 정의하기

- typedef 키워드를 이용한다.

- 익명구조체로도 사용가능하다.

- 구조체가 포인터 변수로 사용되는 경우 내부 변수에 접근할 때 화살표(->)를 사용한다.


실습내용


실습결과


+ Recent posts