티스토리 뷰

매번 헷갈리는 함수포인터 정리

c언어에서 함수포인터의 경우 자주는 아니지만 초기에 베이스 코드를 작성할 경우에 많이 쓴다. 그런데 이게 가끔 쓰다보니 매번 어떻게 쓰더라 하고 까먹게 되는데, 그래서 오늘은 확실히 짚고 넘어가고자 적어놓는다.


함수 포인터는 어떤 경우에 사용할까?

가령 '저녁밥 요리하기'란 함수가 있다고 치자. 이 함수는 인자로 '냉장고 속 요리재료'를 받아서 스파게티를 만드는 코드이다. 여기까진 좋다. 그런데 다음날이 되어 '짜장밥'이 먹고 싶어졌다. 그래서 코드를 짜장밥을 만들도록 수정했다.다음날은 김치찌개, 그 다음날은 볶음밥.... 계속 함수를 수정하려니 귀찮다. '저녁밥 요리하기' 함수에 매일 저녁 바뀌는 '요리 레시피'란 코드를 넘겨주면 알아서 척척 저녁밥이 만들어질텐데 말야~ 이럴 때 사용하라고 나온 것이 함수 포인터이다. 함수포인터는 그때 그때 바뀌는 코드를 함수에 전달하기 위해 쓸 수 있다. 또 이런경우 함수포인터 배열을 만들어 두면 즉 레시피의 목록을 만들어 두면 차후 '저녁밥 요리하기' 호출시 더욱 간편해진다.




함수포인터 쓰는 방법

반환형 (* 포인터변수 ) ( 파라미터형 목록 )

알고보면 함수란 것도 실은 메모리에 올라와 있는 코드를 가리키는 포인터이다. 그래서 포인터 변수 처럼 함수 포인터도 선언하면 간편할 것 같지만 함수란 녀석이 반환형도 있고 인자들도 있기 때문에 조금 복잡하다. 또 각각의 함수마다 제각각이기 때문에 위의 양식을 따라야 한다.  예제) bool (* recipe ) (char **) 

char food[] = {"당근", "양파", "햄", "치즈"};
bool spaghetti_recipe(char** food_ingredients)
{
    ... 요리
    return true;
}
if (cooking_dinner(bool (*spaghetti_recipe)(char **)) == true) 
    printf("저녁 먹자~");
else 
    printf("얘들아~ 오늘은 외식이다~");