하루의 쉼터

[BasicGrammar] FunctionPointer(함수포인터) - with. c++ 본문

프로그래밍/C++

[BasicGrammar] FunctionPointer(함수포인터) - with. c++

Changun An 2023. 4. 16. 20:00
반응형

함수의 주소는 함수에 해당하는 기계의 코드가 저장되어 있는 메모리 블록의 시작 주소.

주요 사용처

  • 콜백함수 : 이벤트 핸들러, 인터럽트 핸들러, GUI 이벤트 처리를 위해 함수를 호출하기 위해서는 함수의 주소 값을 알아야하는데 이때 함수포인터를 사용하여 콜백 함수를 구성하게 된다. 이때 콜백함수의 매개변수, 반환 타입을 정의하여 사용한다.
  • 함수포인터 배열 : 함수포인터를 배열로 선언하여 다양한 함수를 동적으로 저장하고 사용 가능하다.
  • 동적로딩 : 라이브러리에서 함수 호출이 가능하며, 런타임 시 필요한 라이브러리를 로드하고 사용가능하다.
  • 코드 재사용 : 다른 함수의 일부 기능을 함수포인터로 사용하여 재사용성을 높일 수 있다.

사용법 테스트)

#include <iostream> 
 int think() { 
         int num = 3; 
         std::cout << "think" << std::endl; 
         return 3; 
 }; 
  
 double pam_origin(int num) { 
         return static_cast<double>(num); 
 }; 
 int pam_a(int num) { 
         return num; 
 } 
 double pam_b(double num) { 
         return num; 
 } 
 double (*pf)(int num); 
  
 void estimate(int lines, double(*pf)(int)) { 
         std::cout << "estimate" << std::endl; 
 } 
  
 int main() { 
         std::cout << think << std::endl; // think의 주소값 전달 
         std::cout << think() << std::endl; // think의 리턴값 전달 
  
         pf = pam_origin; 
         // pf = pam_a; 반환형식이 달라서 안됨. 
         // pf = pam_b;매개변수 달라서 안됨. 
         estimate(50, pam_origin); 
         double x = pam_origin(4); 
         double y = (*pf)(5); //pam_origin 호출 
         double z = pf(5); //pam_origin 호출 
         return 0; 
 };

사용 예제)

#include<iostream> 
 double robot(int lns); 
 double changun(int lns); 
 void estimate_test(int lines, double(*pf)(int)); 
 int main() { 
         int code = 0; 
         std::cout << "필요한 코드의 행 수를 입력하십시오 : "; 
         std::cin >> code; 
         std::cout << "robot의 시간 예상 : "; 
         estimate_test(code, robot); 
         std::cout << std::endl; 
         std::cout << "changun의 시간 예상 : "; 
         estimate_test(code, changun); 
         return 0; 
 } 
  
 double robot(int lns){ 
         return 0.05 * lns; 
 } 
  
 double changun(int lns) 
 { 
         return 0.03*lns; 
 } 
  
 void estimate_test(int lines, double(*pf)(int)){ 
         std::cout << lines << "행을 작성하는데 걸리는 시간은 : "; 
         std::cout << pf(lines) << " hour 걸립니다." << std::endl; 
 }

반응형
Comments