C语言指针系列四——指针与函数

素颜马尾好姑娘i 2022-08-07 01:52 334阅读 0赞

C语言指针系列四——指针与函数

之前说指针是变量的地址,不得不承认,这也是一种习惯上的说法——因为它不够全面,但不能说这种说法是错的,因为还有一种特殊的指针——函数指针。

函数也是存在于内存中的,函数指针指向的是函数在内存中的首(开始)地址。首先来了解一下怎么使用函数指针:

  1. #include<stdio.h>
  2. double Integrate(double (*f)(double), double a, doubleb)
  3. {
  4. //这个函数用于对任意f函数计算[a,b]上的积分
  5. //f是一个指向函数的指针
  6. printf_s("调用%s:\n", __FUNCTION__);
  7. (*f)(a);//按照指针的标准语法,f是一个指针,因此要使用*号解除引用——得到原始的内容(函数)
  8. (*f)(b);
  9. return 0;
  10. }
  11. double tsin(double t)
  12. {
  13. printf_s("计算了tsin函数-%lf__",t);
  14. return 0;
  15. }
  16. double tcos(double t)
  17. {
  18. printf_s("计算了tcos函数-%lf__", t);
  19. return 0;
  20. }
  21. int main()
  22. {
  23. Integrate(tsin,3, 4);//调用Integrate函数
  24. printf_s("\n");
  25. Integrate(tcos,5, 6);
  26. return 0;
  27. }

在Integrate函数的参数列表中,double (*f)(double)是声明一个传入函数的指针,这个传入的函数指针必须指向一个这样的函数——它有只有一个double型的形式参数,并且这个函数必须返回一个double。只有满足这个条件的函数指针传给Integrate函数做参数才是合法。在函数体中,困为f是一个函数指针,所以对f进行解引用后再使用—>(*f)(a)。但这不是必须的,直接使用f(a)也是合法的。甚至在函数声明的参数列表中,直接声明double f(double)也是合法的,因为编译器知道你要做什么,如:

  1. double Integrate(double f(double), double a, double b)
  2. {
  3. //这个函数用于对任意f函数计算[a,b]上的积分
  4. //f是一个指向函数的指针
  5. printf_s("调用%s:\n", __FUNCTION__);
  6. (*f)(a);//按照指针的标准语法,f是一个指针,因此要使用*号解除引用——得到原始的内容(函数)
  7. f(b);
  8. return 0;
  9. }

输出如下:

Center

调用时,直接将函数名当做函数指针传给函数即可,如:

  1. Integrate(tsin, 3, 4);//调用Integrate函数

但传入的函数的声明必须和Integrate函数的参数列表中函数指针的声明拥有相同的函数签名。

常见的使用函数指针作为参数的函数是排序函数qsort函数,它原型在头文件中。原型为:

  1. qsort(void *base,size_t nmemb,size_t size,int (*compare)(constvoid *p,const void *q));

base是指向数组第一个元素的指针,通常使用数组名作为函数实际参数传入。因为是void*类型的指针,它可以隐式转换成任一类型的指针;nmemb是要对数组进行排序的元素的个数,它可以小于数组的长度;size是数组的元素所占的字节数;最后一个是比较大小的函数,这个函数告诉qsort函数p和q两个数那个更大。这样就可以对数组进行从大到小或者从小到大进行排序了,代码如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. //比较函数1
  4. int comparestd1(const void *p, const void *q)
  5. {
  6. return*(int*)p - (*(int*)q);//从小到大排序
  7. }
  8. //比较函数2
  9. int comparestd2(const void *p, const void *q)
  10. {
  11. return-(*(int*)p - (*(int*)q));//从大到小排序
  12. }
  13. int main()
  14. {
  15. int arr[]= { 5, 8, 7, 41, 24, 84, 5, };
  16. for (int i= 0; i < 7; i++)
  17. {
  18. printf_s("%d,",arr[i]);
  19. }
  20. printf_s("\n");
  21. qsort(arr,7, sizeof(arr[0]), comparestd1);//排序
  22. for (int i= 0; i < 7; i++)
  23. {
  24. printf_s("%d,",arr[i]);
  25. }
  26. printf_s("\n");
  27. qsort(arr,7, sizeof(arr[0]), comparestd2);//排序
  28. for (int i= 0; i < 7; i++)
  29. {
  30. printf_s("%d,", arr[i]);
  31. }
  32. return 0;
  33. }

输出如下:

Center 1

发表评论

表情:
评论列表 (有 0 条评论,334人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C语言-函数指针

    函数指针 函数指针是指向函数的指针变量。 函数指针本身首先应该是指针变量,只不过该指针变量指向函数。 > C在编译的时,每一个函数都有一个入口地址,该入口地址就是函

    相关 C语言 指针函数参数

    指针参数         指针参数:指针参数使得被调用的函数能够访问和修改主调函数中对象的值。 由于C语言是以传值的方式将参数的值传递给被调用函数,因此,被调用函数不能