关于c:函数指针

4次阅读

共计 2039 个字符,预计需要花费 6 分钟才能阅读完成。

函数指针

  • 函数指针:指向函数的指针,函数名就相当于一个函数指针。

函数指针的定义

int add(int a,int b)
{return a+b;}
int main()
{printf("%p", add);
    printf("%p", &add);
    // 两个输入后果雷同,add 和 &add 都是失去函数的地址
    int (*pf)(int, int) = add;  // 定义函数指针
    //(*pf)示意变量 pf 是一个指针,(int, int)示意函数的参数类型,int 示意函数的返回值
}

函数指针的应用

int (*pf)(int, int) = add;  // 定义函数指针
int ret = (*pf)(2,3);
//(2,3)示意传递的参数,(*pf)解援用函数,调用函数,留神这个括号不能省略。int ret = pf(2,3);  //pf 其实就相当于 add。

简单函数指针类型解读

(*(void(*)())0)();
// 首先最内层:(*)示意它是一个指针
// 其次:void(*)() 这是一个定义函数指针的变量类型,返回值为 void,无传参。//(void(*)())0  变量类型被放在括号中,示意强制类型转换,将 0 转化为函数指针,这示意 0 地址处寄存的是一个函数地址
//*(void(*)())0  解援用这个函数指针,调用函数
//(*(void(*)())0)() 最初的括号示意函数传参。// 这句程序的作用是:调用 0 地址处的函数
void (*add(int,void(*)(int)))(int);
// 首先最内层:void(*)(int) 示意一个函数指针类型
// 其次:add(int,void(*)(int));add 示意函数名,(int,void(*)(int))示意这个函数的参数
// 当去掉 add(int,void(*)(int))之后,只剩下 void (*)(int),而 void (*)(int)就是函数的返回类型
// 所以这句程序的意思:定义一个函数,函数名为 add,传参为 (int,void(*)(int)),返回值为 void (*)(int) 型
// 其实就相当于:void (*)(int)  add(int,void(*)(int)) 
// 然而留神下面这个写法是错的,只是能够这样了解上述程序。// 能够应用另外一种办法实现上述程序
typedef void(*pf_t)(int) ; // 重定义类型,将 void(*)(int)类型用 pf_t 代替
pf_t add(int, pf_t);      // 这句成果和上述程序雷同。

函数指针数组

int (*p[3])(int,int) = {test1,test2,test3}; // 定义函数指针数组 p[3]。int ret = p[1](3,5);   // 应用函数指针数组

指向函数指针数组的指针

int (*pf[4])(int, int);           // 函数指针数组
//pf 先与 [4] 联合示意它是一个数组
int (*(*p)[4])(int, int) = &pf;   // 指向函数指针数组的指针
// p 先与 * 号联合,示意它是一个指针
int ret = (*p)[1](3,4);           // 指向函数指针数组的指针的应用
//(*p)先解援用失去函数指针数组,(*p)就相当于 pf,[1]示意应用第哪个函数,(3,4)示意传参。

C 库排序函数 qsort()

  • 它不仅只能排序数组,还能够排序构造体等
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
//base -- 指向要排序的数组的第一个元素的指针。//nitems -- 要排序数组中元素的个数.
//size -- 数组中每个元素的大小,以字节为单位
//compar -- 用来比拟两个元素的函数,这个函数须要程序员本人依据理论状况写
//compar 函数只须要比拟第一个参数和第二个参数的大小并返回即可
// 返回值为正,则示意正序排列
// 返回值为负,则示意反序排列
// 返回值为 0,示意不排序
  • 示例:
  • 输入后果:15 20 24
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
struct Stu
{char name[10];
    int age;
    double score;
};

int compar(const void* e1, const void* e2)
{return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}

void main()
{struct Stu arr[3] = {{"zhangsan",20,55.5},{"lishi",24,57.0},{"wangwu",15,34.2} };
    int sz = sizeof(arr) / sizeof(arr[0]);  // 计算要排序数组中元素的个数
    qsort(arr, sz, sizeof(arr[0]), compar);
    for (int i = 0; i < 3; i++)
    {printf("%d\n", arr[i].age);
    }
}
正文完
 0