/*
读书笔记类型多种多样,有摘抄型的,有感想型的,有批注型的,有摘要型的……
现在正在研读《C和指针》,其中有很多我认为必要的知识点,摘抄并简单整理了一下,记录在这里。
*/
19.在C中,在几乎所有使用数组名的表达式中,数组名的值是一个指针常量,也就是数组第一个元素的地址。请不要根据这个事实得出数组和指针相同的结论。只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。
20.只有两种场合下,数组名并不用指针常量来表示——就是当数组名作为sizeof操作符或单目操作符&的操作数时。
21.你不能使用赋值符号把一个数组的所有元素复制到另一个数组,必须使用一个循环,每次复制一个元素。
22.定义一个数组,比如int array[10];
表达式2[array],是合法的!编译器会把它转换成对等的间接访问表达式*(2 + array)。2[array]与*(2 + array)、array[2]是无差别的。但在实际使用中,绝不应该写2[array],因为它会大大影响程序的可读性。
23.数组下标表达式a[2]和指针表达式*(a + 2)可以互换。在可读性方面,下标有一定的优势,尤其是多维数组中,但下标绝不会比指针更有效率。而指针有时会比下标更有效率。
24.指针比下标更有效率,前提是它们被正确地使用。不要为了效率上的细微差别而牺牲可读性,这点非常重要。
25.函数原型中的一维数组形参无需写明它的元素数目,因为函数并不为数组参数分配内存空间。形参只是一个指针,它指向的是已经在其他地方分配好内存的空间。这也解释了为什么数组形参可以与任何长度的数组匹配——它实际传递的只是指向数组第一个元素的指针。另一方面,这种实现方法使函数无法知道数组的长度,如果需要知道数组的长度,它必须作为一个显式的参数传递给函数。
26. sizeof的用途,它用于对数组中的元素进行自动计数。如,定义了array[ ],sizeof(array)的结果是整个数组所占用的字节数,而sizeof(array[0])的结果则是数组每个元素所占用的字节数。两个值相除,结果就是数组元素的个数。
27.头文件string.h包含了使用字符串函数所需的原型和声明。尽管并非必需,但在程序中包含这个头文件确实是个好主意,因为有了它所包含的原型,编译器可以更好地为你的程序执行错误检查。
28.标准库函数有时是用汇编语言实现的,目的就是为了充分利用某些机器所提供的特殊字符串操作指令,从而追求最大限度的速度,即使在没有这类指令的机器上,你最好还是把更多的时间花在程序其他部分的算法改进上。寻找一种更好的算法比改良一种差劲的算法更有效率,复用已经存在的软件比重新开发一个更有效率。