포인터를 배우시면, 가장 머리가 아픈 부분이 함수 포인터일 겁니다. 교재에서는 아마 signal이랑, qsort를 예제로 많이 들 거에요. 사실 signal은 잘 안 쓰지만요. qsort는 비교체를 넘겨줄 때 함수 포인터를 넘겨주고요. 그런데, 이것이 대체 무엇을 하는 것일까요?

 

 


 어떻게 실행되는지, 자세하게 분석을 하는 것은 아마도, 어셈블리랑 같이 하면서 이야기를 할 듯 싶어요. 오늘은 예제 코드만 간단하게 이해해 보도록 하겠습니다.

 

 

17줄짜리 프로그램입니다. func라는 변수를 선언했는데요. 이것이 무엇인지만 안다면, 끝난다고 보셔도 될 듯 싶습니다. 먼저, 6번째 줄에서, void (*func)() = foo; 라고 되어 있습니다. 선언부만 잘 보시면 되는데요. 시계 방향으로 해석하겠습니다.

 

 

 먼저 func의 오른쪽을 봅니다. )가 있습니다. 그러므로, 시계 방향으로 돌겠습니다.

 

 

 *을 만났습니다. *은 pointer 정도로 해석하시면 됩니다. func is a pointer ~ 라고 보시면 됩니다. 그런데 무엇을 가리키는지가 없습니다. 계속 시계 방향으로 보도록 하겠습니다.

 

 

 ()을 만났습니다. 이것은, function을 의미합니다. 그런데, ()은 아무 것도 넘겨주지 않는, 그러니까 인자가 아무것도 없나 봅니다. 그러면, 무엇인가를 리턴할 겁니다. 계속 보도록 하겠습니다.

 

 void? func은 인자가 아무것도 없고, 리턴 값이 아무것도 없는 함수를 가리키는 변수였습니다. 이 func에 foo를 넣습니다.

 

 


 foo를 간략하게 도식화를 시켰습니다.

 

 

 이 값을 func에 넣었습니다. 그러면, func는 foo의 시작 위치를 가리키고 있을 겁니다. 그러면 foo 함수를, func를 사용해서 호출이 가능할까요? 네. 이미 func는 foo 함수의 시작 위치를 가리키고 있으니,func()를 호출하면 "foo"가 출력될 겁니다.

 

 

 func에 b함수의 주소를 대입하면 어떻게 될까요?

 

 

 그러면 노란 부분이 실행이 될 거에요. 왜냐하면, 이 때, func는 b의 시작 위치를 가리키고 있기 때문입니다.

 

 

 실행 결과는 위와 같습니다.