先谈一谈const指针有关的内容。
主要有两种:
1、指向const类型的指针(指针可以指向其他对象,但是指针指向的对象必须是const,不能被修改)
2、const指针(指针指向的对象的内容可以被修改,但是指针不能指向其他的对象)
表达分别是:
1、const int* p;(推荐), int const* p;(两种都可以表示指向const类型的指针,推荐第一个表达方式)
2、int* const p(只有这一种表达方式,const指针)
1、有空指针,但没有“空引用”
2、有指针的指针,但没有引用的引用
3、有函数指针,但没有函数的引用
4、有指针数组,但没有引用的数组
5、指针有 void * 类型,引用没有。
6、指针是一个实体,而引用仅是个别名
1、const 引用可以绑定到右值(rvalue),而指针必须指向一个地址。
example:
1.1)const int &r = 0; // 初始化为常量
1.2)c++ 类中常用的,用 const 引用引用到临时对象
====================================================================
再说一个 const 引用跟 const 指针行为不同的:
绑定到不同类型时,const 引用会绑定到临时变量上,而对指针则不是:
主要有两种:
1、指向const类型的指针(指针可以指向其他对象,但是指针指向的对象必须是const,不能被修改)
2、const指针(指针指向的对象的内容可以被修改,但是指针不能指向其他的对象)
表达分别是:
1、const int* p;(推荐), int const* p;(两种都可以表示指向const类型的指针,推荐第一个表达方式)
2、int* const p(只有这一种表达方式,const指针)
记忆规则:*在const右边的时候表示指向const类型的指针,*在const左边的时候表示const指针。
或者可以这样理解,如 const int时把const int两个词当做一种数据类型(而不是单单看成int),所以这种数据类型的内容就没有const的限制了,但是指针指向的对象也要是const int才可以。
当然还有例如const int* const p;int const* const p;之类的。
引用:本质上是内存空间的别名,也就是该内存空间的另一个名字,所以引用和内存空间是绑定的,不能被拆散(真爱!!),所以引用天生加有const。
所以第一个区别,指针可以改变指向的地址,而引用至死不渝,所以指针需要不停地改变指向的对象的时候不能用引用。
同时,引用必须被初始化,而指针只定义不初始化。
指针和引用的其他区别,主要有以下几点:1、有空指针,但没有“空引用”
2、有指针的指针,但没有引用的引用
3、有函数指针,但没有函数的引用
4、有指针数组,但没有引用的数组
5、指针有 void * 类型,引用没有。
6、指针是一个实体,而引用仅是个别名
1、const 引用可以绑定到右值(rvalue),而指针必须指向一个地址。
example:
1.1)const int &r = 0; // 初始化为常量
1.2)c++ 类中常用的,用 const 引用引用到临时对象
====================================================================
再说一个 const 引用跟 const 指针行为不同的:
绑定到不同类型时,const 引用会绑定到临时变量上,而对指针则不是:
int main()
{
float f = 0.0;
const int *p = (const int *)&f; // 不同类型的指针绑定
const int &r = f; // 不同类型的引用绑定
cout << (int)f << " " << *p << " " << r << endl;
f = 1.0;
cout << (int)f << " " << *p << " " << r << endl;
}
改变了 f 的值之后,*p 的值改变了,而 r 的值还是 0.
因为在 r 实际上绑定到了一个值为 0 的 int 类型的 tmp 对象上去了。