《C语言核心技术》笔记-----声明

在表达式使用标示符之前,编译器需要知道此标示符的所有特性,因此,每个翻译单元都必须包含所用到的每个标示符的声明。声明标示符之后,就可以在它的作用域中使用此标示符了。对象和函数的标示符有文件作用域和语句块作用域之分。


存储类型修饰符会改变标示符的链接和相应对象的生存周期。

auto 自动
static\extern 对链接是有影响的同时它们声明的变量具有静态生存周期。

register 声明的变量会被存放在寄存器中,以便快速调用,也因此它不能使用“地址运算符&”。



限定类型符 const \ volatile \ restrict

const 指明其为常量,即说明不能通过程序修改。

volatile 说明被声明的对象会被程序以外的事件修改。

restrict 限定对象此时不能被其他方式修改,只能是通过被restrict限定方式。

eg: extern const volatile int ticks ; 此对象无法被程序修改,但是硬件可以。



声明和定义的区别:定义能够使能存分配出相应的空间,而声明不能。标示符的声明次数无限制,但是只有“其作用域内的其中一次”有效。若将“具有外部链接的对象和函数”的定义放在头文件中,就容易造成重复定义。

标示符的声明同时也是定义的情况;

1、 如果在声明的函数的同时出现函数体

eg: int imax(int a,int b); 声明,不是定义

       int imax(int a,intb); 

         {return (a>=b?a;b);} 即使声明又是定义
2、如果在对象声明是给他分配内存

eg: extern double b[]; 声明

      int a=2; 声明与定义



复杂声明的解读

( )  : 返回值的类型为······.的函数

[ ]  :元素类型为······的数组

*  : 指向······类型的指针

 步骤: 从标示符开始

 1、 如果左圆、方括号出现在紧邻的右边,那边翻译整对括号。

 2、否则,如果*号出现在左边,则翻译此星号。反复1,2直到完成。

eg: char  *(*ftab[])(void)

解释:元素类型为指针的数组,这些指针指向参数为void且返回值为指针的函数,此指针指向char型数据。连起来就是,ftab指向一个数组,此数组内的元素为指向返回值为 指向char型数据的指针的函数

        float (*func())[3]

解释:返回值为指针的函数,为指向有3个元素的数组的指针,元素类型为float的数组。即:func指向返回值为指向有3个元素且类型为float的数组的函数。


现在说说typedef,它是一个声明,可以提高程序的可移植性与可读性。很多地方说其与#define类似,这是以偏概全的。

typedef int int32 ; 与#define int32 int 是类似的,但是 typedef int  array[10] ; 就很难用define来解释了。

那就先说说typedef int  array[10] ; 如何解释。 先把typedef去掉,即为int  array[10] ;这是一个定义也是一个声明,为10个int元素的数组。然后再加上typedef ,这句typedef int  array[10] ;就仅仅是声明了,但是array这个符号就多了一个用途,可以声明和定义与其去了typedef时所表达相同意思的对象。即array a;即声明和定义了一个 int a[10]的对象。同理如char  *(*ftab[])(void);,若我在其前面加一个typedef,就可以用ftab n,m;来表示char  *(*n[])(void);char  *(*m[])(void);就是这么简单。


做嵌入式的人应该会见到(*(void(*)())0) () 这句,意思是硬件地址跳到0处。但是这个用上面的方法好像解释不了吧..........这当中其实是加入了强制类型转换。按前面的解读,如果需要跳到0处,其实(*0)()就可以了,但是这里的0并不是一个指针呀,*的操作对象必须是指针,因此就对0强制转换为指针咯,用(void(*)())。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值