《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)) ;
- 《C Primer Plus 5th》读书笔记----存储类、链接、类型限定词
- [C] 类型限定词volatile——《C Primer Plus》
- C Primer Plus学习 三十九 类型限定词const
- 《C Primer Plus 5th》读书笔记-----指针和多维数组
- 《C Primer Plus》读书笔记——存储类、链接和内存管理
- 《C Primer Plus》学习笔记之 C数据的属性(三)类型限定词
- 《C Primer Plus》第12章之类型限定词restrict用法
- C primer plus 学习之存储类、链接、内存管理
- C Primer Plus 5th 2.12.5
- C Primer Plus (5th Edition)
- C Primer Plus 5th 2.12.1
- C Primer Plus 5th 2.12.2
- C Primer Plus 5th 2.12.3
- C Primer Plus 5th 2.12.4*
- C Primer Plus 5th 2.12.6*
- C Primer Plus 5th 2.12.7*
- C-PRIMER PLUS读书笔记
- C-PRIMER PLUS读书笔记
- 创建和编辑菜单 MFC
- C语言的那些小秘密之【指针(三)】
- 轻松使用Hadoop RPC
- arm嵌入式开发之ramdisk与IDE驱动
- Intent cannot be resolved to a type
- 《C Primer Plus 5th》读书笔记----存储类、链接、类型限定词
- C语言的那些小秘密之【指针(四)】
- arm嵌入式开发之终端设备
- C语言的那些小秘密之【链表(一)】
- java设计模式六大原则(3):依赖倒置原则
- C语言的那些小秘密之【链表(二)】
- 一个简单的js分页函数
- Arm嵌入式开发之I2C总线
- a+b (九度oj 题目60)