函数指针和回调函数定义示例
Examples about function pointer and callback function definition
我正在学习 C++ 中的回调函数,但在理解回调函数的初始化方面遇到了一些问题,例如
typedef void (CALLBACK *name)(int,int);
我认为它看起来很像函数指针的声明,像这样:
typedef void (*name)(int,int);
我有一个关于如何使用函数指针声明在另一个函数中调用一个函数的简单示例。该示例将 string
转换为 int
并与另一个 int
进行比较。然后告诉哪个更大:
#include <stdio.h>
#include <stdlib.h>
int StrToInt(char* inputchar) //converting function
{
int outputint;
outputint = atoi(inputchar);
return outputint;
}
typedef int(*p)(char*); //declare function pointer
void IntCompare(p FuncP, char* inputchar, int b) //comparing function
{
int a;
a = FuncP(inputchar); //call converting function using function pointer
if (a<b)
{
printf("%d is bigger\n", b);
}
else
{
printf("%d is bigger\n", a);
}
}
void main()
{
char* StrNum = "1234";
p FuncP; //creat a function pointer
FuncP = StrToInt; //point to converting function
IntCompare(FuncP, StrNum, 21);
}
我想问的是:
有人可以给我一个关于如何使用 typedef void (CALLBACK *name)(int,int);
的类似示例吗?请帮助我了解何时以及如何使用它。感谢您的关注。
CALLBACK
是宏。它与回调函数有关,但并不相同。您可以开始查看 C 中回调函数的实现。
qsort
例如使用这种技术。 qsort
是一个可以对任何数组进行排序的函数。但是你必须告诉qsort
如何比较不同的数据类型。这是通过将函数指针传递给 qsort
.
来完成的
int compare_int(const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int compare_string(const void * a, const void * b)
{
const char *pa = *(const char**)a;
const char *pb = *(const char**)b;
return strcmp(pa, pb);
}
int main ()
{
int int_array[] = { 3, 2, 1 };
int count = sizeof(int_array) / sizeof(int);
qsort(int_array, count, sizeof(int), compare_int);
const char *string_array[] = { "234","123","456" };
count = sizeof(string_array) / sizeof(char*);
qsort(string_array, count, sizeof(char*), compare_string);
return 0;
}
当然在 C++ 中我们使用 std::sort
,它使用模板代替。
但我们仍然需要在C++中传递函数。例如,参见 for_each
的实现
template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
{
for (; first != last; ++first) {
f(*first);
}
return f;
}
用法:
std::vector<int> nums{ 3, 4, 2, 8, 15, 267 };
auto print = [](const int& n) { std::cout << " " << n; };
std::for_each(nums.begin(), nums.end(), print);
std::cout << '\n';
我正在学习 C++ 中的回调函数,但在理解回调函数的初始化方面遇到了一些问题,例如
typedef void (CALLBACK *name)(int,int);
我认为它看起来很像函数指针的声明,像这样:
typedef void (*name)(int,int);
我有一个关于如何使用函数指针声明在另一个函数中调用一个函数的简单示例。该示例将 string
转换为 int
并与另一个 int
进行比较。然后告诉哪个更大:
#include <stdio.h>
#include <stdlib.h>
int StrToInt(char* inputchar) //converting function
{
int outputint;
outputint = atoi(inputchar);
return outputint;
}
typedef int(*p)(char*); //declare function pointer
void IntCompare(p FuncP, char* inputchar, int b) //comparing function
{
int a;
a = FuncP(inputchar); //call converting function using function pointer
if (a<b)
{
printf("%d is bigger\n", b);
}
else
{
printf("%d is bigger\n", a);
}
}
void main()
{
char* StrNum = "1234";
p FuncP; //creat a function pointer
FuncP = StrToInt; //point to converting function
IntCompare(FuncP, StrNum, 21);
}
我想问的是:
有人可以给我一个关于如何使用 typedef void (CALLBACK *name)(int,int);
的类似示例吗?请帮助我了解何时以及如何使用它。感谢您的关注。
CALLBACK
是宏。它与回调函数有关,但并不相同。您可以开始查看 C 中回调函数的实现。
qsort
例如使用这种技术。 qsort
是一个可以对任何数组进行排序的函数。但是你必须告诉qsort
如何比较不同的数据类型。这是通过将函数指针传递给 qsort
.
int compare_int(const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int compare_string(const void * a, const void * b)
{
const char *pa = *(const char**)a;
const char *pb = *(const char**)b;
return strcmp(pa, pb);
}
int main ()
{
int int_array[] = { 3, 2, 1 };
int count = sizeof(int_array) / sizeof(int);
qsort(int_array, count, sizeof(int), compare_int);
const char *string_array[] = { "234","123","456" };
count = sizeof(string_array) / sizeof(char*);
qsort(string_array, count, sizeof(char*), compare_string);
return 0;
}
当然在 C++ 中我们使用 std::sort
,它使用模板代替。
但我们仍然需要在C++中传递函数。例如,参见 for_each
template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
{
for (; first != last; ++first) {
f(*first);
}
return f;
}
用法:
std::vector<int> nums{ 3, 4, 2, 8, 15, 267 };
auto print = [](const int& n) { std::cout << " " << n; };
std::for_each(nums.begin(), nums.end(), print);
std::cout << '\n';