复习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语言复杂的函数指针声明的更多相关文章

  1. Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针

    Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针   1.1. java方法引用(Method References) 与c#委托与脚本语言js ...

  2. 函数指针玩得不熟,就不要自称为C语言高手(函数指针是解耦对象关系的最佳利器,还有signal)

    记得刚开始工作时,一位高手告诉我说,longjmp和setjmp玩得不熟,就不要自称为C语言高手.当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法.后 ...

  3. C语言中的函数指针

    C语言中的函数指针 函数指针的概念:   函数指针是一个指向位于代码段的函数代码的指针. 函数指针的使用: #include<stdio.h> typedef struct (*fun_t ...

  4. 利用C语言中的函数指针实现c++中的虚函数

    C语言中的函数指针 #include<stdio.h> int fun1(int a) { return a*a; } int fun2(int a) { return a*a*a; } ...

  5. C语言笔记 08_函数指针&回调函数&字符串&结构体&位域

    函数指针 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: / ...

  6. C语言学习019:函数指针

    在C语言中,函数名也是指针变量,比如创建了一个add(int n,int m)的函数的同时也创建了一个名为add的指针变量,因此我们可以把函数指针当作一种类型为它赋值.当作参数传递等操作 C语言创建函 ...

  7. 策略设计模式与c语言中的函数指针

    在C语言中有一个非常重要的概念-函数指针,其最重要的功能是实现回调函数(指函数先在某处注册,而它将在稍后某个需要的时候被调用)在java语言中没有指针的概念,但是可以利用接口和指针实现类似的功能,具体 ...

  8. 详解C/C++函数指针声明 ( *( void(*)())0)();

     ( *( void(*)())0)(); float *pf; 这个声明的含义是*pf是一个浮点数,也就是说,pf是一个指向浮点数的指针. float *g() , (*h)(); 表示*g()与( ...

  9. 1、C语言中的函数指针

    一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...

随机推荐

  1. 第三方浏览器内核嵌入一、Crosswalk

    本篇分为三部分: 介绍Crosswalk背景 介绍Crosswalk集成步骤 为了减小体积,仅集成兼容ARM的Crosswalk(针对X86同理) PART_A Crosswalk背景介绍 Web技术 ...

  2. NSURLSessionUploadTask 上传

    -(void)uploadPhotoImageWithUrl:(NSString*)url userIMID:(NSString*)userIMID imageData:(NSData*)imageD ...

  3. windows下如何使用ssh远程登录Linux

    1.ssh的安装 sudo apt-get install ssh 或者在Linux情况下,自带有ssh,从第二步开始   2.生成密钥 ssh-keygen 中间过程会提示你存放密钥的地方Enter ...

  4. pythonj基础之 多线程

    多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进 ...

  5. 库函数strlen源码重现及注意问题

    首先直接上源码: size_t strlen (const char * str) { const char *eos = str; while(*eos++); return(eos - str - ...

  6. jquery中的全局事件

    ajaxStart(callback):Ajax请求开始时触发该事件 ajaxSend(callback):Ajax请求发送前触发该事件 ajaxSuccess(callback):Ajax请求成功时 ...

  7. winform制作自定义控件(入门)

    原文链接:http://blog.csdn.net/bychentufeiyang/article/details/7081402   与原文基本一致,只是例子变成VS2012环境,语言采用博主常用的 ...

  8. Oracle ORA-01555 快照过旧 说明

    oracle高级知识(1) ORA-01555 快照过旧,是数据库中很常见的一个错误,比如当我们的事务需要使用undo来构建CR块的时候,而此时对应的undo 已经不存在了, 这个时候就会报ORA-0 ...

  9. Visual Studio 2012 Update3 安装失败错误“正在关闭管道'

    问题描述: Visual Studio 2012 update3 安装失败错误“ 正在关闭管道' 环境: Windows 7 SP1(x86和x64) Windows 8(x86和x64) Windo ...

  10. H面试程序(29):求最大递增数

    要求:求最大递增数 如:1231123451 输出12345 #include<stdio.h> #include<assert.h> void find(char *s) { ...