Stanford CS Education Library #102 ## Basic Pointers
指针主要有两个用途:使不同的代码段共享信息、方便链表(树)的处理。
指针示意图:

dereference操作会根据指针的值去找到它的pointee。
NULL是一个特殊的指针值(一般是地址0),表示这个指针不指向任何pointee。

指针的赋值会使得两个指针指向相同的pointee,但pointee本身不会改变:

传指针vs传值:

定义一个指针后,这个指针是没有被初始化的:

这时候如果进行dereference操作会发生Runtime Error.
对于Java、LISP等语言,当定义一个指针时,系统会将其设置为NULL,并且会在dereference操作时检查其值,这也是Java比较慢的原因之一。

一个比较典型的指针错误:
1  | void BadPointer() {  | 
当执行*p时:

Local Memory
函数开始运行时,会为局部变量分配内存,结束运行会回收内存。
看一个错误的例子:
1  | //TAB -- The Ampersand Bug function  | 
问题在于TAB()返回了一个局部变量的地址,但这个局部变量的空间已经被回收,ptr指针没有pointee。
Reference Parameters
传值:
1  | void B(int worth) {  | 

传指针:
1  | void B(int* worthRef) {  | 

传指针在c++中可以通过传引用的方式实现:

Heap Memory
分配示意图:

释放示意图:

释放后,指针虽然还在,但却不可以在使用。
1  | //size以字节为单位,分配成功返回指针,失败返回NULL  | 


一个StringCopy()的例子:

对于分配的堆内存,只有一个负责释放的,要么是caller,要么是callee:
