[JNI] 开发基础(4)函数指针及指针函数

函数指针

指向函数的指针包含了函数的地址,可以通过它来调用函数,函数指针与指针函数的最大区别是函数指针的函数名是一个指针

格式:类型说明符 (*函数名)(参数)

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();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值