함수 포인터
함수는 이름이 원래 메모리의 주소라고 했다. 그럼 여기서 함수의 포인터는? 외우면 된다. int TestFunc(char*);같은 함수가 있다면, 함수 포인터는 int (*pfTest)(char*);같이 해주면 된다. 함수의 이름부분에, 괄호를 쳐주고, 앞에 *를 붙여준 다음, 함수포인터의 이름만 새로 지어주면 된다.(pfTest는 이름의 예시)
그리고 pfTest = TestFunc;로 주소를 대입해주면 된다.(이때 이름만 담으니, ( )는 빼준다) 여기까지는 쉽고, 이해할만 하다. 근데 어디다 써먹는지가 문제다.
콜 백(Call back)
Callback함수의 가장 중요한 가정은 Callback함수를 만드는 사람과, 이것을 사용하는 함수를 만드는 사람이 다르다는 것이다. main함수가 있다면 그 함수가 Call하는 함수가 있을 것이다. 그 함수가 또 다른 함수를 Call하는 경우가 있을 텐데, 그것이 Callback이다.(Callee가 Call하는 것이다) 그럼 Callback되는 함수가 return하는 값도 있을 것인데, 그 함수를 만든 사람은 Callback이 몇 번 될지, 리턴이 어떻게 될지를 모른다는 것이(각각 독립되어 있다는 것이) 중요하다.
예시
73장에 배울 qsort( )는 선택 정렬을 대신해주는 함수다. 미리 함수의 알고리즘이 짜여있기 때문에, qsort(배열이름, 크기, sizeof(자료형), 비교할 함수);의 형식으로 매개변수를 넣어주면 된다. 그러면 qsort의 알고리즘대로 풀린다. 여기서 비교할 함수를 CompareData로 해서 두 매개변수로 받은 값을 포인터로 강제 형 변환 하고 빼줘서 반환하게 해야 된다. 이 함수를 qsort가 불러 쓰는 것이 콜 백이다.
Call back함수의 구현은 예제로 잘 되어있다. 숫자를 선택 정렬하는 것이 첫 번째 예제고, 두 번째 예제가 문자열을 선택 정렬하는 것이다. 이때는 함수의 식을 return strcmp(*(char**)pParam2, *(char**)pParam1); 로, strcmp함수로 비교해주는데, 받은 매개변수를 포인터를 간접지정해서, 결국 주소의 값이 되게 하는 것이다.
복잡한 함수 포인터
위정도 까지만 해도 충분하다. 복잡한 함수 포인터란, 여기서 다차원 배열이 결합돼서, char (*pfTest[2][5])(int) = {TestFunc};와 같이 된 함수포인터다. 이 포인터를 해석하자면, int(정수형) 자료형을 매개변수로 하고, char 자료형으로 반환하는, 포인터가 2행, 5열의 요소로 된 함수포인터다. (함수 포인터 선언은 쓸 경우가 있어도, 이런 복잡한 함수 포인터는 안 쓴다. 이 부분은 재미로 알아두자.)
'c언어 > 워딩(미정리)' 카테고리의 다른 글
버퍼 오버런 (0) | 2019.07.08 |
---|---|
정적 라이브러리 개발 (0) | 2019.07.08 |
재귀호출 (0) | 2019.07.08 |
형 한정어, 형재선언, 열거형 상수 (0) | 2019.07.08 |
지역 ,자동, 전역, 정적, 레지스터 변수 (0) | 2019.07.08 |