分析C语言的声明的优先级
2016-04-16 16:16
295 查看
C语言的声明是C语言区别于其他语言的一大亮点,也是一大难点。本文针对的是有一些C语言基础的同学。所以,如果有同学还不清楚C语言的变量的声明和定义的,现在可以关闭本页面了。
本文主要讲解的是C声明的优先级规则。
如下所示:
![](http://img.blog.csdn.net/20160416162941853)
下面通过一个例子来具体说明上面的声明优先级。
char * const *(*next)();
刚看这个声明,比较晕,不知,从何下手,但是按照上面的优先级顺序,一步一步解析,答案很简单;
A 首先,从变量名开始,看变量名“next”,注意它是直接被括号所括住的。
B 1、把括号当做一个整体,可以得出”next是一个指向...的指针“。接着我们看括号外的左边有星号*,右边有括号(),该选择哪一个?这个时候看第二步;
2、右边的括号优先级要高一些,所以,得出“next是一个函数指针”,如果是函数的话,得要有传入参数,和返回参数,我们可以看出,没有传入参数,但是,有返回参数。
3、处理前缀“*”,得出指针所指向的内容。
C 最后 ,把“char * const"解释为指向字符的常量指针。
以上分析的结果是:“next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char的常量指针”。
如果对上面结果理解有困难的话,可以打个比方,next指向的指针的函数设为func,func的返回类型为一个指针p,该指针指向一个常量指针cp,cp指向的内容类型为char类型。注意,这里的const修饰的p所指向的内容,也即cp,而不是最后的char类型。
如果你已经弄明白了上述的过程,现在有一个实例:
char * (* c[10])(int **p);
按照上面的步骤来:
1.c是数组[0...9],数组元素是指针
2.跳出当前的括号,注意后面的括号,表示,数组中的元素是函数指针,即数组中的元素指针指向函数,函数的传入参数是int **p形式。
3.函数的返回类型是char *类型。
本文主要讲解的是C声明的优先级规则。
如下所示:
下面通过一个例子来具体说明上面的声明优先级。
char * const *(*next)();
刚看这个声明,比较晕,不知,从何下手,但是按照上面的优先级顺序,一步一步解析,答案很简单;
A 首先,从变量名开始,看变量名“next”,注意它是直接被括号所括住的。
B 1、把括号当做一个整体,可以得出”next是一个指向...的指针“。接着我们看括号外的左边有星号*,右边有括号(),该选择哪一个?这个时候看第二步;
2、右边的括号优先级要高一些,所以,得出“next是一个函数指针”,如果是函数的话,得要有传入参数,和返回参数,我们可以看出,没有传入参数,但是,有返回参数。
3、处理前缀“*”,得出指针所指向的内容。
C 最后 ,把“char * const"解释为指向字符的常量指针。
以上分析的结果是:“next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char的常量指针”。
如果对上面结果理解有困难的话,可以打个比方,next指向的指针的函数设为func,func的返回类型为一个指针p,该指针指向一个常量指针cp,cp指向的内容类型为char类型。注意,这里的const修饰的p所指向的内容,也即cp,而不是最后的char类型。
如果你已经弄明白了上述的过程,现在有一个实例:
char * (* c[10])(int **p);
按照上面的步骤来:
1.c是数组[0...9],数组元素是指针
2.跳出当前的括号,注意后面的括号,表示,数组中的元素是函数指针,即数组中的元素指针指向函数,函数的传入参数是int **p形式。
3.函数的返回类型是char *类型。
相关文章推荐
- int a[], &a与a的区别
- C++ primer 5th 习题之4.21
- c语言中memset()的用法
- MySQL Connector/C++ 操作MySQL数据库(例程)
- C++ Queues(队列)
- C++新手之全局变量
- C++ Lists(链表) 4000
- 数字游戏 学C语言以来最好玩的一次
- 关于C语言的问卷调查
- C++ Stacks(堆栈)
- c++搜索树判断
- c语言结构体复习笔记
- C语言枚举型复习笔记
- 【C++11】新特性——auto的使用
- C++新手上坑之指针
- 使用C++标准模板库,实现绝对值排序
- C++ 设计模式 —— 控制器设计模式(实现功能模块间通信)
- c++11特性里的多线程thread的用法
- 【探讨】C++ delete[] 是如何知道数组大小的
- C++ STL泛型编程——在ACM中的运用