본문 바로가기
  • 시간(時間)을 아끼는 방법은 시간을 낭비하지 않는것


C_ language/C언어 심화_모각코

C언어_심화_함수 포인터

by pk7912 2022. 6. 9.
728x90

커뮤니티_모각코 (모여서, 각자, 코딩) 활동을 하면서 배운 내용을 되새기며 쓴 글입니다.
코딩을 배우고 싶다면 코뮤니티 활동을 적극 추천합니다.

https://cafe.naver.com/codeuniv 

 

코딩 커뮤니티 - 코뮤니티 [파이썬/... : 네이버 카페

코뮤니티 [코딩공부/독학/스터디/대외활동] : python, C언어, java, 자바스크립트, HTML, CSS, 웹/앱개발

cafe.naver.com

 


함수 포인터란? 

함수를 가리키는 포인터를 함수 포인터라 합니다.

함수를 선언하게 되면 변수와 같이 메모리에 공간이 할당되고,

주소를 가지게 되며 그주소를 활용할 수 있습니다.

#pragma warning (disable : 4996)
#include <stdio.h>
#include <stdlib.h>

void Hello();

int main()
{
	printf("Hello 함수의 주소값 : %p\n", Hello);

	system("pause");
	return 0;
}

void Hello()
{
	printf("Hello World\n");

}

 


함수 포인터를 사용하는 이유

1. CallBack 매커니즘 구현할 때 - 함수를 다른 함수의 인자로 넘겨주기 위해 사용합니다.( == 다른 함수를 불러와 사용)

 

2. 동적으로 늘거나 줄어드는 UI에 이벤트 핸들러를 붙이거나 뗄 때, 효율적으로 관리하기 위해 사용합니다.

 

3. 라이브러리에서 함수의 기능이 어떻게 바뀔지 예상할수 없을 때, 여러 개의 함수를 배열로 관리하려고 할 때 사용합니다.

 

3. 코드를 간결하게 만들수 있어서  가독성이 좋아 사용합니다.

 

 


 

반환 값과 매개변수가 없는 함수

함수 포인터 선언 방법 (반환 값, 매개변수 없는 함수)

void (*포인터 함수명)();

함수 포인터 선언과 실행 예제

#pragma warning (disable : 4996)
#include <stdio.h>
#include <stdlib.h>

void Hello();
void World();

int main()
{
	void (*fptr)();	// 함수 포인터 선언

	fptr = Hello;	// Hello 함수를 fptr에 저장 (Hello()가 아닌 Hello를 써야함)
	fptr();			// 함수 호출

	fptr = World;	// World 함수로 바꿈
	fptr();			// 함수 호출


	system("pause");		// 설정에서 콘솔창유지로 설정했는데 바로꺼질경우 "pause" 실행
	return 0;
}

void Hello()
{
	printf("Hello\n");
}

void World()
{
	printf("World\n");
}

 

 

 


 

반환 값과 매개변수가 있는 함수

# 반환형과 매개변수의 타입이 일치해야 한다.#

 

함수 포인터 선언 방법 (반환 값, 매개변수 있는 함수)

반환 자료형 (*함수 포인터명)(매개변수자료형1, 매개변수자료형2,...);
// *함수 포인터명의 자료형은 - 반환자료형(*)(매개변수자료형)

int (*fptr)(int, int)
// *fptr의 자료형은 - int(*fptr)(int, int)

함수 포인터 선언과 실행 예제

#pragma warning (disable : 4996)
#include <stdio.h>
#include <stdlib.h>

int sum(int a, int b);
int sub(int a, int b);

int main()
{
	int (*fptr)(int, int);	// 함수 포인터 선언

	fptr = sum;		// fptr에 sum함수 저장
	fptr(1, 2);		// 매개변수값주고 함수 호출 

	fptr = sub;		// fptr에 sub함수 저장
	fptr(2, 1);		// 매개변수값주고 함수 호출 


	system("pause");		// 설정에서 콘솔창유지로 설정했는데 바로꺼질경우 "pause" 실행
	return 0;
}

int sum(int a, int b)
{
	printf("%d\n", a + b);
	return 0;
}

int sub(int a, int b)
{
	printf("%d\n", a - b);
	return 0;
}

 

 


 

 

 

 

 

 

마무리

포인터를 사용하는 이유에 대해선 잘 알겠는데 어렵다... 

확실히 포인터를 처음 공부할땐 진도 따라가느라 이해 못 하고 넘겼는데... 

다시 복습하길 잘한것 같다.

완전히 이해한건 아니지만 처음 공부할 때보다 더 알게 된 것 같다!

 

 

 

 

 

 

 

 

 

댓글