1.指针常量和常量指针
(1)char const *p; const char *p; 此二者等价。
当指针符号*在const之后时,p是一个指向整形常量的指针,指针指向的是一个常量,该常量的值不能被改变,但是可以修改指针的指向。
const char *p=”abcd”;
p=”hello” //改变了该指针的指向,合法
p[1]=’c’; //修改指针指向的内容,不合法
(2)char *const p;
指针符号*在const之前,p是一个指向整形的常量指针,指针指向的值可以改变,但是指针本身是常量,所以指针的指向不能改变。
char *const p=”abcd”;
p=”hello”; //改变了该指针的指向,不合法
p[1]=’c’; //修改指针指向的内容,合法
(3)char const *const p; //指向常量的常量指针,既不能改变指针的指向,又不能修改指针指向的内容。
2. 指针数组/数组指针 指针函数/函数指针
int *p[10] 是一个指针数组,数组有10个元素,数组成员是指向整形的指针。(因为[]优先级高于*)
int(*p)[10] 代表一个指向整型数组的指针。
int*f() f是一个函数,返回一个指向int的指针。
int(*f)() f是一个指针,指向一个返回int的函数。
int*(*f)() f是一个指针,指向一个返回int型类型指针的函数。
int (**d)[10] d是一个二级指针,指向一个一维数组的指针,数组元素是int型的。
double *(*g)[10] g是一个指针,指向一个一维数组,数组元素是double*类型。
double(*f[10])() f是一个数组,f有十个元素,元素都是函数的指针,指向的函数类型没有参数,返回double型值。
int(*(*f)(int,int))(int) f是一个函数的指针,指向的函数类型是由两个int型参数并且返回一个指针函数的函数。返回的指针函数指向有一个int参数且返回int值的函数。
3.C++中的迭代器
const迭代器:迭代器不能指向其它的元素,但是迭代器指向的元素值可以改变。
const_iterator: 迭代器访问的对象是常量,指向的对象不能修改。但是可以改变迭代器的指向。
4.引用和指针区别
(1)非空区别。引用是对象的别名,定义引用时必须要初始化。但是可以定义一个空指针。
(2)可修改区别。给引用赋值修改的是该引用所关联的对象值,且引用初始化后就始终指向一个特定的对象。给指针对象赋值修改的指针对象的本身,指针对象可以指向其它对象。
(3)合法性区别。使用引用前不用检查它的合法性,使用指针变量需要检查合法性。
5. 迷途指针/野指针的成因
(1)指针变量没有初始化。
(2)对一个指针进行delete操作后,没有把它置为空。这时候指针会指向不可用的内存。
6. 指针使用时需要注意的问题
(1)指针变量声明时最好初始化。(指针创建时不会自动生成NULL指针,它的缺省值是随机的。)
(2)指针的加减运算移动的是指针所指类型的大小。
(3)malloc new为指针分配空间后应该判断内存分配是否成功,并对新分配的内存初始化。
(4)如果指针指向的是一块动态分配的内存,那么指针在使用完后需要释放内存,做到谁分配谁释放,防止内存泄露。
(5)指针在指向的动态内存释放后应该重新置为NULL,防止野指针。