C++中指针是一个很让人头疼的东西,指针指向这儿指向那儿很容易把人搞晕了。指针实现了对象的间接访问,指针本身也是对象这点和引用不同,引用仅仅是对象的别名。指针可以在其生命周期内指向不同的对象(当然除了指针常量),另外指针无需在定义时赋值,指针也可以为空指针或者无效指针。
常用的定义方法如下:
int a=10;
Int *b=&a;//运用取地址运算符
注意:引用不是对象,没有实际的地址,所以没有指向引用的指针!
指针的值类型:
1.指向了一个对象;
2.指向紧邻对象所占空间的下一个位置;
3.空指针;
4.无效指针;(不能对无效指针操作,后果无法预计)
利用指针访问对象就是使用解引用运算符“*”,要注意的是解引用操作只能用于已经指向某个对象的指针。
空指针的产生方法:
int* p1=nullptr; int* p2=0; int* p3=NULL;//包含头文件cstdlib
注意:在使用指针的时候最好要进行初始化!使用指针前要进行非空判断!
对于指针的赋值中,难以区分的是指针的指向改变了,还是指针指向的对象改变了,很简单的方法就是看“=”的左边是指针还是其指向的对象,简单点可以看其有没有用解引用运算符“*”。对于两个指针可以使用==和!=运算符来判断是否指向了同一个对象,另外指针还可以进行“-”操作,当然在数组中才有意义,减操作能够获取到两个对象之间索引的间隔,对两个指针“+”、“*”、“/”的操作时没有意义的。另外非空指针强制类型转换布尔型为true。
关于void*指针,该指针可以存放任何对象的地址,但是不能直接使用void* 指针,在使用void*之前必须要进行强制类型转换已确定其指向的对象类型,才能进行相关的操作,简单来说void*指针仅仅代表内存空间,对其内存中存放的对象类型根本不知道。
指针和数组名的区别:
我们在使用数组的时候经常使用数组名来操作,且数组名代表了数组的首地址,感觉和指针的使用差不多,但其实数组名更包含的该数组的内存信息,指针仅仅是存放了一个地址。但需要注意的是,如果函数需要传入数组来进行操作的化,不能只传入数组名,因为编译器会将其退化成一个指针,所以在需要对数组操作的时候,形参必须要包含数组首地址以及数组长度信息。
以上是目前对于C++中指针的总结,后续会继续补充!