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 = ⊂
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 = 0x80483e4
p = 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 = 21
ret = 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