본문 바로가기

C

[7] 함수 포인터

728x90

함수의 코드를 컴파일하면 기계어 코드가 메모리에 저장되는데 이에 따라 주소값이 생깁니다.

배열처럼 이때의 주소값은 함수의 첫 부분의 메모리 위치를 나타냅니다.

이 주소값을 저장해서 포인터로 이용할 수 있는데, 이 포인터를 "함수 포인터"라고 합니다.

 

함수 포인터

함수의 주소값을 저장할 수 있는 포인터로 일반 배열과는 조금 다르게 선언을 해야 합니다.

함수 포인터는 3가지 과정을 거쳐 사용할 수 있게 됩니다.

1) 함수 선언 및 정의

2) 함수 포인터 선언 및 주소값 대입

3) 함수 포인터로 함수 호출

 

함수 선언 및 정의는 할 줄 안다는 가정으로 포인터 선언부터 설명하겠습니다.

 

함수 포인터 선언

함수 포인터 선언 방법은 아래와 같습니다.

주의 : 선언할 때 함수이름과 *를 함께 묶어주지 않으면 ( )가 *보다 우선순위가 높아서 일반 함수를 정의한 것처럼 인식됩니다. 꼭 *를 이름과 함께 감싸주시길 바랍니다.

 

주소값 대입

위와 같은 함수가 정의되어 있다고 하면, 포인터에 함수이름을 씀으로써 어드레스를 저장할 수 있습니다.

함수 포인터로 함수 호출

이제 역참조를 사용해서 포인터로 함수를 호출해 보겠습니다. 선언할 때와 마찬가지로 우선순위의 문제로 *를 묶어주지 않으면 함수가 포인터로 인식되지 않아 오류가 발생합니다.

결과

이렇게 함수포인터를 사용해서 제대로 된 결과를 얻었습니다.

 

그렇다면 이런 함수 포인터를 굳이 왜 사용해야 할까요?

함수 포인터를 사용하면 복잡한 코드를 좀 더 단순하게 짤 수 있습니다.

switch문으로 경우를 나눈 코드

위의 함수처럼 원래는 분기에 따라 다른 함수를 호출하고 싶을 때 if나 switch를 사용해 경우를 나눠줌니다.

하지만 포인터를 사용하면 깔끔하게 만들 수 있습니다.

함수 포인터를 사용해 경우를 나눈 코드

두 코드 모두 똑같은 결과가 나왔습니다.

지금은 경우가 3가지 밖에 없었지만, 많아지면 많아질수록 포인터로 함수를 호출하는 것의 장점도 커질 것입니다.

 

이상으로 1칠판을 마치겠습니다.

728x90

'C' 카테고리의 다른 글

[9] 구조체 표기방법과 크기  (0) 2021.04.25
[8] 구조체  (0) 2021.04.24
[6] 문자열과 포인터  (0) 2021.04.24
[5] 함수와 배열인수  (0) 2021.04.23
[4] 이중 포인터(포인터의 포인터)  (0) 2021.04.23