读书笔记--C陷阱与缺陷(三)
第三章
1. 指针与数组
书中强调C中数组注意的两点:
1) C语言只有一维数组,但是数组元素可以是任何类型对象,是另外一个数组时就产生了二维数组。数组大小是常数(但GCC实现了变长数组。。)
2) 一个数组只能做两件事:确定数组大小和获得指向该数组下标为0的元素的指针(数组下标操作其实是指针操作)。
如:int a[3];
a除了被用于sizeof的参数时,其他都代表指向数组下标为0的元素的指针。
sizeof(a)=3*sizeof(int) (数组大小)
2. 空指针
常数0转换的指针就是NULL;但是常数0转换的NULL指针不能解引用(*)。
即0赋值给指针变量时,不能使用该指针所指向的内存中的内容。
3. 整数溢出
当算术运算符的一个操作数是有符号数,另一个是无符号数时,有符号数会被转化为无符号数,不会发生整数溢出。
所以整数溢出只发生在两个有符号整数之间,溢出的结果也是不确定的!
书中提供了两种检测程序:
1 if((unsigned)a + (unsigned)b > INT_MAX) 2 3 complain(); 4 5 6 7 此处的INT_MAX代表最大整数值。在<limits.h>中定义了INT_MAX. 8 9 第二种方法不需要用到无符号类型转换: 10 11 if(a > INT_MAX - b) 12 13 complain();
第三章其实内容不少,但作者大量篇幅放在了指针与数组和数组中的不对称区间上(数组下标从0开始)。之后抽时间专门写一个对比指针数组、数组指针的文章,将容易搞混的二者区分开。
学学学~