본문 바로가기

Programming/C / C++

함수 포인터 색다르게 사용하기

#include <stdio.h>
#include <iostream> // new 쓸라고 인클루드함.. new가 편해서

struct a
{
	int k1;
	int k2;
	int k3;
	int k4;
	int k5;
};

// int형 변수를 받는 test1
void test1 (void* p)
{
	int i = *((int*)p);
	printf("%d\n", i*10);
}

// 구조체를 받는 test2
void test2 (void* p)
{
	a* pIn = (a*)p;
	printf("%d\n", pIn->k4);
}

// void를 리턴하고 인자로 void* 를 받는 것을 testr로 typedef 한다.
typedef void (*testr)(void* p);

void main(void)
{
	a i;
	i.k1 = 3;
	i.k2 = 2;
	i.k3 = 1;
	i.k4 = 5;

	// 변수처럼 할당도 된다. 전 new가 편해서 malloc을 안썼습니다.
	// malloc도 당연히 가능!
	testr *mtest = new testr[5];
	// 모두 null로 초기화
	memset( mtest, NULL, sizeof(mtest) );
	// 변수처럼 사용이 가능하다.
	mtest[0] = &test1;
	mtest[1] = &test2;
	mtest[2] = &test1;
	mtest[3] = &test2;
	mtest[4] = &test1;
	// 함수인데 변수처럼 if문도 가능
	if ( mtest[0] )
	{
		mtest[0](&(i.k4));
	}
	mtest[1](&(i.k1));
	mtest[2](&(i.k2));
	i.k4 = 7;
	// 배열의 첫번째는 배열의 시작주소이지만
	// 3번째는 3번째의 주소이므로 쓰레기값 뜸
	mtest[3](&(i.k3));
	mtest[4](&(i.k4));
	return;
}


'Programming > C / C++' 카테고리의 다른 글

DLL 만들기 불러와서 실행  (2) 2013.12.20