C语言基础学习——第8天(函数指针)

来源:互联网 发布:js判断map是否包含key 编辑:程序博客网 时间:2024/05/16 18:15

00function_pointer.c

#include <stdio.h>int add(int l, int r){    return l + r;}int sub(int l, int r){    return l - r;}int main(void){    // 定义了一个函数指针变量.    // pfunc 是 int (*)(int, int) 类型.    // pfunc 指向 int ()(int, int) 类型.    int (*pfunc)(int, int) = NULL;    int a = 15, b = 6;    int ret;    // 函数名字代表函数地址.    // 第一种赋值和调用方式    pfunc = add;    ret = pfunc(a, b);    printf("ret = %d\n", ret);    printf("----------------\n");    // 第二种赋值和调用方式    pfunc = &sub;    ret = (*pfunc)(a, b);    printf("ret = %d\n", ret);    return 0;}运行结果:ret = 21----------------ret = 9

01main.c

#include <stdio.h>int main(void){    int (*pfunc)(void) = NULL;    void *p = NULL;    pfunc = main;    p = main;    // 打印出main函数的地址, main 与 &main 的值是一样的    printf("pfunc = %p, main = %p, &main = %p\n", pfunc, main, &main);    printf("p     = %p, main = %p, &main = %p\n", p, main, &main);    return 0;}运行结果:pfunc = 0x80483e4, main = 0x80483e4, &main = 0x80483e4p     = 0x80483e4, main = 0x80483e4, &main = 0x80483e4

02callback.c

#include <stdio.h>int add(int l, int r){    return l + r;}int operation(int (*pf)(int, int), int l, int r){    return pf(l, r);}int main(void){    int a = 15, b = 6;    int ret = 0;(2)    // 回调函数(callback function) add即为回调函数.    // (1)定义一个回调函数 --> add函数已经定义好    // (2)提供函数实现的一方在初始化的时候, 将回调函数的函数指针注册给调用者 --> pf拿到了add的地址    // (3)当特定的事件或条件发生的时候, 调用者使用函数指针调用回调函数对事件进行处理 --> pf(l, r)即相当于执行了add    ret = operation(add, a, b);    printf("ret = %d\n", ret);    return 0;}

03typedef.c

#include <stdio.h>// #define 是预处理器指令.// #define 通常做字符串替换.#define INT32 int// typedef 是编译器关键字.// typedef 做类型替换.typedef int int32;// func_t 是函数类型, 代表 int ()(int, int)typedef int (func_t)(int, int);// pfunc_t 是函数指针类型, 代表 int (*)(int, int)typedef int (*pfunc_t)(int, int);int add(int l, int r){    return l + r;}int sub(int l, int r){    return l - r;}int main(void){    INT32 a = 15, b = 6;    int32 ret = 0;    // func_t *pf = NULL;    pfunc_t pf = NULL; // 此种比较常用    pf = add;    ret = pf(a, b);    printf("ret = %d\n", ret);    pf = sub;    ret = pf(a, b);    printf("ret = %d\n", ret);    return 0;}运行结果:ret = 21ret = 9

04return_function_pointer.c

#include <stdio.h>typedef int (*pfunc_t)(int, int);int add(int l, int r){    return l + r;}int sub(int l, int r){    return l - r;}// choice_func 以 int choice 作为函数参数,// 返回 int (*)(int, int) 类型的函数指针.// int (*choice_func(int choice))(int, int)pfunc_t choice_func(int choice){    if (choice == 0)        return add;    else        return sub;}int main(void){    int a = 15, b = 6;    int ret = 0;    ret = choice_func(0)(a, b);    printf("ret = %d\n", ret);    ret = choice_func(1)(a, b);    printf("ret = %d\n", ret);    return 0;}

05const_pointer.c

#include <stdio.h>int main(void){    int a = 0x55;    // const int *p = NULL;    // p 本身可修改, 不能通过 p 修改 *p;    int const *p = NULL;    p = &a;    // *p = 0x66; error: assignment of read-only location '*p'    a = 0x66;    printf("a = %#x, *p  = %#x\n", a, *p);    printf("------------------------\n");    // p 本身不可修改(必须初始化)    int * const p1 = &a;    // p1 = &a; // error: assignment of read-only variable 'p1'    *p1 = 0x33;    printf("a = %#x, *p1 = %#x\n", a, *p1);    return 0;}运行结果:a = 0x66, *p  = 0x66------------------------a = 0x33, *p1 = 0x33
0 0