引用的本质是什么 引用的本质是什么 引用的本质是什么
计算机的存储,只有地址和空间,简单的说就是一个地址代表一个最小内存空间8bit
内存是以字节为单位进行编址的,内存中的每个字节都对应一个地址,通过地址才能找到每个字节。
有了这个概念以后看下面的代码
int a = 1
这个时候 int a = 1
,int
代表什么意思呢?
int的存储大小是4个字节,所以在这里int
就是代表了a这个变量的存储空间要有4个字节
引用的本质是指针
引用是个别名…引用作为目标的别名而使用…引用不是值不占存储空间…引用只有声明,没有定义…
在编译器将你的代码生成目标文件时,它会用这个地址替代所有的a,因此目标文件中也就没有变量名a了,所以,变量名a不会占用内存。
首先,我们需要澄清几个概念。
指针常量:这是一个指针,其指向的地址在初始化后不能改变,但指向的内容(即该地址上的值)是可以改变的。换句话说,你不能让这个指针指向另一个地址,但你可以改变它当前指向地址上的值。
例如:
c
int x = 10;
int *const ptr = &x; // 这是一个指针常量
*ptr = 20; // 这是允许的,因为我们改变了ptr指向的内容
ptr = &y; // 这是不允许的,因为ptr是一个指针常量
常量指针:这是一个指针,它指向一个常量值,也就是说你不能通过这个指针来改变它指向的内容,但你可以让这个指针指向另一个地址。
例如:
c
const int x = 10;
const int *ptr = &x; // 这是一个常量指针
// *ptr = 20; // 这是不允许的,因为ptr指向一个常量
ptr = &y; // 这是允许的,因为ptr本身不是一个常量
现在,关于“引用”的概念:
在C++中,引用(reference)不是一个指针类型,但它与指针有相似的行为。引用是一个已存在变量的别名,也就是说,引用和变量共享相同的内存地址。一旦一个引用被初始化,它就不能再被重新引用到另一个对象上(这与指针常量相似)。同时,你不能通过引用来改变它所引用的对象的类型(这与常量指针的某种限制相似,尽管不完全相同)。但是,你可以通过引用来改变它所引用的对象的值(除非该对象本身是一个常量)。
例如:
cpp
int x = 10;
int &ref = x; // 这是一个引用
ref = 20; // 这是允许的,因为我们改变了ref(也就是x)的值
// ref = y; // 这是不允许的,因为引用一旦初始化就不能再指向另一个对象
所以,从某些方面来说,引用在某些行为上类似于指针常量
(即你不能让引用指向另一个对象),但从另一方面来说,它又不完全等同于指针常量或常量指针,因为它与它所引用的对象共享内存地址,并且可以通过引用来改变该对象的值(除非该对象是常量)。