C 语言复杂声明的理解
来源:互联网 发布:传奇账号数据库 编辑:程序博客网 时间:2024/05/15 08:15
C语言常常因为声明的语法问题而受到人们的批评,特别是涉及到函数指针的语法。C语言的语法力图使声明和使用相一致。对于简单的情况,C语言的做法是很有效的,但是,如果情况比较复杂,则容易让人混淆,原因在于,C语言的声明不能从左至右阅读,而且使用了太多的圆括号.
但是找到正确的规则去理解, 无论多复杂都可以搞清楚.原则如下:
1. 从里到外
2.按照优先级顺序,优先级顺序相同时候,从右边到左边
看几个例子,来自c语言爸爸的书.
int *f(); /* f: function returning pointer to int */
这个很简单, 从f开始, f是定义的变量, ()优先级高, 于是看f(), f是一个函数定义. 以后看到* 与int结合, int* 返回值. 所以, 这是一个返回值为int指针的函数.
int (*pf)(); /* pf: pointer to function returning int */
pf是一个变量, 与*结合, *pf是一个指针, 在于()结合, pf是一个函数指针, 再看int为返回值.那么, 这就是一个返回值为int的无参数, 函数指针.
int (*daytab)[13]daytab: pointer to array[13] of int
daytab 是一个变量, * daytab是一个指针, (*daytab)[13] 是一个指向数组的指针, int (*daytab)[13] 是一个指向int型的数组指针.
下面2个异常的复杂, 记住上面的规则, 照样解析明白:
char (*(*x())[])()x: function returning pointer to array[] ofpointer to function returning char
x 是一个变量
x() 是一个函数
*x() 是一个返回指针
(*x())[] 根据结合律, 返回的指针指向数组
*(*x())[] 数组里面放的都是指针
(*(*x())[])() 数组里面的指针指向函数
char (*(*x())[])() 指向的函数返回值为char
所以, x是一个函数, 返回值为一个指针,指向一个数组,数组里面都是指向函数的指针,指向的函数返回值为char , 无参数
在来看最后一个, 都是c爸爸书上给的例子, 其实有了规则也不复杂,编译器都能解析.
char (*(*x[3])())[5]x: array[3] of pointer to function returningpointer to array[5] of char
x 是一个变量
x[3] 是一个数组, 再次强调结合律
*x[3] 数组里面都是指针
(*x[3])() 数组里面指针指向函数, 还是强调结合律
*(*x[3])() 函数的返回值是指针
*(*x[3])()[5] 返回值指针,指向的是一个数组
char *(*x[3])()[5] 这个数组是char类型的
所以, x是一个数组, 数组里面是指向函数的指针, 指向的函数返回值是一个指针,指向char类型的数组.
- C 语言复杂声明的理解
- C语言复杂声明的理解
- 理解复杂的c语言 c++声明
- 理解c语言复杂声明
- 理解C语言的复杂声明的要点
- 怎样理解一个复杂的c语言声明
- C语言的复杂声明
- 复杂的C 语言声明
- C语言的复杂声明
- C语言复杂类型声明怎么理解?
- 理解 C 语言中的复杂声明
- c语言中的复杂声明理解方法
- C/C++:如何理解复杂的声明
- C/C++:如何理解复杂的声明
- C/C++:如何理解复杂的声明
- 理解复杂C声明
- 理解C语言中指针的声明以及复杂声明的语法
- 理解C语言中指针的声明以及复杂声明的语法
- LeetCode-Subsets
- C 语言计算精确时间
- C++第十九天 面向对象编程
- 如何让开饭板跑出图来
- LBaas 原理分析
- C 语言复杂声明的理解
- 042:hibernate多对一单向关联(xml)
- systemd的若干理解,相对于susVinit
- 字典树新姿势
- LeetCode---Evaluate Reverse Polish Notation
- 引用和指针的比较
- shell脚本中自动输入密码
- ueditor1.4.3在vs2010项目中,但是发布到iis上却不管用了。
- Jack--10天学会IOS大纲;注意将图片放大观看!