函数指针使用案例(回调函数)
-
代码:
#include <stdio.h>
void A(){
printf("Hello");
}
void B(void (*ptr)())//B函数有一个函数指针作为它的参数
{ //ptr指向一个函数,这个函数应该是不带参数的而且返回void,就像A那样
ptr();//使用函数指针ptr调用它所指向的函数
}
int main(){
void (*p)() = A;//把p初始化为A的地址
B(p);//d调用B,向它传入指针p
}
输出结果:
Hello
-
写成这样同样可以,因为函数的名字返回的就是指针(函数名就是地址)
int main(){
B(A);
}
一个函数的引用传给另一个函数的时候,那个函数就被称作回调函数,所以,A在这里就是一个回调函数。函数B可以通过函数指针来回调它
-
想以升序排列数组
#include <stdio.h>
void BubbleSort(int *A,int n){
int i,j,temp;
for(i=0;i<n;i++){
for(j=0;j<n-1;j++){
if(A[j] > A[j+1]){
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
}
}
} //用了冒泡法 ,在冒泡排序中进行多轮比较
int main(){
int i;
int A[] = {3,2,1,5,6,4};
BubbleSort(A,6);
for(i=0;i<6;i++){
printf("%d ",A[i]);
}
}
输出结果:
1 2 3 4 5 6
-
想用降序排列:只用把大于改成小于
if(A[j] < A[j+1]){
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
-
我们可以多传一个参数给排列函数,告诉它我想要升序还是降序,我们可以有一个标志,比如标志是1的时候我们升序排列,为0时降序,这样可以避免很多冗余的代码
#include <stdio.h>
int compare(int a,int b){
if(a > b){
return 1;
}else return -1;
}
void BubbleSort(int *A,int n,int (*compare)(int,int)){
int i,j,temp;
for(i=0;i<n;i++){
for(j=0;j<n-1;j++){
if(compare(A[j],A[j+1]) > 0){
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
}
}
} //用了冒泡法 ,在冒泡排序中进行多轮比较
int main(){
int i;
int A[] = {3,2,1,5,6,4};
BubbleSort(A,6,compare);
for(i=0;i<6;i++){
printf("%d ",A[i]);
}
}
输出结果:
1 2 3 4 5 6
-
降序排列
int compare(int a,int b){
if(a > b){
return -1;
}else return 1;
}
-
按照绝对值大小排序
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int absolute_compare(int a,int b){
if(abs(a) > abs(b)){
return 1;
}else return -1;
}
void BubbleSort(int *A,int n,int (*compare)(int,int)){
int i,j,temp;
for(i=0;i<n;i++){
for(j=0;j<n-1;j++){
if(compare(A[j],A[j+1]) > 0){
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
}
}
} //用了冒泡法 ,在冒泡排序中进行多轮比较
int main(){
int i;
int A[] = {-3,2,1,-5,6,4};
BubbleSort(A,6,absolute_compare);
for(i=0;i<6;i++){
printf("%d ",A[i]);
}
}
输出结果:
1 2 -3 4 -5 6
-
这样做的目的是可以实现多种要求的排序,比如按绝对值大小排序
#include <math.h>
#include <stdlib.h>
int compare(const void* a, const void* b){//比较函数
int A = *((int*)a); //把它转换成整型指针 然后用*来解引用
int B = *((int*)b);
return abs(A) - abs(B);
}
int main(){
int i;
int A[] = {-3,2,1,-5,6,4};
qsort(A,6,sizeof(int),compare);
for(i=0;i<6;i++){
printf("%d ",A[i]);
}
}
输出结果:
1 2 -3 4 -5 6
在比较函数中,待比较的元素是通过引用来传的,他们的地址通过指针来传
标签:compare,DAY8,temp,int,void,include,函数 From: https://www.cnblogs.com/ninnne/p/17591126.html