小知识:C++指针与引用的区别
对C++当中的指针和引用,用时还是分不清,C++里面为什么要有这两种概念呢,分为能解决什么样的问题呢,类比来看呢,Java或C#这样的高级编程语言里面,为什么没有出现指针这个东西呢,只有引用这个概念?
我们来看一个例子
Java当中传递是引用,指向的都是同一个对象,所以,o.getName()得到的是Samuel。
在C++中,因为参数传递的不是引用,而是拷贝,所以o.getName()的结果是空。
如果我们希望也像Java当中,拿到我们修改的东西,我们需要在参数前面加一个取地址符号&,变成引用,这样本质上指向的是原本对象,而不是拷贝出来的对象。这种情况下我们用到了引用。
那引用和指针的区别又在哪里呢?
前面我们把引用当作内存当中的首地址,它是一个别名。
但是指针,我们要把Obj 看成是一个完整的一个整体。我们要把指针看成一个类型。所以这里,这个o是Obj 类型,它是指针类型。我们在前面讲C++的时候讲到过一个比较重要的概念,就是那几种类型转换:dynamic_cast(RTTI),static_cast,强制转换(reinterpret_cast),cost_cast.
我们现在看reinterpret_cast,它可以把C++任何一种类型转换成我想要的类型。不管转换出来的东西有没有用,反正都能转。所以大家要注意,指针本质上是一个长度为4字节的内存区域。它里面存的是一串数字,如:0x0000FDE1,那这串数字又是什么,是不是地址,存储的内存地址。我们通常讲的int32_t,也是4个字节,我们现在用reinterpret_cast把这个.o转换成int32_t.我们发现它本质上就是一串数字。那这串数字是什么东西呢,它指向一块特定内存区域,那块内存区域的首地址,它指向的是内存当中的另外一个地方。
所以,大家可以看到引用和指针的区别在哪里?
int i = 100;
引用的写法:&i,拿到的是100的地址;
而我们想把这个地址存起来,我们用:
int* iPtr = &i;
这里我们可以看到,引用是一个值,而指针是一个变量
。
我们为什么要在C++当中去区分指针和引用?
关键,归根结底我们希望灵活。我们希望通过指针和引用来实现不同的功能或者场景。 大家考虑一下我们刚刚前面的例子,我在参数前面写了一个&,这个场景是非常管用的。我只是用别名 .o,我没有创建指针,我直接去操纵别名的。那如果我创建指针会有什么用呢。
假如,机器学习中,我们需要导入大量图片去做训练,那这些图片放在内存里面我怎么取管理它呢,每一张图片需要一块内存去存储它,前面文章谈卷积神经网络的时候,我们是不是把位图比作一个矩阵,通过数字来定义的这样一个矩阵,每个图片image是一个矩阵,所以会有无数个矩阵,我们放在C&