(主要整理的是个人不太懂的地方)
野指针和悬空指针
指针指向了一块随机的空间,不受程序控制。
-
野指针:未初始化的指针,其指针内容为一个垃圾数,不能确定其具体指向。野指针不能判断是否为NULL来避免。要避免只能记得赋初值。
-
悬空指针:指针正常初始化,曾指向一个对象,该对象被销毁了,但是指针未制空,那么就成了悬空指针。
- 因为在 free§ 之后,p 指针仍然指向之前分配的内存,如果这块内存暂时可以被程序访问并且不会造成冲突,那么之后使用 p 并不会引发错误。
- 为了避免出现“悬空指针”引发不可预知的错误,在释放内存之后,常常会将指针 p 赋值为 NULL:
指针常量和常量指针
- 指针常量:指针类型的常量,指针本身是个常量。指针本身不可以改,但指向的内容可以改。
int* const p = &a
,即指针类型是int *,但是该指针是个 const。 - 常量指针:指向常量的指针。指针本身可以改,就是可以指向另一个地址,但指针指向的该块地址的内容不能改。
const int *p = &a
或者const int *p = &a
,即指针指向的类型是 const int,是个常量。
函数指针和指针函数
- 指针函数:返回指针的函数
- 函数指针:指向函数的指针
指针和引用的区别
- 本身内容上:指针指向一块内存,指针所存内容为所指内存的地址;引用是某块内存的别名,就是这块内存的另一个名字,跟原来的名字算是一样的,都指的这块内存
- 可否改变:指针所指向的内存空间可以改变,就是可以改成指向另一块内存空间;引用所绑定的对象一旦绑定就不能改变了
- 是否占空间:指针本身在内存中占有内存空间;引用相当于变量的别名,在内存中不占空间(变量本身是已经有了,引用只是给了一个名字)
- 可否为空:指针可以为空(没指向内存空间的空指针);引用必须绑定对象
- 可否多级:指针可以有多级(指针的指针);引用只能一级(就不能有引用的引用,因为本身不是一个变量)