前言
上一章说了指针是什么玩意,现在说一下经常拿来对比的指针和引用;
引用
上文说到:指针某种程度上就代表了它所指向的对象,但是为什么说是某种程度上呢?因为它只是记录了对象的地址,如果你想访问这个对象的话,你可以通过指针来间接访问到对象,但是指针并不代表它所指向的对象。
那么再看引用,很多其他的文章经常会说过:引用是对一个对象起了一个别名。没错,可以这样认为引用就是一个绰号,比如有个童鞋叫王明明,别人给他起了一个绰号叫小明,那么小明=王明明,二者就是等同的,可以这样说:引用相比指针来说,它完全就是代表着它所指向的对象。
来看代码:
int main()
{
int A = 0;
int& B = A;
B++;
cout << "A的值是:" << A << endl;
B = 0;
cout << "A的值是:" << A << endl;
}
来看结果:
这里我定义了一个引用B指向了A,我对引用进行了一些操作,完全的反馈给了A。
但是我们把引用换成指针后
int main()
{
int A = 0;
int* B = &A;
B++;
cout << "A的值是:" << A << endl;
B = 0;
cout << "A的值是:" << A << endl;
}
再来看结果:
我擦,没变化,那给指针进行的操作都跑哪去了,我们打印一下B的值。
int main()
{
int A = 0;
int* B = &A;
cout << "B的值是:" << B << endl;
B++;
cout << "A的值是:" << A << endl;
cout << "B的值是:" << B << endl;
B = 0;
cout << "B的值是:" << B << endl;
}
看结果
看看,我们对指针的操作并没有反馈到它所指向的对象身上,而是单单对指针进行了操作,那为什么指针+1,会在原来的地址值上增加了4呢?注意:对指针+1这个操作,会让指针记录的地址往后跳,这个跳的尺度有多大呢?
int main()
{
int A = 0;
double* B = nullptr;
cout << "B的值是:" << B << endl;
B++;
cout << "B的值是:" << B << endl;
}
看结果
增加了8,这代表指针指向的地址往后移了8个字节,这个移动的幅度是根据指针类型决定的。
好了,总结一下,指针和引用的区别:
指针和引用的区别
1.指针是个独立对象,它的值是一个地址,而引用不是一个对象,它依托于一个对象,不能独立存在。
2.指针可以先声明,后面再给指针赋值,但是引用必须在声明的时候就给它赋值(也叫初始化),这个很好理解,还是那个绰号的例子,给人起绰号不能空起吧,得说某某某的绰号是啥啥啥吧,哈哈~。
3.指针可以改变其值,引用不可以中途改变,毕竟同一个绰号不能安成另外一个人头上对吧~。
4.指针占用内存,32位为4个字节,64位为8个字节,但是引用不占用内存(实际上编译器对于引用的实现也是通过指针实现的,所以按理说引用也占用内存的,这个问题我们后面再研究)。
5.指针传递其实是值传递,而引用传递不是。
好了,先说到这里啦~