C - 函数指针+多级指针
- C语言--备忘
- 一、C 函数指针
- 1. 声明:
- 2. 定义初始化:
- 3. 回调:
- 4. 应用举例:
- 二、C 多级指针【一般字符串使用】
- 1. 为什么需要二级指针?
- 2. 二级指针和字符串数组
- 总结:
一、C 函数指针 1. 声明:
// 形式一:对函数指针取别名叫做 pfunc_t typedef int (*pfunc_t) (int a,int b); // 形式二:函数指针 pfunc 就是一种数据类型 int (*pfunc) (int a,int b);2. 定义初始化:
// 定义:pfunc就是一个函数指针变量,将来保存函数的地址 pfunc_t pfunc; // 初始化:初始化函数指针变量,指向add函数 pfunc_t pfunc=add;3. 回调:
- 回调函数:一个函数可以当成一个参数传递给其他函数 ,这个函数的 参数 必须是函数指针,但是函数的参数必须是函数指针来保存回调函数的地址(add);
typedef int (*pfunc_t)(int a,int b);//pfunc_t就是函数指针
int add(int a, int b){return a+b;}
int sub(int a, int b){return a-b;}
int mul(int a, int b){return a*b;}
int div(int a, int b){return a/b;}
int main(void)
{
pfunc_t func_all[]={add,sub,mul,div,NULL};//函数指针数组
for(pfunc_t *func_start=func_all;*func_start;func_start++)//函数指针数组指针
{
int ret=(*func_start)(100,200);//函数名
}
return 0;
}
4. 应用举例:
typedef int (*pfunc_t)(int a,int b);//pfunc_t就是函数指针
int add(int a, int b)
{
return a+b;
}
//定义调用函数,pfunc_t 为函数指针,请输入函数首地址
int cal(int a,int b,pfunc_t pfunc)
{
return pfunc(a,b);//调用pfunc函数
}
int main(void)
{
int ret=0;
pfunc_t pfunc=NULL; // 声明指针并清空
pfunc=add; // 指针直接指向函数
ret= pfunc(100,200); // 取代 add 函数名称
ret=cal(100,200,add);//回调函数
printf("a+b=%dn",ret);
return 0;
}
二、C 多级指针【一般字符串使用】
定义:指向一级指针的指针,也就是存放一级指针变量的地址;
int a=250;
int *p=&a;
int **pp=&p;
printf("p的地址是%p,a的地址是%p,a的值是%d",pp,*pp,**pp);
1. 为什么需要二级指针?
如下:无法交换,因为实参和形参平行;
#include//做不到交换,原理如下如,mai声明指针,函数体也为指针时,两者内存空间不同,类似与 main中int,形参int void swap(char *p1,char *p2) //指针形参,重新在内存申请 区域 { char *p3=p1; p1=p2; p2=p3; printf("swap:%s %sn",p1,p2); }//此函数实现了第二层指针的复制 int main(void) { char *pa="hello"; char *pb="world";// swap(pa,pb); //若pa、pa与p1、p2并行,都为指针,p1和p2为pa、pb的复制品,无法实现真正的交换 printf("%s %sn",pa,pb); return 0; }
原理图:
如下:可以交换,因为实参和形参平行;
#include2. 二级指针和字符串数组//可以做到交换,原理如下如,main声明指针,函数体为指针的指针,可完成指针修改 void swap(char **p1,char **p2) //第三层,可直接操作第二层 { char *p3=*p1; *p1=*p2;//修改pa指针的值 *p2=p3;//修改pb指针的值 printf("swap:%s %sn",p1,p2); }//此函数实现了第二层指针互换 int main(void) { char *pa="hello"; char *pb="world";// swap(&pa,&pb); //若p1、p2为pa、pb的下层 printf("%s %sn",pa,pb); return 0; }
char *p[]={"hello","world"}; //p[0]为"hello"的首地址
//或者
char *p1="hello";
char *p2="world";
char *p[]={p1,p2};
printf("%s%s%s%sn",p[0],*(pp+0),pp[0]); //字符串较为特殊,打印字符串1的首地址 相当于 打印字符串
printf("%c%c%c%cn",*(*(pp)+0),*(*(pp)+1),*(*(pp)+2)); //打印字符'h' 'e' 'l'
//若a[]="hello",p1=a,操作 字符串数组 指针(*(pp+0)+1),可修改字符
printf("%c%c%cn",*(pp[0]+0),*(pp[1]+1),*(pp[2]+1));
总结:
- 本节主要总结函数指针和二级指针常见用法,C备忘;



