C语言 函数指针使用攻略
函数指针是C语言中一个非常有用的特性,它允许我们将函数的地址作为参数传递给另一个函数,或者作为另一个函数的返回值,从而提高函数的灵活性和可重用性。下面将详细介绍如何使用函数指针。
函数指针的声明
函数指针的声明与变量的声明类似,只不过要在函数名前加上“*”,例如:
int (*p)(int, int);
表示“p”是一个指向返回类型为int,参数类型为int和int的函数指针。注意,函数指针的类型要与被指向函数的类型严格匹配。
函数指针的定义与赋值
函数指针的定义与变量的定义类似,可以在声明时同时定义,也可以单独定义。例如:
int (*p)(int, int) = NULL;
p = func;
其中,“func”是一个函数名,表示函数的地址。函数指针可以通过“&”符号取得函数的地址,例如:
p = &func;
函数指针也可以作为参数传递给函数,例如:
void print(int (*p)(int, int), int x, int y)
{
printf("%d\n", p(x, y));
}
这个函数接收一个函数指针“p”作为参数,并且调用“p”函数,传递两个整数参数“x”和“y”。当“p”被调用时,实际执行的是“p”所指向的函数。
函数指针还可以作为函数的返回值,例如:
int (*getFunc())(int, int)
{
return func;
}
这个函数返回一个函数指针,指向一个返回类型为int,参数类型为int和int的函数。
示例1:排序函数
函数指针特别适合用于实现通用的排序函数。例如,下面是一个采用函数指针实现的快速排序函数:
void quickSort(int *arr, int left, int right, int (*cmp)(int, int))
{
if (left >= right) {
return;
}
int pivot = arr[(left + right) / 2];
int i = left, j = right;
while (i <= j) {
while (cmp(arr[i], pivot)) {
i++;
}
while (cmp(pivot, arr[j])) {
j--;
}
if (i <= j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
}
quickSort(arr, left, j, cmp);
quickSort(arr, i, right, cmp);
}
这个函数接收一个整数数组“arr”,数组的左边界“left”和右边界“right”,以及一个函数指针“cmp”。在排序过程中,通过“cmp”指向的函数来比较两个整数的大小,从而实现升序排列或降序排列。
下面是一个比较函数的示例,用于按照升序排列:
int cmpAsc(int a, int b)
{
return a < b;
}
我们可以将这个比较函数传递给快速排序函数,并对一个整数数组进行排序:
int main()
{
int arr[] = {6, 2, 3, 5, 4, 1};
int size = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, size - 1, cmpAsc);
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
输出结果为:
1 2 3 4 5 6
示例2:回调函数
函数指针还可以用于回调函数的实现。回调函数是指在一个函数中调用另一个函数,并以函数指针的形式将回调函数传递给被调用的函数。回调函数常用于事件处理、状态监测等场合。
例如,下面是一个模拟登录的函数,用于验证用户名和密码是否正确:
int login(char *username, char *password)
{
if (strcmp(username, "admin") == 0 && strcmp(password, "admin123") == 0) {
return 1;
} else {
return 0;
}
}
这个函数接收两个字符串参数“username”和“password”,如果用户名和密码正确,则返回1,否则返回0。
我们可以写一个登录界面,并使用回调函数来处理登录成功和失败事件:
void onLoginSuccess()
{
printf("Login success!\n");
}
void onLoginFailure()
{
printf("Login failure!\n");
}
int main()
{
char username[64], password[64];
printf("Username: ");
scanf("%s", username);
printf("Password: ");
scanf("%s", password);
if (login(username, password)) {
onLoginSuccess();
} else {
onLoginFailure();
}
return 0;
}
在这个程序中,如果登录成功,则调用“onLoginSuccess”函数,否则调用“onLoginFailure”函数。我们可以像这样编写任意类型的回调函数,并将其传递给各种各样的函数,用于处理不同的业务逻辑。
总结
函数指针是C语言中一个非常有用的特性,可以提高函数的灵活性和可重用性。在实际编程中,我们可以利用函数指针来实现通用的排序、查找、回调等功能,提高程序的效率和健壮性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 函数指针 - Python技术站