http://blog.csdn.net/jgood/article/details/5618628

《C专家编程》第三章介绍了如何分析复杂的声明,讲的非常不错。对于作者介绍的分析复杂声明的方法,我没有完全掌握,不过,我有我自己的一套方法来解析复杂的声明,正所谓条条大道通罗马,只要结果一样,必须在乎过程呢。今天在网上找了几个复杂的声明,练练手(声明的例子全部来自网络,原谅出处未详)。记下此文,作个标记,待日后回味。

int (*func)(int *p)

这个就不解释了,每本C语言参考书上都会有的。作为一个C/C++程序员还不会的话,说明你已经out了~~_~~

int (*func)(int *p, int (*f)(int*))

func是一个指针,指向一个函数,函数接收两个参数,第一个参数是int *,第二个参数是一个函数指针(该函数指针接收int *参数,返回int值),函数返回int值。使用typedef来简化一下:

[cpp] view plaincopy
  1. int (*func)(int *p, int (*f)(int*));
  2. /* 等价于 */
  3. typedef int (*functor1)(int *);
  4. typedef int (*functor2)(int *, functor1);
  5. functor2 func;

int (*func[5])(int *p)

func是一个包含5个元素的数组,数组中的每个元素是函数指针,函数接收int *参数,并返回int值。用typedef来简化一下:

[cpp] view plaincopy
  1. int (*func[5])(int *p);
  2. /* 等价于 */
  3. typedef (*functor)(int *);
  4. functor func[5];

int (*(*func)[5])(int *p))

func是一个指针,指针指向包含5个元素的数组,数组是的每个元素是函数指针,该函数接收int *参数,并返回int值。用下面的代码来表示一下func是个什么东东:

[cpp] view plaincopy
  1. int (*(*func)[5])(int *p);
  2. /* func是下面这个东东: */
  3. typedef int (*functor)(int *);
  4. functor arr[5];
  5. func = &arr;

int (*(*func)(int *p))[5]

func是一个指针,指针指向函数,函数接收int *参数,返回指针,指针指向包含5个元素的int型数组。用typedef来简化一下:

[cpp] view plaincopy
  1. int (*(*func)(int *p))[5];
  2. /* 等价于 */
  3. typedef int arr[5];
  4. typedef arr *(*functor)(int *);
  5. functor func;

int (*(*func)[5][6])[7][8]

func是一个指针,指针指向行数为5, 列数为6的二维数组,数组中保存的是指针,指针指向行数为7,列数为8的int型数组。下面的代码也许会让你更清楚一点:

[cpp] view plaincopy
  1. int (*(*func)[5][6])[7][8];
  2. /* see it: */
  3. typedef int arr[7][8];
  4. arr *func1[5][6];
  5. func = &func1;

int (*(*(*func)(int *))[5])(int *)

func是一个函数指针,函数接收int *参数,返回一个指针,指针指向包括5个元素的数组,数组中的元素是函数指针,函数接收int *参数,返回int值。用typedef简化一下下:

[cpp] view plaincopy
  1. int (*(*(*func)(int *))[5])(int *);
  2. /* 等价于 */
  3. typedef int (*functor1)(int *);
  4. typedef functor1 arr[5];
  5. typedef arr *(*functor2)(int *);
  6. functor2 func;

int (*(*func[7][8][9])(int*))[5]

func是一个三个数组,数组中的每个元素是指针,指针指向函数,函数指向int*参数,返回指几包含5个元素的int数组(嗷口),和typedef来简化一下:

[cpp] view plaincopy
  1. int (*(*func[7][8][9])(int*))[5];
  2. /* 等价于 */
  3. typedef int arr[5];
  4. typedef arr *(*functor)(int *);
  5. functor func[7][8][9];

下面说说另外一种声明形式

A:

void (*signal(int sig,void (*handler)(int)))(int)

这是linux signal函数的原型,它是这样的函数 1:signal函数形参有2个,第一个是int,第二个是一个函数指针,这个指针类型是 void (*p)(int) ,2:它的返回值也是一个指针类型,这个指针类型也是void (*p)(int)

用typedef简化过后是这样的

typedef void (*handler)(int);

handler signal(int sig,handler handl);

B:

void_1 (* (*signal(void_2)) )(void_3)

这个signal是一个指向函数的指针,这个函数的形参是void(即上面标记为void_2的是形参),它的返回类型也是一个指针,但是这个指针和A中的不同,A中的是直接指向一个函数,而B中的这个是指向一个指针,这个被指向的指针指向一个void (*han)(void)型函数(即指针的指针) ==>(pointer_1--->pointer_2--->函数)

typedef简化过后是这样的

typedef void (*p)(void);

p* signal(void);

C:

void (* (*signal(void))[] )(void)

这个typedef简化过后是这样的

typedef void (*p[])(void);

p* signal(void);

转载于:https://www.cnblogs.com/buxianghe/archive/2012/07/10/2585075.html

