C语言深度解剖——读书笔记-11、指针和数组
来源:互联网 发布:it has =it's 编辑:程序博客网 时间:2024/06/05 14:18
4.7 函数指针
4.7.1 函数指针的定义
顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。
(a) char * (*fun1)(char *p1,char *p2);
(b) char * *fun2(char *p1, char *p2);
(c) char * fun3 (char *p1, char *p2);
看上面的表达式是什么意思?
(c) :fun3是函数名, 函数的返回值为char * 类型;
(b) :与(c)相比唯一不同就是,函数的返回值为char **类型,是个二级指针;
(a) :fun1是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针 ;
4.7.2 函数指针的使用
- #include <stdio.h>
- #include <string.h>
- char * fun(char * p1, char *p2)
- {
- int i=0;
- i=strcmp(p1,p2);
- if(0==i)
- {
- retrun p1;
- }
- else
- {
- retrun p2;
- }
- }
- int main()
- {
- char * (*pf)(char *p1,char *p2);
- pf=&fun;
- (*pf)("aa","bb");
- retrun 0;
- }
使用指针时,我么通过钥匙(“*”)来取其指向的内存里面的值,函数指针使用也如此。通过(*pf)取出存在这个地址上的函数,然后调用它。
【注意:给函数指针赋值时,可以用&fun或直接用函数名fun。这里以为函数名编译之后其实就是一个地址,所以这里两种用法没有本质的区别】
*(int *)&p ---这是什么?
void Function()
{
printf("Call Function");
}
int main()
{
void (*p)();
*(int *)&p =(int )Function;
(*p)();
retrun 0;
}
这是什么意思??*(int *)&p =(int )Function; 先看:
void (*p)(); //定义了一个指针变量p,p指向了一个函数,这个函数的参数和返回值都是void;
&p :求指针变量p本身的地址,这是一个32位的二进制常数(32位系统);
(int *)&p :表示将地址强制转换为int 类型的数据的指针;
(int )Function :表示将函数的入口地址强制转换成int类型的数据。
所以:*(int *)&p =(int )Function 表示将函数Function 的入口地址复制给指针变量p
(*p)() :表示对函数Function的调用 ;
其实,函数指针和普通指针没有什么区别,只是函数指针指向的内容为函数而已。
4.7.4 函数指针数组
现我们清楚表达式 char * (*pf)(char *p) 定义的是一个函数指针pf , 既然pf是一个指针,那就可以存储在一个数组里。把上式修改一下:
char * (*pf [3]) (char *p) ;
这是定义一个函数指针数组。它是一个数组,数组名为pf,数组内存储了3个指向函数的指针。这些指针指向一些返回值类型为指向字符的指针,参数为一个指向字符的指针的函数。
- #include <stdio.h>
- #include <string.h>
- char * fun1(char *p)
- {
- printf("%s\n",p);
- retrun p;
- }
- char * fun2(char *p)
- {
- printf("%s\n",p);
- retrun p;
- }
- char *fun3 (char *p)
- {
- printf("%s\n",p);
- retrun p;
- }
- int main()
- {
- char * (*pf[3])(char*p);
- pf[0] = fun1; //可以直接用函数名
- pf[1] = &fun2; //可以用函数名加上取地址符
- pf[2] = &fun3;
- pf[0] = ("fun1");
- pf[1] = ("fun2");
- pf[2] = ("fun3");
- retrun 0;
- }
4.7.5 函数指针数组指针
首先函数指针数组指针是一个指针,只不过这个指针指向一个数组,这个数组里面存的都是指向函数的指针。
函数指针数组指针= 函数指针数组 + 指针 即:指向数组的指针
函数指针数组 = 函数指针 + 数组 即:存放函数指针的数组
函数指针 = 函数 +指针 即:指向函数的指针
下面就定义一个简单的函数指针数组指针:
char *(*(*pf)[3])(char *p);
这里的pf是指针,
这个指针指向一个包含3个元素的数组
这个数组里面存储的是指向函数的指针;
下面举个例子:
- #include <stdio.h>
- #include <string.h>
- char *fun1(char *p)
- {
- printf("%s\n",p);
- retrun p;
- }
- char *fun2(char *p)
- {
- printf("%s\n",p);
- retrun p;
- }
- char *fun3(char *p)
- {
- printf("%s\n",p);
- retrun p;
- }
- int main()
- {
- char * (*a[3])(char *p);
- char * (*(*pf)[3])(char *p);
- pf =&a;
- a[0]= fun1;
- a[1] =&fun2;
- a[2]= &fun3;
- pf[0][0]("fun1");
- pf[0][1]("fun2");
- pf[0][2]("fun3");
- retrun 0;
- }
- C语言深度解剖——读书笔记(数组和指针)
- C语言深度解剖——读书笔记-11、指针和数组
- C语言深度解剖——读书笔记-7、指针和数组
- C语言深度解剖——读书笔记-8、指针和数组
- C语言深度解剖——读书笔记-9、指针和数组
- C语言深度解剖——读书笔记-10、指针和数组
- C语言深度解剖(精讲版)——读书笔记18 -指针数组&&数组指针
- C语言深度解剖(精讲版)——读书笔记22-函数指针
- C语言深度解剖——读书笔记-1、关键字
- C语言深度解剖——读书笔记-2、关键字
- C语言深度解剖——读书笔记-4、符号
- C语言深度解剖——读书笔记-5、预处理
- C语言深度解剖——读书笔记-6、预处理
- C语言深度解剖——读书笔记-12、内存管理
- C 语言深度解剖 读书笔记
- 《C语言深度解剖》读书笔记
- 《C语言深度解剖》读书笔记
- C语言深度解剖读书笔记
- POJ 2528 Mayor's posters 并查集+离散化做法
- 线段树成段更新及懒散标记
- 网址
- Java基础知识
- Linux进程间通信——使用匿名管道
- C语言深度解剖——读书笔记-11、指针和数组
- 凸n+2边形进行三角形分割(只连接顶点对形成n个三角形)数:
- UITableViewCell 如何获取自身高度
- objective-c遍历
- eclipse + redis + python
- can’t help doing还是can’t help to do
- linuxmint 下开启和关闭防火墙
- 指针函数与函数指针的区别
- 2097 Sky数