首页 > 代码库 > c 语言声明

c 语言声明

声明修饰:

类型说明符: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关键字的后面紧跟类型说明符(如intlong等),那么它作用于类型说明符。在其他情况下,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填充剩余的位,使的字对齐。

 

typedefdefine

简单理解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;

grapeconst修饰符后面紧跟着int,因此这个const修饰的是指针的内容是常量,因此这是一个常量指针(指向常量的指针)。常量指针指向的内存空间可以发生改变,但是不能通过常量指针修改指向内存空间中的数据。

applegrape的修饰是一样的,都是常量指针。

mango applegrape不同,const后面没有跟随类型,因此,const是修饰左侧的*号,因此,mango是一个指针常量,指针常量初始化后就不能修改指向内存空间的位置,但是可以通过指针常量修改指向内存的内容。

orange既是指针常量也是常量指针,因此我们无法修改orange指向的内容。

 

3

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

首先分析c是标识符,c[10]是一个十个元素的数组,*(c[10])表示数组中的每一个元素都是一个指针,*(c[10])()表示数组中的每一个元素都是函数指针,因此整个分析是这样的,c是一个数组[09],它的元素类型是函数指针,其所指向的函数的返回值是一个指向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可以这样用。



c 语言声明