c언어 함수 포인터 예제

7) C++의 많은 개체 지향 기능은 C의 함수 포인터를 사용하여 구현됩니다. 예를 들어 가상 기능. 클래스 메서드는 함수 포인터를 사용하여 구현된 또 다른 예입니다. 자세한 내용은 이 책을 참조하십시오. 텍스트 세그먼트에는 Read+Exec 권한이 있으므로 문자열 리터럴을 함수 포인터로 캐스팅하는 것은 동적으로 할당된 메모리에 필요한 것처럼 mprotect() 또는 VirtualProtect() 시스템 호출없이 작동합니다. (또는 gcc -z execstack 스택 + 데이터 세그먼트 + 힙 실행, 빠른 해킹으로 프로그램을 연결합니다.) 함수 포인터를 사용하기 전에 함수의 주소를 할당해야 합니다. 반품 타입 이 완성! 이제 D2를 현재 의 D3()인 반환하는 함수 선언자 함수로 대체해 보겠습니다. 기본적으로 모든 하위 클래스에 대해 사용 가능한 메서드는 다시 한 번 함수 포인터입니다. 이번에는 set 메서드에 대 한 선언이 없으므로 ImmutableString에서 호출할 수 없습니다. C에서 객체 지향 프로그래밍 스타일로 작성하는 방법을 배우고 있다는 면책 조항을 추가해야하므로 잘 설명하지 않았거나 C에서 OOP를 구현하는 가장 좋은 방법의 측면에서 벗어난 점이있을 수 있습니다. 그러나 내 목적은 함수 포인터의 많은 용도 중 하나를 설명하는 것이었습니다.

컴파일러는 텍스트 세그먼트의 일부로 연결된 .rodata 섹션(또는 Windows의 .rdata)에 문자열 리터럴을 배치합니다(함수용 코드와 함께). 많은 “순수” 개체 지향 언어는 함수 포인터를 지원하지 않습니다. 그러나 단일 메서드(멤버 함수)를 정의하는 인터페이스에 대한 참조를 사용하여 이러한 종류의 언어로 유사한 것을 구현할 수 있습니다. C# 및 Visual Basic.NET과 같은 CLI 언어는 대리자를 통해 형식 안전 함수 포인터를 구현합니다. 함수 포인터는 3세대 프로그래밍 언어(예: PL/I, 코볼, 포트란, [1] dBASE dBL 및 C) 및 개체 지향 프로그래밍 언어(예: C++ 및 D)에서 지원됩니다. [2] for-loop 카운터를 1000으로 작성하고, 매번 일부 함수를 호출할 때마다 마음에 떠오르는 첫 번째 질문은 포인터를 사용하여 함수를 호출할 수 있을 때 함수를 호출하는 이유입니다. – 그것은 좋은 질문입니다! 이제 배열을 정렬해야 하는 정렬 함수를 상상해 보십시오. 경우에 따라 배열 요소를 오름차순 또는 내림차순으로 정렬하려고 합니다. 어떻게 선택하시겠습니까? 함수 포인터! 함수 포인터를 광범위하게 사용하여 함수를 호출하면 분기 예측변수가 분기할 위치를 파악하지 못할 수 있기 때문에 최신 프로세서의 코드 속도가 느려질 수 있습니다(런타임에 함수 포인터의 값에 따라 다름). 인덱싱되지 않은 테이블 조회가 크게 감소하여 보정되는 경우가 많기 때문에 과장될 수 있습니다. 다음 프로그램은 함수 포인터를 사용하여 다른 함수에서 간접적으로 두 함수(sin 또는 cos) 중 하나를 호출합니다(compute_sum, 함수의 Riemann 통합의 근사치 계산).

이 프로그램은 함수 main call 함수 compute_sum을 두 번 사용하여 라이브러리 함수 죄에 대한 포인터를 처음 전달하고 두 번째로 함수에 대한 포인터를 전달하여 작동합니다. 함수 compute_sum은 함수 포인터 인수 funcp를 여러 번 디참조하여 호출된 함수가 반환하는 값을 추가하고 결과 합계를 반환하여 두 함수 중 하나를 간접적으로 호출합니다. 두 합계는 기본으로 표준 출력에 기록됩니다. 건설은 오른쪽에있는 것으로 시작됩니다 : 반환 된 것은 char를 취하는 기능입니다. 선언자를 구별하기 위해 숫자를 매기려고합니다 : 다음 예제에서는 두 개의 정수 매개 변수를 허용하고 정수를 반환하는 함수를 참조하는 함수 포인터를 선언합니다. 위의 답변은 이미 많은 설명, 난 그냥 전체 예를 제공합니다 : 명령 int (*ope[4])(int, int); 함수 포인터의 배열을 정의합니다. 각 배열 요소에는 동일한 매개 변수와 반환 형식이 있어야 합니다. 예를 들어 다음 프로그램은 함수(또는 서브루틴) 포인터의 가장 간단한 구현이 실행 가능한 메모리 내에서 함수의 주소를 포함하는 변수로 두 가지 값을 교환합니다.