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的意义不同,一个是定义一种类型的别名, 另一个是简单的宏文本替换
阅读(1602) | 评论(0) | 转发(0) |