C语言复杂的函数指针声明
复习C语言ING,发现复杂的函数指针声明看不懂,百度半天终于略知一二.
讲的比较详细的一篇blog: http://blog.csdn.net/megaboy/article/details/482771
自己归纳的一张表
当前类型 | 下一类型的意义 |
指针 * | 指针指向的类型 |
数组 [] | 数组元素类型 |
函数 () | 函数返回值类型 |
这是一张关于右左法则的表,右左法则的使用参照上面的连接.
举例(都是上面连接的...):
int (*func)(int *p);
分析: func - 右) - 左* - func是一个指针,更新当前类型为指针 - 左( - 跳出括号 - 右( - 查表得指针指向函数,func是一个函数指针,()里的为函数参数,更新当前类型为函数 - 左int - 查表得函数返回值类型为int
结论: func是一个函数指针,指向的函数有一个类型为int*的参数且返回值类型为int.
int (*func)(int *p, int (*f)(int*));
分析: func - 右) - 左* - func是指针,更新当前类型为指针 - 左( - 跳出括号 - 右( - func是函数指针,更新当前类型为函数 - 左int - 指向的函数的返回值类型为int
结论: func是一个函数指针,指向的函数返回值类型为int,有2个参数,一个类型为int*,另一个类型为函数指针,指向的函数返回值类型为int且有一个int*类型的参数.
int (*func[5])(int *p);
分析: func - 右[ - func为数组,有5个元素,更新当前类型为数组 - 右) - 左* - 数组元素为指针,更新当前类型为指针 - 左( - 跳出括号 - 右( - 数组元素为函数指针,更新当前类型为函数 - 左int - 指向的函数返回值类型为int
结论略~
下面的例子省略方向提示,更新当前类型提示,遇括号转向,跳出括号以及结论(手懒,剁
int (*(*func)[5])(int *p);
分析: func - * - func是指针 - [ - 指向有5个元素的数组 - * - 数组元素是指针 - ( - 数组元素是函数指针 - int - 指向的函数返回值类型为int
int (*(*func)(int *p))[5];
分析: func - * - func是指针 - ( - func是函数指针 - * - 指向的函数返回值类型为指针 - [ - 返回的指针指向有5个元素的数组 - int - 数组元素类型为int
int func(void) [5];
分析: func - ( - func是函数 - int - 返回值类型为int - [ - 返回值类型为有5个int元素的数组
int func[5](void);
分析: func - [ - func是数组 - ( - 数组元素是函数 - int - 函数返回值类型为int
int (*(*func)[5][6])[7][8];
分析: func - * - func是指针 - [ - func指向有5个元素的数组 - [ - 5元素数组里的每个元素是有6个元素的数组 - * - 6元素数组的每个元素为指针 - [ - 指针指向7元素数组 - [ - 7元素数组的每个元素为8元素数组 - int - 8元素数组元素为int
int (*(*(*func)(int *))[5])(int *);
分析: func - * - func是指针 - ( - func是函数指针 - * - 函数返回值为指针 - [ - 返回值指向5元素数组 - * - 5元素数组元素为指针 - ( - 指针为函数指针 - int - 函数返回值为int
int (*(*func[7][8][9])(int*))[5];
分析: func - [ - func是7元素数组 - [ - 7元素数组元素为8元素数组 - [ - 8元素数组元素为9元素数组 - * - 9元素数组元素为指针 - ( - 为函数指针 - * - 函数返回值为指针 - [ - 指针指向5元素数组 - int - 数组元素为int
int (*(*func)(int *p))[5];
分析: func - * - func是指针 - ( - 是函数指针 - * - 函数返回值为指针 - [ - 指针指向5元素数组 - int - 数组元素为int
C语言复杂的函数指针声明的更多相关文章
- Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针
Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针 1.1. java方法引用(Method References) 与c#委托与脚本语言js ...
- 函数指针玩得不熟,就不要自称为C语言高手(函数指针是解耦对象关系的最佳利器,还有signal)
记得刚开始工作时,一位高手告诉我说,longjmp和setjmp玩得不熟,就不要自称为C语言高手.当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法.后 ...
- C语言中的函数指针
C语言中的函数指针 函数指针的概念: 函数指针是一个指向位于代码段的函数代码的指针. 函数指针的使用: #include<stdio.h> typedef struct (*fun_t ...
- 利用C语言中的函数指针实现c++中的虚函数
C语言中的函数指针 #include<stdio.h> int fun1(int a) { return a*a; } int fun2(int a) { return a*a*a; } ...
- C语言笔记 08_函数指针&回调函数&字符串&结构体&位域
函数指针 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: / ...
- C语言学习019:函数指针
在C语言中,函数名也是指针变量,比如创建了一个add(int n,int m)的函数的同时也创建了一个名为add的指针变量,因此我们可以把函数指针当作一种类型为它赋值.当作参数传递等操作 C语言创建函 ...
- 策略设计模式与c语言中的函数指针
在C语言中有一个非常重要的概念-函数指针,其最重要的功能是实现回调函数(指函数先在某处注册,而它将在稍后某个需要的时候被调用)在java语言中没有指针的概念,但是可以利用接口和指针实现类似的功能,具体 ...
- 详解C/C++函数指针声明 ( *( void(*)())0)();
( *( void(*)())0)(); float *pf; 这个声明的含义是*pf是一个浮点数,也就是说,pf是一个指向浮点数的指针. float *g() , (*h)(); 表示*g()与( ...
- 1、C语言中的函数指针
一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...
随机推荐
- 使用UTL_SMTP发送中文电子邮件
就是在原有TOM源码的基础上修改utl_smtp.write_data中,将输出内容进行一下数据转换,这样可以保证中文输出不会出现乱码 ----------------------------- cr ...
- [Linked List]Rotate List
Total Accepted: 55428 Total Submissions: 250727 Difficulty: Medium Given a list, rotate the list to ...
- 多线程并发编程之显示锁ReentrantLock和读写锁
在Java5.0之前,只有synchronized(内置锁)和volatile. Java5.0后引入了显示锁ReentrantLock. ReentrantLock概况 ReentrantLock是 ...
- Unix下C程序内存泄露检测工具:valgrind的安装使用
Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...
- 使用微信 SDK 上传图片到七牛
总体思路是:在微信下选好图片后将图片上传到微信服务器,在后端使用微信服务器返回的图片 serverId 加上调用接口的 ApiTicket 通过七牛的 fetch 接口向微信服务器下载多媒体文件的接口 ...
- 解决pycharm无法导入本地包的问题(Unresolved reference 'tutorial')
在用scrapy(python2.7)写爬虫的时候 from tutorail.items import DmozItem 这一行死活不成功 也就是出现 Unresolved reference 't ...
- SQL Server 统计信息的创建与更新
前期准备: 普通表.临时表:它两会有统计信息. 表变量: 不会有统计信息. ---------------------------------------------------- ...
- 不调用库函数实现 strCpy
实现函数时,首先要弄清楚特殊情况,边界条件要搞清. char* strCpy(char* src,char* des){ //判断指针是否为空 if(NULL==src||NULL == des) r ...
- network-manager与interfaces冲突
网络配置的两种方式 Ubuntu下修改网络配置有两种方式:图形界面方式(network-manager)和修改/etc/network/interfaces 但是如果两种方式的网络设置不同,就会产生冲 ...
- Mono For Android中AlarmManager的使用
最近做了一个应用,要求如下: 程序运行之后的一段时间,分别触发3个不同的事件.当然很快就想到了Android中的AlarmManager和BroadcastReceiver.但是毕竟Mono环境和Ja ...