C语言基础【20】:指针7
1.指针变量作为函数的返回值
1.1目的:通过函数返回合法空间,给到函数外部使用
1.2注意:函数不要返回动态局部变量的地址,他会在函数调用之后释放掉,进而出现输出不确定
1.3所以返回地址指向的变量应当为全局区的变量,就是不能为动态全局
2.二级指针
int* p = #
int** q= &p;
q=?
*q=?
**q=?
2.1q是p的地址,int**在定义时只表示q为二级指针。
2.2*q是等同于p,也就是num的地址
2.3**q等同于*p,也就是num
注意和前面提到的变量加&,类型加* 变量加*,类型减*是不同的,这里是等式,也就是同增共减。
3.函数指针:使用指针变量存放函数入口地址
3.1函数类型由形参和返回值决定,所以我们的指针也要给定形参和返回值类型
3.2定义时复制函数定义语句,然后把函数名换成(*p)即可,和数组指针类似(记得赋值函数入口地址)
#include <stdio.h>int add(int a, int b) {return a + b;
}int subtract(int a, int b) {return a - b;
}int main() {// 定义函数指针int (*operation)(int, int);// 指向add函数operation = add;printf("5 + 3 = %d\n", operation(5, 3));// 指向subtract函数operation = subtract;printf("5 - 3 = %d\n", operation(5, 3));return 0;
}
3.3函数指针的意义:作为其他函数的参数
3.4函数指针变量+1无意义,*也无意义
3.5函数的调用实际上就是函数入口地址加(),所以也可以用函数指针加()进行调用
4.函数指针数组
4.1定义:把函数名换成(*p[])即可
4.2初始化{}内部应该放入函数入口地址,即函数名
#include <stdio.h>// 菜单系统示例
typedef void (*MenuFunction)();void option1() {printf("执行选项1\n");
}void option2() {printf("执行选项2\n");
}void option3() {printf("执行选项3\n");
}int main() {MenuFunction menu[] = {option1, option2, option3};int choice;printf("请选择(1-3, 0退出): ");scanf("%d", &choice);while (choice != 0) {if (choice >= 1 && choice <= 3) {menu[choice - 1]();}printf("请选择(1-3, 0退出): ");scanf("%d", &choice);}return 0;
}