指针知识梳理7- 函数指针
来源:互联网 发布:浙江省网络监管服务网 编辑:程序博客网 时间:2024/06/06 07:10
一、函数的地址
前面讲 程序运行起来以后,在内存中有代码区,程序执行每一条指令,是从内存中读出来这条指令,然后再执行。所谓函数的地址是指函数的入口地址,这个函数的从这个地址开始进入执行,也就是从这个地址处取指令执行。
那么在代码层面,函数的地址用 函数指针变量 来存储。
二、基本使用
1、函数指针定义
函数指针的定义,在语法看起来稍微有点怪,只需要记住形式返回值 (*指针变量名)(形参类型);
比如,以下4个函数
void func1(void){}int func2(void){}int func3(int a){}int func4(int a,int b){}int func5(int a,int b){}
可以定义如下指针变量来记录其地址,注意指针变量的类型一定要跟函数匹配。
void (*p1)(void);int (*p2)(void);int (*p3)(int);int (*p4)(int,int);
2、取函数的地址
函数的地址有两种方法获得 &函数名 或者 直接函数名,两种方式等效。
p1 = &func1;p2 = &func2;p3 = &func3;p4 = &func4; //以下等效于上面p1 = func1;p2 = func2;p3 = func3;p4 = func4;
3、通过指针调用函数
通过指针变量去调用函数,也有两种方式,有* 和没 *都可以。(1)跟函数调用方式一样,把函数名换成 变量名。
p1();p2();p3(1);p4(1,2);
(2)跟函数调用方式一样,把函数名换成 (*变量名)。
(*p1)();(*p2)();(*p3)(1);(*p4)(1,2);
测试如下代码:
#include <stdio.h>void func1(void){printf("this is func1\n");}void func2(void){printf("this is func2\n");}int add(int a,int b){printf("this is add\n");return a+b;}int sub(int a,int b){printf("this is sub\n");return a-b;}int main(){void (*p1)(void);int (*p2)(int,int);int ret = 0;p1 = func1;p1();(*p1)();p1 = &func2;p1();(*p1)();p2 = add;ret = p2(1,2);printf("ret = %d\n",ret);ret = (*p2)(1,2);printf("ret = %d\n",ret);p2 = ⊂ret = p2(1,2);printf("ret = %d\n",ret);ret = (*p2)(1,2);printf("ret = %d\n",ret);return 0;}
四、typedef 与函数指针
在以上代码中,函数指针的定义的写法是比较麻烦的,通常我们用typedef 为这种类型取别名。typedef void (*type1)(void);typedef int (*typ2)(void);typedef int (*type3)(int);typedef int (*type4)(int,int);void (*p1)(void);int (*p2)(void);int (*p3)(int);int (*p4)(int,int);
比较以上两种写法,基本上一样,当有typedef的时候是在定义新的类型。
type1 type2 type3 type4 是类型。
p1,p2,p3,p4 是变量。
type1 p1; //等效于 void (*p1)(void);type2 p2; //等效于 int (*p1)(void);type3 p3; //等效于 int (*p3)(int);type4 p4; //等效于 int (*p4)(int,int);
1 0
- 指针知识梳理7- 函数指针
- 指针知识梳理8- 指针的指针
- 函数指针语法梳理
- 函数指针语法梳理
- 指针知识梳理3-指针作为参数
- 指针知识梳理6-const与指针
- 指针知识梳理9-指针数组
- 指针知识梳理2-指针与一维数组
- 指针知识梳理5-字符串与指针,程序内存总结
- 指针知识梳理10-指向数组的指针
- 函数指针相关知识
- 函数指针,数组指针等知识总结
- 指针知识梳理1-变量基本定义及使用
- 指针知识梳理4-堆内存的使用
- C++智能指针梳理
- C++智能指针梳理
- 数组指针语法梳理
- 指针问题梳理
- Cocos2d-x 3.0 使用TinyXml 解析XML文件
- How Tomcat works之第九章 会话管理
- NoSQL中的行存储与列存储
- UVaOJ 10878 - Decode the tape
- C# 基于密码的身份验证报错问题System.Net.NetworkCredential
- 指针知识梳理7- 函数指针
- Django自定义过滤器filter
- Leetcode: Scramble String
- In,内链接和空值
- OpenOffice 编译日志
- c 语言编译器 (32bit测试)对整数类型long long截断
- C语言结构体定义
- 【学习笔记】自定义广播
- 图书馆理系统数据设计范列