《C和指针》阅读笔记-指针
无论是程序员还是计算机都无法通过值的位模式来判断它的类型。类型是通过值得使用方法隐式确定的。编译器能够保证值的声明和值的使用之间的关系时适当的,从而帮助我们确定值的类型。
声明一个指针变量并不会自动分配任何内存。在对指针间接访问前,指针必须进行初始化:使它指向现有的内存,或者它分配动态内存。对未初始化的指针变量间接访问操作是非法的,而且这种错误常常难以检测。其结果常常是一个不相关的值被修改。这种错误是很难被调试发现的。
NULL指针就是不指向任何东西的指针。它可以赋值给一个指针,用于表示那个指针并不指向任何值。对NULL指针执行间接访问操作的后果因编译器而异,两个常见的后果就是分别返回内存位置为零的值以及终止程序。除了NULL指针之外,再也没有任何内建的记法来表示指针常量,因为程序员通常无法预测编译器会把变量放在内存中的什么位置。在极少见的情况下,我们偶尔需要使用指针常量,这时我们可以通过把一个整型值强制转化为指针类型来创建它。
eg:*(int *) 100 = 25;
在指针上可以执行一些有限的算术运算符。你可以把整型值加到一个指针,也可以从一个指针减去一个整型值。在这种情况下,这个整型值会进行调整,原值将乘以指针目标类型的长度。这样,对一个指针加1将使它指向下一个变量,至于该变量在内存中占几个字节与此无关。然后,指针运算只有作用于数组中其结果才是可以预测的。对任何并非指向数组元素的指针执行算术运算(但常常很难被检测到)。如果一个指针减去一个整数后,运算结果产生的指针所指向的位置在数字第一个元素前,那么它是非法的。加法运算稍有不同,如果结果指针指向数组最后一个元素后面的那个内存位置仍是合法(但不能对这个指针执行间接访问操作),不过再往后就不合法了。如果两个指针都指向同一个数组中的元素,那么它们可以相减。指针减法的结果经过调整(除以数组元素类型的长度),表示两个指针在数组中相隔多少个元素。如果两个指针并不是指向同一个数组的元素,那么它们之间进行相减就是错误的。任何指针之间都可以进行比较,测试它们是否相等。如果两个指针都指向同一个数组中的元素,那么它们之间还可以执行<,<=,>和>=等关系运算,用于判断它们在数组中的相对位置。
eg:inti[10];int*p = &i[0];intoffset = 3;p += offset;(a)p += 3;(b)b的效率更高。