声明修饰:
类型说明符:void char short int long signed unsigned float double 结构说明符(struct)枚举说明符(enum)联合说明符(union)
存储类型:auto extern static register typedef
类型限定符:const volatile
C语言声明的优先级规则:
分析声明的方法:
A声明从它的名字开始读取,然后按照优先级顺序依次读取。
B优先级从高到低依次是:
B1 声明中被括号括起来的那部分
B2 后缀操作符
括号()表示这是一个函数,而方括号[]表示这是一个数组
B3 前缀操作符:星号*表示“指向…的指针”。
C 如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符。在其他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号。
位段:
在结构体的声明中可以使用位段。
例如:
struct pid_tag{
unsigned int inactive : 1;
unsigned int : 1;
unsigned int refcount : 6;
unsigned int : 0;
short pid_id;
struct pid_tag *link;
};
在上面的位段里面,inactive仅定义了一位来处理,因此inactive仅表示0或者1.之后,使用了一个位来填充块,然后使用6个位来设置refcount,之后用0填充剩余的位,使的字对齐。
typedef和define
简单理解typedef是封装类型,define不是。
例如:
#define INT int
int main(int argc,char *argv[])
{
unsigned INT i = 0;
i++;
return 0;
}
这是可以的。
typedef int INT;
int main(int argc,char *argv[])
{
unsigned INT i = 0;
i++;
return 0;
}
会出现编译错误。
例1:
char *const *(*next)();
next是名字,*next说明next是一个指针,(*next)(),说明next是一个函数指针,*(*next)()说明next是一个返回值为…指针的函数指针,最后char *const说明字符串常量指针。
因此整个过程连接起来就是:next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char的指针常量。
(注意,char *const,是一个指针常量)
例2:
const int *grape;
int const *apple;
int *const mango;
const int *const orange;
grape的const修饰符后面紧跟着int,因此这个const修饰的是指针的内容是常量,因此这是一个常量指针(指向常量的指针)。常量指针指向的内存空间可以发生改变,但是不能通过常量指针修改指向内存空间中的数据。
apple与grape的修饰是一样的,都是常量指针。
mango 与apple和grape不同,const后面没有跟随类型,因此,const是修饰左侧的*号,因此,mango是一个指针常量,指针常量初始化后就不能修改指向内存空间的位置,但是可以通过指针常量修改指向内存的内容。
orange既是指针常量也是常量指针,因此我们无法修改orange指向的内容。
例3:
char *(*c[10])(int **p);
首先分析c是标识符,c[10]是一个十个元素的数组,*(c[10])表示数组中的每一个元素都是一个指针,*(c[10])()表示数组中的每一个元素都是函数指针,因此整个分析是这样的,c是一个数组[0…9],它的元素类型是函数指针,其所指向的函数的返回值是一个指向char的指针。
例4:
宏的特殊用法。
C语言宏用法:
#include <stdio.h>
#include <string.h>
#define STRCMP(a,R,b) (strcmp(a,b) R 0)
int main(int argc,char *argv[])
{
if(STRCMP("HEL",==,"HEL"))
printf("%s\n","equ");
else
printf("%s\n","unequ");
return 0;
}
上面的代码,输出结果是:equ
考虑,strcmp函数在两个字符串比较相等的时候返回0,如果我们需要比较两个字符串相等,我们需要写下面的代码if(!strcmp(str1,str2)),因此可以用上面的宏定义方法使得程序读起来更人性化。注意我们这里主要不是强调字符串比较一定要这样用,而是强调define可以这样用。