함수 포인터(Function Pointer)란?

함수의 주소를 값으로 갖는 포인터. int (*fp)(int, int) = add;처럼 인수와 반환값의 형을 포함하여 선언하고, fp(1, 2) 또는 (*fp)(1, 2)로 가리키는 함수를 호출한다. 함수 포인터의 배열을 사용하면 번호에 따라 처리를 전환하는 테이블을 만들 수 있다. 정렬의 비교 함수를 전달하는 qsort 같은 콜백, 인터럽트 벡터 테이블, 상태 기계의 각 상태 처리 등에 사용된다. 기계어로는 주소를 레지스터에 넣고 점프하는 간접 호출이 된다.

일본어 명칭: 関数ポインタ

함수 포인터(Function Pointer)은(는) ISA와 어셈블리, C 언어 기초 등 2개 분야의 연습 문제 3개에 나와요.

분야: C 언어 기초

도전해 보기: 함수 포인터(Function Pointer) 관련 문제

C 언어의 함수 포인터를 사용한 호출 '(*fp)(x)'는 RISC-V에서 일반적으로 어떤 명령어로 이루어지는가?

  1. A함수의 주소를 레지스터에 넣고 jalr로 그 레지스터의 주소로 점프한다
  2. Bjal에 함수의 주소를 즉치값으로 써서 점프한다
  3. Cbeq로 함수의 주소와 비교하여 같으면 점프한다
정답과 해설 보기

정답: A. 함수의 주소를 레지스터에 넣고 jalr로 그 레지스터의 주소로 점프한다

함수 포인터가 가리키는 곳은 실행 시까지 알 수 없으므로, 명령어 안에 목적지를 쓰는 jal은 사용할 수 없습니다. 그래서 포인터 값을 레지스터에 읽어 들이고 'jalr ra, 0(t0)'처럼 레지스터의 주소로 점프하며 복귀 주소는 ra에 남깁니다. C++의 가상 함수나 공유 라이브러리 함수 호출도 같은 간접 호출입니다. 목적지가 바뀌므로 CPU는 간접 분기 예측기로 목적지를 예상합니다.

해설 속 함수 포인터(Function Pointer)

함수 포인터(Function Pointer)이(가) 나오는 문제 (3)

  1. C 언어의 함수 포인터를 사용한 호출 '(*fp)(x)'는 RISC-V에서 일반적으로 어떤 명령어로 이루어지는가?
  2. 함수 포인터 배열을 사용한 위의 프로그램을 실행했을 때의 출력으로 올바른 것은?
  3. RISC-V의 의사 명령어 'ret'은 실제로 어떤 명령어로 실행되는가?

관련 용어

포인터(Pointer) 복귀 주소(return address) 공유 라이브러리(Shared Library) 분기 예측(Branch Prediction) 배열(Array) 의사 명령어(pseudo-instruction) 공용체(union) 구조체(struct) 댕글링 포인터(Dangling Pointer) 동적 메모리 할당(Dynamic Memory Allocation)

용어집으로 돌아가기