1、指针变量的值是一个地址,所以显示指针与一般的操作不同。
2、可以声明几个具有相同基本数据类型的变量,它们放在用逗号分隔的名称列表中,但不能使用这种方式声明指针变量。因此,
int a,b,c;
声明了变量a 、b 和 c。但是,
char *s,t;
表示,
char *s ;char t;
而不是,
char *s;char *t;
应避免这种结构。
3、未初始化的指针变量的值是不确定的,不是NULL。
4、若 p 是一个未初始化的指针变量,对 *p 的引用就会导致不能预料的、至少灾难性的后果。
5、试图使用值为NULL的指针变量时错误的,但不一定是非法的。例如,如果 p 的值是NULL,在处理列表时,应避免使用表达式 p->item和p->next,否则会使程序运行不正确。
6、语句
p= new int ;
p = NULL;
分配一个内存单元,然后又销毁对他的唯一访问方式。若只是要为指针赋值,就不适用new 操作符。
7、delete p 解除了p 指向的节点的内存分配,但没有解除 p的内存分配。指针p 仍存在,但包含未定义的值。不应引用 p或其他仍指向已解除内存分配的节点的指针变量。为了避免这种错误,应在执行delete p 后给 p 赋予 NULL。但是,如果其他变量指向已解除内存分配的节点,仍有可能出错。
8、如果使用new 分配内存,就应使用delete 解除这个内存分配。如果使用 new[] 分配内存,就应使用delete[] 解除这个内存分配。
9、在链表头插入和删除节点是特例,使用虚拟头结点才能消除此类特例,如果没有认识到这个问题,可导致使用值为NULL的指针,这种引用是错误的。
10、必须注意,在通过指针变量 cur 遍历链表,在 cur 已经超过链表在最后一个节点后,不要再引用 cur ;此时的 cur值为NULL。例如,如果value 大于链表中的所用数组值,使 cur 的值为 NULL,则循环,
while(value>cur->item)
cur =cur->next;
将出现错误。正确的做法是编写
while((cur!=NULL)&&(value>cur->item))
cur=cur->next;
应为 c++使用逻辑表达式的短路计算,如果 cur变为NUll,则不能计算表达式cur->item。
11、双向链表是程序员常常滥用的一个数据结构。但是,在能直接访问一个节点的情况下,使用双向链表数据结构比较合适。此时,无需从头遍历链表,若链表是单向的,则没有指向前一节点的指针。而双向链表提供了到达节点前驱和后继的简单方式。这带来了许多方便,例如,可轻易地删除节点。
12、把数组作为一个参数转给函数时,函数会把指针看做数组的第一个元素,并使用这个指针访问其他数组元素。因此,对数组元素的任何赋值操作都会改变实参,而不会改变参数的副本。所以数组不能是值参数。
13、引用参数和指针参数的机制不同。指针是按值传递,创建一个指向相同内存块的副本,所以说有两个指向同一内存分配的指针,指针指向的原始值可以修改。而引用是直接使用原始值的内存地址,不是值的副本。因此,如果函数修改了该参数指向的内容,调用代码中的原始值也随之改变。