함수를 C에서 매개 변수로 어떻게 전달합니까?
데이터 집합에 대해 매개 변수로 전달 된 함수를 수행하는 함수를 만들고 싶습니다. 함수를 C에서 매개 변수로 어떻게 전달합니까?

Answer 1 Niyaz
Declaration
함수 매개 변수를받는 함수의 프로토 타입은 다음과 같습니다.
void func ( void (*f)(int) );
이것은 매개 변수 f
가 void
반환 유형을 갖고 단일 int
매개 변수 를 취하는 함수에 대한 포인터가 될 것임을 나타냅니다 . 다음 함수 ( print
)는 적절한 유형이기 때문에 매개 변수 로 func
에 전달할 수있는 함수의 예입니다 .
void print ( int x ) {
printf("%d\n", x);
}
기능 호출
함수 매개 변수를 사용하여 함수를 호출 할 때 전달 된 값은 함수에 대한 포인터 여야합니다. 이를 위해 함수 이름 (괄호 없음)을 사용합니다.
func(print);
func
를 호출 하여 print 함수를 전달합니다.
기능 본체
모든 매개 변수와 마찬가지로 func
는 이제 함수 본문의 매개 변수 이름을 사용하여 매개 변수 값에 액세스 할 수 있습니다. func
가 숫자 0-4에 전달되는 함수를 적용 한다고 가정 해 봅시다 . 먼저 print를 직접 호출하는 루프의 모습을 고려해보십시오.
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
print(ctr);
}
이후 func
의 매개 변수 선언은 그 말한다 f
는 원하는 기능에 대한 포인터의 이름, 우리는 경우 첫 번째 기억 f
는 다음 포인터입니다 *f
는 것은입니다 f
를 (즉, 함수를 가리키는 print
이 경우는). 결과적으로 위의 루프에서 모든 인쇄 항목을 *f
로 바꾸십시오 .
void func ( void (*f)(int) ) {
for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
(*f)(ctr);
}
}
Answer 2 roo
이 질문은 이미 함수 포인터를 정의하는 데 대한 답을 가지고 있지만, 특히 응용 프로그램 주위로 전달하려는 경우 매우 지저분해질 수 있습니다. 이 불쾌감을 피하기 위해 함수 포인터를 더 읽기 쉬운 것으로 typedef하는 것이 좋습니다. 예를 들면.
typedef void (*functiontype)();
void를 반환하고 인수를받지 않는 함수를 선언합니다. 이 유형에 대한 함수 포인터를 만들려면 이제 다음을 수행 할 수 있습니다.
void dosomething() { }
functiontype func = &dosomething;
func();
int를 반환하고 char을 취하는 함수의 경우
typedef int (*functiontype2)(char);
그리고 그것을 사용
int dosomethingwithchar(char a) { return 1; }
functiontype2 func2 = &dosomethingwithchar
int result = func2('a');
함수 포인터를 읽기 좋은 형식으로 바꾸는 데 도움이되는 라이브러리가 있습니다. 부스트 기능 라이브러리는 위대하고 잘 노력 가치가 있습니다!
boost::function<int (char a)> functiontype2;
위의 것보다 훨씬 좋습니다.
Answer 3 Richard
C ++ 11부터 기능 라이브러리 를 사용하여 간결하고 일반적인 방식으로이를 수행 할 수 있습니다 . 구문은 다음과 같습니다.
std::function<bool (int)>
여기서 bool
은 첫 번째 인수가 int
유형 인 단일 인수 함수의 반환 유형 입니다.
아래에 예제 프로그램이 포함되어 있습니다.
// g++ test.cpp --std=c++11
#include <functional>
double Combiner(double a, double b, std::function<double (double,double)> func){
return func(a,b);
}
double Add(double a, double b){
return a+b;
}
double Mult(double a, double b){
return a*b;
}
int main(){
Combiner(12,13,Add);
Combiner(12,13,Mult);
}
하지만 때로는 템플릿 함수를 사용하는 것이 더 편리합니다.
// g++ test.cpp --std=c++11
template<class T>
double Combiner(double a, double b, T func){
return func(a,b);
}
double Add(double a, double b){
return a+b;
}
double Mult(double a, double b){
return a*b;
}
int main(){
Combiner(12,13,Add);
Combiner(12,13,Mult);
}
Answer 4 Yogeesh H T
합격 다른 함수 매개 변수 함수의 주소를 아래와 같이
#include <stdio.h>
void print();
void execute(void());
int main()
{
execute(print); // sends address of print
return 0;
}
void print()
{
printf("Hello!");
}
void execute(void f()) // receive address of print
{
f();
}
또한 함수 포인터를 사용하여 함수 를 매개 변수로 전달할 수 있습니다.
#include <stdio.h>
void print();
void execute(void (*f)());
int main()
{
execute(&print); // sends address of print
return 0;
}
void print()
{
printf("Hello!");
}
void execute(void (*f)()) // receive address of print
{
f();
}
Answer 5 doppelheathen
함수는 ISO C11 6.7.6.3p8에 따라 함수 포인터로 "전달"될 수 있습니다. "" 함수 반환 유형 "으로 매개 변수 선언은 6.3에서와 같이 "함수 반환 유형에 대한 포인터 "로 조정되어야합니다. .2.1. ". 예를 들면 다음과 같습니다.
void foo(int bar(int, int));
다음과 같습니다.
void foo(int (*bar)(int, int));