Algorithm/C

[c언어 개념] #10 함수 포인터, void 포인터

하노정 2022. 7. 24. 20:47

c언어 개념 정리와 문제 풀이를 통해 알고리즘 수업을 준비하는 과정입니다. 그동안 수강했던 c언어 수업 자료와 윤성우의 열혈 C 프로그래밍의 내용을 포함해 저에게 기록할 가치가 있는 내용이 담겨 있습니다. 


함수 포인터란?

변수 뿐만 아니라 함수들도 바이너리 형태로 메모리 공간에 저장되어서 호출 시 실행이 된다.

메모리상에 저장된 함수의 주소 값을 저장하는 포인터 변수가 '함수 포인터 변수'이다.

 

함수의 이름은 메모리상에 저장된 함수의 주소 값을 의미한다.

배열이름이 배열의 시작주소 값을 의미하듯, 함수이름함수가 저장된 메모리 공간의 주소 값을 의미하는 것이다.

 

그럼 함수 포인터 변수는 어떻게 선언해야 할까?

이를 위해서는 먼저 함수 포인터의 포인터 형을 결정해야 한다.

모든 변수가 그러하듯 형을 결정하지 못하면 적절한 함수 포인터 변수의 선언은 불가능하다.

(2차원 배열에서도 먼저 포인터 형을 배웠다.)

 

함수이름의 포인터 형은 반환형과 매개변수의 선언을 통해서 결정한다.

 

int func ( int num ) { . . }

 

함수이름의 포인터 형은?

"반환형이 int이고 매개변수로 int형 변수가 하나 선언된 포인터 형이다."

 

그럼 함수 포인터 변수의 선언은?

int (*fptr) (int);

fptr은 포인터 변수를 선언한 것이며, 왼편에 선언된 int는 반환형을 의미하며,

오른편에 있는 (int)는 매개변수 선언이 int 하나라는 것이다.

 

매개변수의 선언으로 함수 포인터 변수가 올 수 있고, 이에 따라 동작하는 함수의 정의도 가능하다.

이 내용은 책을 보고 처음 알게 된 내용이다.

함수 포인터를 통해 함수의 동작방식에 유연성을 제공할 수 있다.

 

'형(type)'이 존재하지 않는 void 포인터

void * ptr;

위와 같은 포인터 변수를 'void형 포인터 변수'라 한다.

무엇이든 담을 수 있는 바구니에 비유할 수 있다. 함수의 주소 값도 포함해서 어떠한 변수의 주소 값이든 담을 수 있다. 

 

void형 포인터 변수로 아무런 포인터 연산도 하지 못한다. 값의 변경이나 참조도 불가능하다.

void형 포인터 변수에는 가리키는 대상에 대한 어떠한 형(type)의 정보도 담겨있지 않으므로 당연한 것이다.

 

일단 주소 값에만 의미를 두고, 포인터 형은 나중에 결정할 때 유용하게 사용된다.

'메모리의 동적 할당'을 잘 이해하려면 void형 포인터의 존재를 알고 있어야 한다.