함수 포인터 선언하기
우리는 이제까지 어떤 변수를 가리키는 포인터, 배열을 가리키는 포인터를 사용해보았어요. 물론 이정도를 알아도 상당히 훌륭하다고 생각합니다.
그렇지만 변수뿐만 아니라 함수도 포인터로 가리킬 수 있다는 것을 알게 된다면 조금 더 간지나는 프로그래밍을 시도해 볼 수 있겠습니다.
이제부터 설명할 것이 무엇이냐, 그 이름하여 함수포인터랍니다.
함수포인터라... 그냥 포인터도 극혐인데 말이죠
함수포인터란 함수를 가리킬 수 있는 포인터를 의미합니다. 아니, 근데 그러면 주소를 알아야하는데, 함수에도 주소가 있나? 네, 있습니다.
1. test 라는 함수를 만든다.

2.main에 int test(int a) 가져와서 함수 포인터 형만 남긴다.

3. 함수 명을 (*)을 추가하여 함수 포인터를 선언하고, 포인터 값을 마음에 드는 걸로 선해준다.

4. 콜백구조를 만들기 위한 선언이며, 함수 포인터 선언한 포인터의 값을 함수로 입력해준다.

아래에 pfTest(5)를 통해 함수를 실행시켜주면 아래의 결과가 나온다.


아니, 그렇다면 Test함수만 호출하면 되지, 왜 굳이 포인터를 써서 호출하는 거야?
저도 무척이나 이런 생각을 하고 하고 또 하면서 그냥 함수포인터를 흘려 넘겼었죠.
근데 쓰임새는 꽤나 많습니다.
예를 들면 함수 자체를 매개변수로 받고 싶을때가 있을 겁니다.
프로젝트를 진행할때 한 사람만이 진행한다면 물론 상관이 없지만, 여러 사람과 협업을 해야하거나, 라이브러리를 제공할때, 함수에 함수자체를 매개변수로 받아야할 때가 있습니다. 누가 어떤 함수를 필요로 할지 모르니, 어떤 형식으로 함수를 정의해서 매개변수로 전달하게 되면 그 함수를 내부에서는 호출하게 되는 식으로 말이죠.
1
2
3
4
5
|
void func(void (*ptr)()) {
...
ptr();
...
}
|
그리고 또 구조체에서 멤버함수를 커스터마이징할때도 사용할 수가 있습니다.
1
2
3
4
5
|
struct animal{
...
void (*walk)();
...
}
|
출처: https://www.youtube.com/watch?v=hWnLq-dg7B4&list=PLXvgR_grOs1AiEXL3Xfy6yEZ7k2TL4rxy&index=4
'📈알고리즘 > 알고리즘' 카테고리의 다른 글
1주차 공부 과정 (0) | 2023.03.08 |
---|---|
C언어 공부(3)[동적 메모리 할당] (0) | 2023.02.08 |
C언어 공부(2)[문자열 제어, 구조체] (0) | 2023.02.07 |
C언어 공부(1)[라이브러리 math, limit 및 배열, 재귀함수, 포인터] (0) | 2023.02.06 |
C언어 기초정리(입력, 출력, 함수구조) (0) | 2023.02.06 |