Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125720
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 354
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-01 15:34
个人简介

不晓得说啥子

文章分类

全部博文(42)

文章存档

2015年(41)

2014年(1)

我的朋友

分类: C/C++

2015-04-21 19:18:46

c语言中声明的优先级规则

1、声明应该从它的名字开始读起,然后按照优先级顺序依次读取。

2、优先级从高到低的顺序:
     (1)、声明中被括号括起来的那部分
     (2)、后缀操作符:
    • 括号()表示是一个函数
    • 方括号[ ]表示这是一个数组
     (3)、前缀操作符星号*表示”指向。。。的指针“。

3、const或volatile关键字修饰紧跟在他们后面的说明符。

例1:

char * const  *(*next)( );

1、从next开始读起,(*next): next是一个指针。
2、紧跟着是next后面的括号  *(*next)( ):代表一个函数。该指针指向一个函数,函数接收某种参数。
3、该函数返回一个指针,该指针指向一个类型为char的常量指针。         

总的应该是:next是一个指针,该指针指向一个函数,该函数接收某种类型的参数,返回一个指针,该指针指向一个类型为char的常量指针。

例2:

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

1、从signal开始signal ( int sig, void ( *func) ( int ) ):signal是一个函数(因为后面是一个括号)。
2、读signal的后缀括号,得出signal函数接收两个参数:第一个参数为int型, 第二个参数为一个函数指针,该函数指针指向的函数接收一个int参数返回void。
3、读signal的前缀*号,,得出该函数返回一个指针
4、由1、2、3可知,void ( *signal ( int sig, void ( *func) ( int ) ) ) ( int )中的红色部分代表一个指针(由函数signal返回),所以整个声明可以简化为:void (*ptr)(int)
5、由4的知普ptr是一个函数指针,该指针指向的函数接收一个int参数,返回void。

总的声明应该是: signal是一个函数;
                           signal函数接收两个参数,一个为int型,一个是一个函数指针,该指针指向的函数有一个int参数返回void; 
                           signal函数返回一个函数指针,该指针指向的函数接收一个int型的参数,返回void。

例3:

char * (*c[10])( int **p)

1、从c开始读,c后面是一个[ ],所以c是一个数组,该数组有10个元素。
2、读c的前缀*,表示该数组中的每个元素都是指针,所以c是一个有10个元素的指针数组
3、读后面的括号,表示前面数组中的指针是函数指针
4、该函数指针指向的函数接收一个指向指针的指针作为参数,返回 一个char型的指针

注意:*c[10]与 (*c)[10]的区别
          *c[10] ,表示c是一个指针数组,数组中的每个元素为一个指针(和main函数的第二个参数:char *argv[ ]相同)
          (*c)[10],表示c是一个指向有10个元素数组的指针

注意:typedef定义类型名与普通的定义变量名是有区别的,但是读取他们声明的优先级是一样的。typedef的格式和普通的变量声明完全一样,只是他们的声明有不同的意义,见下。



typedef、#define、与普通的声明区别

普通的声明表示: 这个名字是一个指定类型的变量
typedef声明:  宣称这个名字是一个指定类型的同义词(别名),但是它并没有引入新的类型
#define宏定义:简单的宏文本替换(在编译程序的预处理阶段会将由#define宏定义的变量进行展开)

typedef与#define的区别:

1、可以用其他类型说明符对宏类型名进行扩展,而typedef所定义的类型名却不能这样做。如下所示:
     
     #define int dog
     typedef int cat;
     unsigned dog i;  //正确,因为在预处理阶段会展开为:unsigned int i;
     unsigned cat  j;  

2、在连续的几个变量中,用typedef定义的类型名能够保证声明中所有的变量均为同一类型,用#define定义的宏类型却无法保证

     #define int_ptr int *
     typedef char *char_ptr;
     
     int _ptr ptr1, ptr2;        /*预处理时展开为 int *ptr1, ptr2, 结果是ptr1是一个int型的指针,而ptr2 是一个int型的变量*/
     char_ptr ,pptr1, pptr2; /* pptr1 和pptr2 都是 一个char型的指针*/

3、两者的执行时间不同
     #define是在程序编译期间的预处理阶段处理的,而typedef是在编译期间有效

4、功能不同
     一个是简单的宏替换定义,一个是定义一种类型的别名

5、代码属性不认同
     #define不是c语句,后面不用加‘;’分号,而typedef是c语言的语句,后面需要加‘;’分号

总结:这两点区别最要还是由于typedef与#define的意义不同,一个是定义一种类型的别名, 另一个是简单的宏文本替换





阅读(1556) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~