博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转+]C语言复杂声明
阅读量:5174 次
发布时间:2019-06-13

本文共 2558 字,大约阅读时间需要 8 分钟。

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

int (*func)(int *p)

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

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

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

[cpp]
 
  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]
 
  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]
 
  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]
 
  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]
 
  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]
 
  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]
 
  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

你可能感兴趣的文章
LeetCode "Combinations"
查看>>
LeetCode "Integer to English Words"
查看>>
palm qq
查看>>
ADO.NET 学习笔记
查看>>
php设计模式之原型模式
查看>>
关于圆角border-radius
查看>>
站在K2角度审视流程--任务的独占与释放
查看>>
表格布局TableLayout
查看>>
jQuery实现的简单文字提示效果模拟title(转)
查看>>
设计模式:单例
查看>>
单机/伪分布式Hadoop2.4.1安装文档
查看>>
十进制 转换成 二进制
查看>>
钻石操作符
查看>>
[LeetCode 题解]: Minimum Depth of Binary Tree
查看>>
LoadRunner脚本增强
查看>>
python集成安装环境——Anaconda 3.5的安装
查看>>
斐波那契数列
查看>>
function(){} 与(function(){})()的区别
查看>>
作用域
查看>>
yii2高级模板安装
查看>>