函数指针
指向函数的指针包含了函数的地址,可以通过它来调用函数,函数指针与指针函数的最大区别是函数指针的函数名是一个指针
格式:类型说明符 (*函数名)(参数)
void (*sum)();
实例:求两个数中较大值,较小值
int max (int a, int b){
return a>b ? a:b;
}
int min (int a, int b){
return a<b ? a:b;
}
int (*f)(int, int); // 声明函数指针,指向返回值类型为int,有两个参数类型都是int的函数
void main(){
f = max; // 函数指针f指向求较大值的函数max
int c = (*f)(1, 2);
printf("较大值 %d \n", c);
f = min;
int d = (*f)(1, 2);
printf("较小值 %d \n", d);
getchar();
}
指针函数
当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用的函数,以用于需要的指针火灾地址的表达式。
格式:类型说明符* 函数名(参数)
int *sum(); int * add(int,int);
实例:
int * add(int a,int b);
void main(){
int *p1 = NULL;
printf("address of p1 = %#x \n", p1);
p1 = f(1, 2);
printf("address of p1 = %#x \n", p1);
printf(" *p1 = %d\n", *p1);
}
/*
* 指针函数的定义
* 返回值是指针类型int *
*/
int *add(int a, int b) {
int *p = (int *)malloc(sizeof(int));
printf("address of p = 0x%x \n", p);
memset(p, 0, sizeof(int));
*p = a + b;
printf("*p = %d \n", *p);
return p;
}
//运行结果:
address of p1 = 0x0
*p = 3
address of p = 0x2d3b08
address of p1 = 0x2d3b08
*p1 = 3
运行结果可以看出,指针函数add的返回值p和add赋值给的指针p1的地址是相同的,都是指向指针函数内部申请的内存地址0x2d3b08。
实例:随机生成一个数组,写出一个函数查询最小值,并且返回最小值的地址,在main函数中打印出来。
int * min(int arr[],int len){
int i =0;
int *p = arr;
for(;p<len;p++){
if(arr[i]<*p){
p= &arr[i];
}
}
}
void main(){
int arr[10];
int i =0;
//设置随机种子,srand初始化随机数发生器,用时间作为种子
srand(unsigned)time(NULL));
for(;i<10;i++){
//100范围内
arr[i] = rand()%100;
printf("arr[i]=%d\n",arr[i]);
}
int *p = min(arr,sizeof(arr)/sizeof(int));
printf("p=%#x,*p = %d",p,*p);
getchar();
}