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关键字的后面紧跟类型说明符(如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可以这样用。

时间: 2024-10-03 04:40:09

c 语言声明的相关文章

理解C语言声明的优先级规则

A 声明从它的名字开始读取,然后按照优先级顺序依次读取. B 优先级从高到低依次是:    B.1 声明中被括号括起来的那部分    B.2 后缀操作符:         括号()表示这是一个函数,而         方括号[]表示这是一个数组.    B.3 前缀操作符:星号*表示 "指向-的指针". C 如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符.在其他情况下,const和(或)volatile关键字作用于它左边

C语言声明的BNF

前两天发了那篇关于C语言复杂声明的解析之后.在评论中就有人提醒,如果把C语言声明的BNF写出来会更加清晰. 好吧.我承认,在看到这条评论之前,我并不知道什么是BNF..百度之后,再此也分享给大家,确实非常好用. BNF_百度百科 简单的来说BNF是一种能用递归来描述一种编程语言的方式,BNF的描述要比任何自然语言的描述更精确和简单,让我难以置信的是,一般描述一个语言BNF甚至只需要1 200行就可以了... 既然要描述C语言的声明,自然要知道C语言的准确定义了,为了简单,我选择的是C89标准的资

c语言声明的解读、typedef与define的区别

读声明: 1.最先从左往右找到最左边的标识符. 2.查看标识符右边的下一个符号.若是方括号,则表示到“...的数组”. 3.如果是一个左圆括号.到右括号为止的内容表示“返回...的函数”. 4.再往右找,如果左边的符号是一个左括号, 这个左括号把已处理的部分声明组合在一起,直到遇见对应的右括号,然后从第二步重新开始. 5.如果是*,表示“指向...的指针”: 如果是const,表示“只读”: 如果是volatile,表示“volatile”: 6.剩下的符号可一并阅读. 练习例子:char *

C语言声明与定义

很久没接触C语言了,今天遇到声明与定义的问题,于是找到下面的解释: 声明(declaration )指定了一个变量的标识符,用来描述变量的类型,是类型还是对象,或者函数等.声明,用于编译器(compiler)识别变量名所引用的实体.以下这些就是声明: extern int bar; extern int g(int, int); double f(int, double); // 对于函数声明,extern关键字是可以省略的. class foo; // 类的声明,前面是不能加class的. 定

关于c语言声明 void (*signal(int sig, void(*func)(int)))(int)的理解

刚开始看到这个 很蛋疼 还是慢慢理解 首先 void(*func)(int) 是一个指针 指向一个 返回值为void 参数为int的函数 是一个函数指针 具体理解http://zhidao.baidu.com/link?url=5GpEN7wPUhDlk_m-3drRHV9bGxv53tj818vtd1GIsyaVfyY1mdsFZfP6_2M_DNAfTQrh0qxMo_wXhK1CjIEPJK 然后看外围的函数声明 是不是和里面有点类似 对的 里面函数 简写为void   (*signal(

《C专家编程》第三章——分析C语言的声明

前面一章我们已经说过C语言存在的一些问题和它晦涩的地方,让我们对这门神奇的语言有了更深的了解.现在这一章则集中精力来讨论C语言的声明,分为三块,首先是说明C语言声明晦涩难懂的原因和声明是如何形成的,其次就是学习怎样对C语言的声明进行分析,另外本文将详细来探讨一个分析C语言声明的工具--cdecl,分析和编写它的源代码. C语言的声明晦涩难懂这一点应该是名不虚传的,比如说下面这个声明: void (*signal(int sig, void(*func) (int)))(int); 这可不是吓人的

《C专家编程》笔记(三)——分析C语言的声明

1. 几个C语言声明的分析 char (*j)[20]; j = (char(*)[20]) malloc(20); // j是指向数组的指针 const int * grape; int const * grape; int * const grape_jelly; const int * const grape_jam; int const * const grape_jam; char * const * (*next)(); // next是指向函数的指针,这个函数不接收参数,它的返回值

C语言中标识符声明的几个关键字总结

C语言中声明一个名称就是把一个标识符与某个C语言对象相关联,如变量.函数或类型,C语言中可以声明的名称包括:变量.函数.类型.类型标志.结构成员与联合成员.枚举常量.语句标号和预处理器宏.除了语句标号和预处理器宏之外,所有标识符都在C语言声明中声明,变量.函数.类型放在声明的声明符中,类型标志.结构成员与联合成员和枚举常量在声明的某种类型说明符中声明,语句标号在C语言函数中出现时声明,而预处理器宏用#define预处理器命令声明. 如下列声明: extern const volatile uns

UNIX/Linux下C语言的学习路线

一.工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具. 1.操作系统    在UNIX或Linux系统中学习C很方便,所以在开始您的学习旅程前请先选择一个UNIX或Linux操作系统,目前可供个人免费使用的UNIX或Linux系统有FreeBSD.RedHat Linux.SUSE Linux等,而且在安装包中还提供很多实用的工具,如:gcc, make等. 如果您一直使用Window