728x90
커뮤니티_모각코 (모여서, 각자, 코딩) 활동을 하면서 배운 내용을 되새기며 쓴 글입니다.
코딩을 배우고 싶다면 코뮤니티 활동을 적극 추천합니다.
https://cafe.naver.com/codeuniv
함수 포인터란?
함수를 가리키는 포인터를 함수 포인터라 합니다.
함수를 선언하게 되면 변수와 같이 메모리에 공간이 할당되고,
주소를 가지게 되며 그주소를 활용할 수 있습니다.
#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;
}
마무리
포인터를 사용하는 이유에 대해선 잘 알겠는데 어렵다...
확실히 포인터를 처음 공부할땐 진도 따라가느라 이해 못 하고 넘겼는데...
다시 복습하길 잘한것 같다.
완전히 이해한건 아니지만 처음 공부할 때보다 더 알게 된 것 같다!
'C_ language > C언어 심화_모각코' 카테고리의 다른 글
C언어_심화_동적 메모리 할당 문제 (0) | 2022.06.28 |
---|---|
C언어_심화_동적 메모리 할당 (0) | 2022.06.17 |
C언어_심화_2차원 배열과 이중포인터 (0) | 2022.05.26 |
C언어_심화_이중 포인터 (0) | 2022.05.10 |
C언어_심화_2차원 배열 (0) | 2022.05.06 |
댓글