链表(基础)

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、引用参数和指针参数的机制不同。指针是按值传递,创建一个指向相同内存块的副本,所以说有两个指向同一内存分配的指针,指针指向的原始值可以修改。而引用是直接使用原始值的内存地址,不是值的副本。因此,如果函数修改了该参数指向的内容,调用代码中的原始值也随之改变。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值