《Pointers On C》读书笔记(第三章 数据)

时间:2021-12-02 22:34:01

1.在C语言中,仅有4种基本数据类型:整型、浮点型、指针和聚合类型(如数组和结构等)。

整型家族包括字符、短整型、整型和长整型,它们都分为有符号和无符号两种。

标准规定整型值相互之间大小的规则:长整型至少应该和整型一样长,而整型至少应该和短整型一样长。

ANSI标准规定了各种整型值的最小允许范围,如下表所示:

类  型 最小范围
char 0~127
signed char -127~127
unsigned char 0~255
short int -32767~32767
unsigned short int 0~65535
int -32767~32767
unsigned int 0~65535
long int -2147483647~2147483647
unsigned long int 0~4294967295

枚举类型定义中的符号名被当作整型常量处理,声明为枚举类型的变量实际上是整数类型。但是,把枚举变量同整数无差别地混合在一起使用会削弱它们值的含义,实践中应尽量避免。

2.浮点数家族包括float(单精度)、double(双精度)和long double(扩展精度)类型。ANSI标准规定:long double至少和double一样长,而double至少和float一样长。标准同时规定了一个最小范围:所有浮点类型至少能容纳从10-37~1037之间的任何值。

浮点数字面值在缺省情况下都是double类型的,除非它的后面跟一个L或l表示它是一个long double类型的值,或者跟一个F或f表示它是一个float类型的值。

ANSI C标准声明如果对一个字符串常量进行修改,其效果是未定义的。在实践中,应尽量避免修改字符串常量。如果确需修改字符串,应将其存储于字符数组中。

3.在声明整型变量时,如果声明中已经至少有了一个其他的说明符,关键字int可以省略。

signed关键字一般只用于char类型,其他整型类型在缺省情况下都是有符号数。至于char是否是signed,则因编译器而异。

4.数组的下标总是从0开始的,最后一个元素的下标是元素的数目减1。

C编译器并不检查程序对数组下标的引用是否在数组的合法范围内。这种不加检查的行为有好处也有坏处。好处是不需要浪费时间对有些已知是正确的数组下标进行检查,坏处是这样做将使无效的下标引用无法被检测出来。

5.C语言支持一种叫做typedef的机制,它允许你为各种数据类型定义新名字。其声明格式与普通的声明基本相同,只是要把关键字typedef放在声明的前面。

实践中,通常应该使用typedef而不是#define来创建新的类型名,因为后者无法正确地处理指针类型。

6.const关键字涉及到指针变量的几种情况:

int  *pi;  //pi是一个普通的指向整型的指针

int const  *pci;  //pci是一个指向整型常量的指针。可以修改指针的值,但不能修改指针所指向的值。

int  *  const cpi;  //cpi是一个指向整型的常量指针。可以修改指针所指向的值,但不能修改指针的值。

int const  *  const cpci;  //cpci是一个指向整型常量的常量指针。指针的值和指针所指向的值均不能修改。

7.标识符的作用域就是程序中该标识符可以被使用的区域。编译器可以确认4种不同类型的作用域:文件作用域、函数作用域、代码块作用域和原型作用域。

标识符的链接属性决定如何处理在不同文件中出现的标识符。链接属性一共有3种:external、internal和none。没有链接属性的标识符(none)总是被当作单独的个体,也就是说该标识符的多个声明被当作独立不同的实体;属于internal链接属性的标识符在同一个源文件内的所有声明都指同一个实体,但位于不同源文件的多个声明则分属不同的实体;属于external链接属性的标识符不论声明多少次、位于几个源文件都表示同一个实体。

关键字extern和static用于在声明中修改标识符的链接属性。static只对缺省链接属性为external的声明才有改变链接属性为internal的效果。当extern用于源文件中一个标识符的第1次声明时,它指定该标识符具有external链接属性。但是,如果它用于该标识符的第2次或以后的声明时,它并不会改变由第1次声明所指定的链接属性。

变量的存储类型是指存储变量值的内存类型。有3个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类变量称为静态变量。如果不指定其初始值,默认初始化为0。在代码块内部声明的变量的存储类型是自动的,它存储于堆栈中,称为自动变量。如果声明中加上关键字static,则它的存储类型变为静态。如果自动变量没有指定初始值,则其默认值为垃圾。关键字register可以用于自动变量的申明,提示它们应存储于机器的硬件寄存器而不是内存中,这类变量称为寄存器变量。

8.当static用于函数定义或代码块之外的变量声明时,它用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响。

当static用于代码块内部的变量声明时,它用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。