20、用来记录普通变量的地址的指针叫做一级指针
21、二级指针可以记录一级指针的地址
22、声明二级指针是需要在指针变量前加**
23、二级指针变量名称前加**可以表示捆绑的普通存储区
24、二级指针变量名称前加*可以表示捆绑的一级指针存储区
25、二级指针可以代表数组但不能代表二维数组
26、无类型指针有可能记录一级指针的地址,这个时候需要强制转换为二级指针后使用
27、二级指针通常作为形式参数使用,使用二级指针形参可以让被掉函数想调用函数传递一个地址数据
28、C语言里函数也是地址
29、函数名称可以用来表示函数的地址
30、函数指针用来记录函数的地址
31、函数指针也需要先声明后使用
32、函数指针的声明可以根据函数声明的变化得到
int (*p_func)(int,int) = NULL;//函数指针声明
33、函数指针也分类型,不同格式的函数适合与不同类型的函数指针捆绑
34、函数指针可以用来调用函数.
printf(“结果是:%d\n”,p_func(4,7));//函数指针的调用,跟调用函数一样
35、函数指针可以作为形参使用的
36、会作为实际参数使用的函数叫回调函数
14 //实现显示
15 void print_cb(int *p_num) {
16 printf("%d ", *p_num);
17 }
18 //实现循环
19 void for_each(int *p_num, int size, void (*p_func)(int*)) {
20 int num = 0;
21 for(num = 0; num <= size - 1; num++) {
22 p_func(p_num + num);
23 }
24 }
29 int main() {
30 int arr[] = {1, 2, 3, 4, 5};
33 for_each(arr, 5, print_cb);//使两个函数链接
34 printf("\n");
35 return 0;
36 }
函数指针练习:
/*
* 函数指针
*
* */
#include <stdio.h>
int add (int num, int num1) {
return num + num1;
}
int main() {
int (*p_func)(int,int) = NULL;//函数指针声明
p_func = add; //将函数赋值给函数指针
printf("add是:%p\n", add);
printf("结果是:%d\n",p_func(4,7));//函数指针的调用,跟调用函数一样`
return 0;
}
回调函数练习1:
/*
* 回调函数
* */
#include <stdio.h>
/*
void print(int *p_num, int size) {
int num = 0;
for(num = 0; num <= size - 1; num++) {
printf("%d ", *(p_num + num));
}
printf("\n");
}
*/
//实现显示
void print_cb(int *p_num) {
printf("%d ", *p_num);
}
//实现循环
void for_each(int *p_num, int size, void (*p_func)(int*)) {
int num = 0;
for(num = 0; num <= size - 1; num++) {
p_func(p_num + num);
}
}
//实现相反数
void opposite(int *p_num) {
*p_num = 0 - *p_num;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
// print(arr, 5);
for_each(arr, 5, opposite);
for_each(arr, 5, print_cb);//使两个函数链接
printf("\n");
return 0;
}
回调函数练习2:
/*
*编写函数从两个圆里找到较大的并传回调用函数
* 函数没有返回值
* */
#include <stdio.h>
#define PI 3.14f
typedef struct {
int row;
int col;
} pt;
typedef struct {
pt center;
int radius;
} circle;
void larger(const circle *p_cl1, const circle *p_cl2, circle **pp_cl) {
*pp_cl =(circle*) (p_cl1-> radius > p_cl2->radius ? p_cl1 : p_cl2);
}
int main() {
circle cl1 = {0}, cl2 = {0}, *p_cl = NULL;
printf("请输入第一个圆的半径:\n");
scanf("%d%d%d", &(cl1.center.row), &(cl1.center.col), &(cl1.radius));
printf("请输入第二个圆的半径:\n");
scanf("%d%d%d", &(cl2.center.row), &(cl2.center.col), &(cl2.radius));
larger(&cl1, &cl2, &p_cl);
printf("(%d,%d)%d\n",p_cl->center.row, p_cl->center.col, p_cl->radius);
return 0;
}
二级指针演示:
/*
*二级指针演示
* */
#include <stdio.h>
int main() {
int num = 0;
int *p_num = #
int **pp_num = &p_num; //二级指针的定义和初始化
**pp_num = 10;
printf("num的值是:%d\n", num);
*pp_num = NULL;
printf("p_num是%p\n",p_num);
return 0;
}
二级指针练习:
/*
* 编写函数使主函数的地址成空地址
* 二级指针
* */
#include <stdio.h>
void set_null(int **pp_num) {//定义一个二级指针形式参数
*pp_num = NULL; // 使主函数成空指针
}
int main() {
int num = 0;
int *p_num = #
set_null(&p_num);
printf("p_num的地址是:%p\n", p_num);
return 0;
}