KPlay의 코딩 그리고 잡동사니

1. 함수포인터

변수가 메모리상에 저장되듯이 함수도 메모리상에 저장됩니다.

그리고 메인함수에서 특정함수를 출력할때는

함수이름(매개변수); 형식으로 출력되는걸 우리는 알고있습니다

프로그래머가 정의하는 모든 함수는 프로그램 실행 시 '메인 메모리'에 저장되어서 실행이 되는데

함수의 이름은 함수가 저장된 메모리의 주소값을 담고 있습니다.

이는 배열의 이름이 배열의 첫 인자의 주소값을 담고있는것과 같은 원리입니다

즉 함수의 이름 == 함수포인터라고 불릴수도 있습니다.

그렇다면 정의된 함수포인터(함수이름)의 형(type)은 무엇일까?

"함수 포인터의 형(type)은 '반환형'과 '매개변수의 선언형태'를 기준으로 구분합니다

가령 , double ComplexFunc(double, num1, double num2)라는 함수가 있다고 치면

이 함수 포인터의 형(type)은

"반환형이 double이고 매개변수로 두 개의 double 변수가 선언된 포인터형(type)"이라고 부릅니다

더 나아가서 함수이름의 주소 값(함수 포인터의 값)을 저장할 수 있는 포인터 변수는 어떻게 선언해야 할까요?

고려할것은 두가지 입니다.

1. 반환형의 정보

2. 매개변수의 정보

가령 int SoSimple(int num1, int num2)라는 함수의 함수 포인터 변수는

int (*fptr) (int, int); 이런식으로 정의가 됩니다.

그리고 이 함수 포인터 변수에 함수 SoSimple의 주소값을 저장하려면 다음과 같이 대입연산을 진행합니다

fptr = SoSimple;

이렇게 되면

fptr(3, 4) 와 SoSimple(3, 4)가 같은 표현이 되는것이다.

이 형식은 앞에서 봤던 배열을 포인터 변수에 대입연산해서 []연산자를 쓸 수 있던것과 비슷한 맹락입니다.

추가로, 당연하게도 함수의 매개변수에 함수포인터 변수가 온다면

인자값으로 함수의 이름이 전달될것이라는것을 유추 할 수 있습니다.

2. void 포인터

void 키워드는 보통 함수의 인자나 return 값으로 많이 쓰입니다

대표적인 main함수만 봐도 int main(void)처럼 많이 쓰이는데

이는 형(type)이 존재하지 않는다는 뜻입니다

본론으로 돌아와서 void 포인터의 기본적인 형식은 다음과같습니다

void * ptr;

void* 형 포인터의 두가지 특징은

1. 어떤 자료형이든 닮을 수 있는 만능 바구니

2. 포인터형이 정해지지 않았으므로 *연산을 이용한 접근이 불가능

그러면 다시말해 그냥 ptr값을 출력만 할 수 있다는건데 왜 만들어진것일까요

이에 대해서는 뒤에나오는 malloc 함수를 선언할때 쓰입니다.

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band