[转+]C语言复杂声明相关推荐

  1. java语言中声明布尔型_【Java初探02】——Java语言基础

    本篇博文就Java语言的一些基本元素进行一些记录和阐述,主要讲解一下Java语言的一些基本构成元素和Java的主类结构. Java语言基础的大致组成 java主类结构 基本的数据类型 变量与常量 运算 ...

  2. 《C专家编程》第三章——分析C语言的声明

    前面一章我们已经说过C语言存在的一些问题和它晦涩的地方,让我们对这门神奇的语言有了更深的了解.现在这一章则集中精力来讨论C语言的声明,分为三块,首先是说明C语言声明晦涩难懂的原因和声明是如何形成的,其 ...

  3. c语言函数声明定义参数命名,C语言函数声明与定义

    C语言函数声明与定义教程 在 C语言函数声明与定义 语法 type funcName(paramType1 param1, paramType2 param2){ // 执行语句... return ...

  4. C语言 函数声明和调用 - C语言零基础入门教程

    目录 一.简介 二.函数声明和定义 1.函数声明:不需要实现这个函数的功能 2.函数定义:必须实现这个函数的功能 三.函数调用 四.函数形参和实参 五.猜你喜欢 零基础 Python 学习路线推荐 : ...

  5. C语言 函数声明和定义 - C语言零基础入门教程

    目录 一.简介 二.函数返回值 1.函数没有返回值 2.函数有返回值 三.函数参数 1.函数没有参数 2.函数有固定参数 3.函数有不定长度参数 四.函数声明和定义 1.函数声明:不需要实现这个函数的 ...

  6. C语言 指针声明和定义 - C语言零基础入门教程

    目录 一.指针简介 1.内存 2.内存地址 3.指针声明 二.指针类型 三.声明并初始化一个指针 1.声明指针并直接初始化 – 推荐 2.先声明指针在初始化 – 不推荐 四.查看指针地址和指针的值 五 ...

  7. C语言变量声明和定义 - C语言零基础入门教程

    目录 1.变量名的开头必须是字母或下划线,不能是数字 2.变量名中的字母是区分大小写的 3.变量名绝对不可以是 C 语言关键字 4.变量名中不能有空格 四.猜你喜欢 零基础 C/C++ 学习路线推荐 ...

  8. 水滴石穿C语言之声明的语法

    概述 在很多情况下,尤其是读别人所写代码的时候,对C语言声明的理解能力变得非常重要,而C语言本身的凝练简约也使得C语言的声明常常会令人感到非常困惑,因此,在这里我用一篇的内容来集中阐述一下这个问题. ...

  9. C语言的声明的优先级规则

    C语言的声明的优先级规则如下: A 声明从它的名字开始读取,然后按照优先级顺序依次读取 B 优先级从高到低依次是:   B.1 声明中被括号括起来的那一部分   B.2 后缀操作符[圆括号 ()表示这 ...

  10. 如何理解C语言的声明

    在K&R中,作者承认"C语言声明的语法有时会带来严重的问题".C语言声明的语法对于编译器来说并不是什么大不了的事,但对于一般的程序员,它却会成为障碍. 在阅读较为复杂的代码 ...

最新文章

  1. 点滴积累【C#】---初始页面自动给站点名称赋值
  2. Android studio 不显示自定义View 的提示
  3. php 字符串转数组 提取中文 提取英文 字符串类型
  4. python代码质量检查工具_python代码检查工具pylint 让你的python更规范
  5. html的canvas标签用法,html5中关于canvas标签用法(绘图)
  6. cmw500综合测试仪使用_山西优质三相直流电阻测试仪图片-南电合创
  7. C Tricks(九)—— 获取文件大小与申请数组空间
  8. 线段树 HDU 3397
  9. 正则表达式最后的/i是不区分大小写的意思
  10. 死链接检测 java,【死链接检测】工具查询方法及死链接处理方法
  11. VS2015编译MPC-HC源码
  12. Android Audio音量设置流程
  13. 数据科学与大数据技术和计算机科学与技术哪个好
  14. 合成大西瓜自制版教程
  15. Science:工具使用和语言句法在基底神经节共享计算机制和神经表征
  16. warning incompatible implicit declaration of built-in function 'printf'
  17. ios手机如何使用fiddler抓包https
  18. Python的爬虫程序
  19. 2022年系统集成项目管理工程师考试知识点:项目成本管理
  20. [论文学习]Private traits and attributes are predictable from digital records of human behavior

热门文章

  1. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_1-3课程要求与收益...
  2. 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_03.jdbc操作数据库的问题分析
  3. BTrace简介与使用说明
  4. JAVA Web基础3-Servlet
  5. 洛谷P3233 [HNOI2014]世界树
  6. 软件项目的托管平台gitHub
  7. Thinkphp 批量更新方法 saveALL
  8. Magento 使用心得
  9. 网络流24题 洛谷 2763 试题库问题
  10. ThinkPHP5权限控制