《C Primer Plus 5th》读书笔记----存储类、链接、类型限定词

来源:互联网 发布:淘宝怎么虚假交易 编辑:程序博客网 时间:2024/04/29 17:31

下面是C的5种存储类

1、 自动---在一个代码块内(或者在一个函数头部作为参量)声明的变量无论有没有存储类修饰符auto,都属于自动存储类。该类具有自动存储时期,代码块作用块和空链接。如未经初始化,它的值是不固定的。(局部变量)


2、寄存器---在一个代码块内(或在一个函数头部作为参量)使用存储类修饰符register声明的变量属于寄存器存储类。该类具有自动存储时期、代码块作用域和空链接,并且您无法获得其地址。把一个变量声明为寄存器变量可以指示编译器提供可用的最快访问。如未经初始化,它的值是不定的。(用register修饰的局部变量,没有地址的原因是变量的值可能是被存储在CPU的寄存器中,而我们无法获得寄存器变量的地址。)


3、静态、空链接---在一个代码块内使用存储类修饰符static声明的变量属于静态空链接存储类。该类具有静态存储时期、代码块作用域和空链接仅在编译时初始化一次。如未明确初始化,它的字节都被设定为0。(局部静态变量)


4、静态、外部链接---在所有函数外部定义、未使用存储类修饰符static的变量属于静态、外部链接存储类。该类具有静态存储时期、文件作用域和外部链接、仅在编译时初始化一次。如未明确初始化,它的字节都被设定为0。(具有外链接的全局静态变量)


5、静态、内部链接---在所有函数外部定义、使用存储类修饰符static的变量属于静态、内部链接存储类。该类具有静态存储时期、文件作用域和内部链接,仅在编译时初始化一次。如未明确初始化,它的字节都被设定为0。(具有内链接的全局静态变量)


制成表格就是:

存储类

时期

作用域

链接

声明方式

自动

自动

代码块

代码块内

寄存器

自动

代码块

代码块内,使用关键字register

具有外部链接的静态

静态

文件

外部

所有函数之外

具有内部链接的静态

静态

文件

内部

所有函数之外,使用关键字static

空链接的静态

静态

代码块

代码块内,使用关键字static

 




----------------------------------括号内为自己的见解,其余均为书本原文。


存储类型说明符:static、extern、auto、register、typedef

说明符auto表明一个变量具有自动存储时期,只能用于具有代码块作用块的变量声明中。

说明符register也只能用于具有代码块作用块的变量。它将一个变量归入寄存器存储类,这相当于请求将该变量存储在一个寄存器内,以更快地存取。它的使用也使您不能获得变量的地址。

说明符static在用于具有代码块作用域的变量的声明时,使该变量具有静态存储时期,从而得以在程序运行期间(即使在包含该变量的代码块并没有运行时)存在并保留其值。变量仍具有代码块作用域和空链接。staic作用于具有文件作用域的变量的声明时,表明该变量具有内部链接。

说明符extern表明您在声明一个已经在别处定义了的变量。如果包含extern的声明具有文件作用域,所指向的变量必然具有外部链接。如果包含extern的声明具有代码块作用域,所指向的变量可能具有外部链接也可能具有内部链接,这取决于该变量的定义声明。

关键字typedef与内存存储无关,由于语法原因被归入此类。特别地,不可以在一个声明中使用一个以上存储类说明符,这意味着不能将其他任一存储类说明符作为typdef的一部分。


PS:虽然某些书(例如《C++ Primer 4th》)会推荐别人用extern char permis = 'Y' ; 的方式来进行定义变量,但是从《C Primer Plus 5th》这本书的观点来看,这种声明方式是错误的,因为extern仅用来声明变量 ,表明这个变量的定义在其它地方。虽然事实上编译器不会发生编译错误,但是也会给出警告,告诉使用者“XXX已经在其它地方定义了。”个人还是比较同意比较《C Primer Plus 5th》这种说法的。


ANSI C的类型限定词:const、volatile、restrict

类型限定词const用来表明一个变量具有不变性(C90增加)。其余值得注意的地方就是,在C程序中,全局数据中除非使用static修饰,否则全局变量具有外部链接。而在C++程序中,用const修饰的全局变量默认具有内部链接。


类型限定词volatile告诉编译器该变量除了可被程序改变以外还可被其他代理改变,比如操作系统、硬件或者一个并发执行的程序。确切地说,volatile限定符告诉编译器不要对这个变量进行任何形式的优化,而是始终从变量在内在中的位置读取变量的值(这一句摘自《Window核心编程 5th》)。该限定符多用于多线程程序。


类型限定符restrict允许编译器优化某几中代码增强了计算支持。它只可用于指针,并表明指针是访问一个数据对象的唯一且初始的方式。

例如 int *restrict restar = (int*) malloc(10 * sizeof(int)) ;





原创粉丝点击