之前学习C语言就头疼指针,java目前学习的方向对指针的作用也仅仅是new对象在堆中,参数传递在堆栈段而已。
引用
引用必须初始化
eg:
int a=1024;
int &A=a;
int &A1//错误,未初始化
一般初始化变量,初始值会被拷贝到新建对象。引用是将初始化值与引用绑定
引用并非对象,相反的,他只是为一个已经存在的对象起了一个别名
A=2;//把2赋值给指向a的对象,即a=2
int b=A;与b=a一致。
引用不是对象,所以不能定义引用的引用。
引用只能绑定到对象上,而不能绑定到字面值与某个表达式结果。
指针
指针是指向另一个类型的复合类型。与引用不同在于,指针本身是一个对象,允许对指针的拷贝与赋值,而且在指针的生命周期中,它可以先后指向不同的对象,其二,指针无需赋初值,未付初值时也会有默认初值。
int *pi,*p2;//指向int类型的指针
获取对象地址
运用取地址符&
int a= 42;
int *p=a;//
指针必须匹配指针(除两种特殊情况)
double dval;
int *pi=pd;//值不能赋地址
pi=&dval;//地址不能赋给值
指针的值 (即地址)应属下列4种状态:
1.指向一个对象。
2.指向一个对象的下一个临接位置。
3.空指针,未指向任何一个对象。
4.无效指针,也就是上述提到的其他值。
利用指针访问对象
如果指针指向了一个对象,则允许使用解引用符(操作符*)来访问对象:
int ival=42;
int *p=&ival;//p存放着变量ival的地址,或者说p指向变量ival的指针
cout<<*p;//*符号得到指针P的对象,输出42.
*p=0;
cout<<*p;
空指针
空指针不指向任何一个对象,在试图使用一个指针之前代码可以首先检查是否为空。生成空指针的方法:
int *p1=nullptr;
int *p2=0;
//首先需要#include cstdlib
int *p3=null;
NULL预处理变量,不属于std命名空间,它由预处理机负责管理,所以无需加std::。
建议初始化所有指针,因为一旦未指定,指针所指所占的内存空间会被看做是一个地址值,访问该指针,相当于访问一个本不存在的位置上的不存在的对象,如果所占空间恰好有内容,内容被当成地址,无法分辨是否合法与非法。
赋值和指针
引用和指针都能间接访问对象,但是引用不是对象,和最初的对象进行绑定后,每次对引用的访问都是访问他最初的对象。
赋值永远改变的是等号左边的对象
void*指针
void指针是一个特殊指针,它可以存放任意对象的地址,一个void指针存放着一个地址,这一点和其他指针类似,不同的是,我们对该地址到底存放什么对象并不了解。
函数输入输出不能用void*指针,因为我们不知道他存放的是什么值。