在大家刚开始学习c语言的时候,总是分不清函数指针和指针函数,就算是知道了它们之间的区别,也不了解它们的使用场景,
我写此博客帮大家缕一缕,也帮我自己缕一缕
1、函数指针与指针函数的概念以及区别
指针函数
从名字上可以看出,首先它是一个函数,指针指的是返回值为指针
函数指针
从名字上可以看出,首先他是一个指针,并且是指向函数的指针
2、函数指针与指针函数的区别
①概念上的区别:函数指针值得是指向函数的指针,指针函数指的是返回值为至真的函数。
②功能上的区别:指针函数用来编写返回值为指针的函数,而函数指针可以实现c语言的泛型编程(下面会有例子)
3、函数指针的定义
定义一个求和函数:
/*求和函数*/
int sum(int a,int b)
{return a+b;
}int (*p)(int a,int b) = sum;/*将指向函数的指针赋给p*/
int (*p)(int a,int b) = ∑/*这两种种定义的方法都可以定义一个函数指针*/int c = p(5.6);
intc = *p(5,6);/*两种方法都可以通过指针调用函数*/
4、函数指针和指针函数的应用实例
①先说说指针函数的应用(这个是很简单的)
#include <stdio.h>int* sum(int a, int b)//返回一个指针
{static int c = a + b;return &c;
}
int main()
{int m,n;scanf("%d%d",&m,&n);int c = *sum(m,n);printf("%d",c);
}
②指针函数的应用(泛型编程)/*重点*/
在c语言里函数是不能够同名的,在以前看来,一个函数只能干对应一件事,比如说写一个由小到大
排序的函数,那么这个函数就只能实现由小到大的排序,要想从大到小排序就得重写一个函数,现在
有了函数指针,我们就可以把指针到一个参数参数传进去,就可以用一个函数实现一个两种排序啦,
代码如下:
#include <stdio.h>void swap(int *a,int *b)
{int temp = *a;*a = *b;*b = temp;
}int sort_large_to_small(int a,int b){if(a < b){return 1;}return 0;}int sort_small_to_large(int a, int b){if(a > b){return 1;}return 0;}void sort(int n, int* arr, int (*p)(int a,int b))
{for(int i = 0;i < n;i++){for(int j = 0;j < n-i-1;j++){if(p(arr[j],arr[j+1])){swap(&arr[j],&arr[j+1]); }}}
}int main()
{int arr[] = {12,23,65,45,23,34,100,89,90};int n = sizeof(arr)/sizeof(arr[0]);sort(n,arr,sort_small_to_large);printf("由小到大排:");for(int i = 0;i < n;i++){printf("%d ",arr[i]);}printf("\n");sort(n,arr,sort_large_to_small);printf("由大到小排:");for(i = 0;i < n;i++){printf("%d ",arr[i]);}printf("\n");return 0;
}
输出如下:
从代码中可以观察到,我们只是写了一个函数,在冒泡比较的时候控制他们的顺序,
通过函数指针传进去,这样就可以一个函数即可以由小到大排序,也可以由大到小
排序了。这就达到了一定程度上的泛型编程。
以上即是函数指针和指针函数的内容,若读者发现错误,欢迎纠错