C-函数指针

1. 定义

c语言中的的函数在汇编之后会变成一个个代码段,函数的名称实际上是指代了代码段的开头内存地址,所以函数名本身就是函数指针,我们现在想定义一个函数指针变量来指向函数,从而调用函数,也就是在线程中来开辟不同的线程

2. 使用

2.1 定义函数指针变量,变量名是function

void (*function)(void *args, int a);

组成:这就是在定义一个函数指针变量,变量名是function,变量的属性是,该指针指向一个返回值是void,形参是void* 和int的函数

注:我们定义的函数指针不可以指向返回值不同,形参不同的函数(不可以进行赋值,必须赋值一个形参类型和返回值都相同的函数)

2.2 使用变量,指向函数

function = func;

此时,我们事先声明了函数func,直接进行赋值

2.3 通过函数指针直接调用函数

(*function)(args, a);

此时我们就通过函数指针变量调用了函数

3. 函数

我们定义了函数func,我们在使用该函数的时候使用

func(args, a);

的形式;同时我们还可以使用:

(*func)(args, a);

可见,函数名就是函数指针

4. 将函数指针作为函数的形参进行传递

//定义函数 
void function2(char *string) { 
    printf("function2:%s\n", string); 
} 
int function4(void (*function)(char *), char *argv) { 
    (*function)(argv); 
return 0; 
} 
//调用 
int main(void) { 
    int (*f4)(void (*)(char *), char *); 
    //等同于:int (*f4)(void (*function)(char *argv), char *argv) 
    f4 = function4; 
    (*f4)(function2, "hey"); 
    return 0; 
}

可见在我们定义函数的时候,如果我们的形参名是不用的情况下,是可以不写出来的,指定类型即可;同时在定义函数指针变量的时候,我们使用了int (*f4)(void (*)(char*), char *)这种不加变量名只指定类型的形式是可用的

5.实践

#include <stdio.h>                                        
                                                          
void function1(void) {                                    
    printf("function:1\n");                               
}                                                         
                                                          
void function2(char *string) {                            
    printf("function2:%s\n", string);                     
}                                                         
                                                          
int function3(void) {                                     
    printf("function3:\n");                               
    return 0;                                             
}                                                         
                                                          
int function4(void (*function)(char *), char *argv) {   
    (*function)(argv);                                    
    return 0;                                             
}                                                         
                                                          
int main(void) {                                          
    void (*f1)(void);                                     
    void (*f2)(char *string);                             
    int  (*f3)(void);                                     
    int  (*f4)(void (*function)(char *argv), char *argv);                                                                                                                
                                                          
    f1 = function1;                                       
    f2 = function2;                                       
    f3 = function3;                                       
    f4 = function4;                                       
                                                          
    (*f1)();                                              
    (*f2)("nihao");
    printf("%d\n", (*f3)());
    (*function1)();
    function1();
    (*f4)(function2, "hey");
    return 0;
}

  编译执行:

root@ubuntu:~/new_step/test/c/lang# gcc -o point_func_test point_func_test.c -Wall
root@ubuntu:~/new_step/test/c/lang# ./point_func_test 
function:1
function2:nihao
function3:
0
function:1
function:1
function2:hey

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值