C++左值引用与指针的区别及说明
目录
- C++左值引用与指针的区别
- 很多朋友遇到过这个问题
- 先从定义说起
- 看看下面的例子
- 通过上面的例子得到如下结论
- 总结
C++左值引用与指针的区别
很多朋友遇到过这个问题
左值引用与指针有哪些区别?
脑子里闪过很多答案,但大部分都是各自的定义,真要说他们两个有什么区别,有的时候还这是说不上来。
本文针对这个问题进行归纳总结,希望对大家有所帮助。
先从定义说起
- 左值引用:左值引用是一个别名,只能绑定左值,对左值引用的访问与访问左值是相同的
- 指针:指针是一个变量,这个变量在内存中存在真是的物理地址,该变量内的存储的是一个内存地址,访问指针变量对应的内容需要配合解访问符*
看看下面的例子
void rreftTest(int&& ref) { std::cout<<"ref = "<<ref<<std::endl; } int mhttp://www.devze.comain(int argc, char *argv[]) { cout<<endl; int x = 42; int& ref = x; int* ptr = &x; int&& rref = 4; // 输出地址 std::cout << "x的地址: " << &x << std::endl; std::cout << "ref的地址: " << &ref << std::endl; std::cout << "ptr的地址: " <&tJeQXglt; &ptr << std::endl; std::cout << "ptr指向的地址: " << ptr << std::endl; std::cout << "rref指向的地址: " << rref << std::endl; std::cout << "rref指向的地址: " << &rref << std::endl; rreftTest(rref); // 输出大小 std::cout << "引用的大小: " << sizeof(ref) << std::endl; // 与int相同 std::cout << "指针的大小: " << sizeof(ptr) << std::endl; // 通常是4或8字节 return 0; } //输出如下所示编程客栈:javascript x的地址: 0x63fdbc ref的地址: 0x63fdbc ptr的地址:: 0x63fdb0 ptr指向的地址: 0x63fdbc rref指向的地址: 4 rref指向的地址: 0x63fdec 引用的大小: 4 指针的大小: 8
通过上面的例子得到如下结论
- 左值引用不占用额外内存空间,它的地址与引用的左值地址相同;指针则不同,指针需要额外的内存空间来存储地址
- 引用必须在定义时初始化;指针变量可以不在定义时初始化
- 引用初始化绑定左值后,无法再重新绑定左值;指针则可以
- 不存在引用的引用,指针则可以
具体的例证程序如下:
//初始化 void initializationDifference() { int x = 42; // 引用必须在声明时初始化 int& ref = x; // 正确 int& ref2; // 错误!引用必须初始化 // 指针可以后续初始化 int*http://www.devze.com ptr; // 正确 ptr = &x; // 正确 } void rebindingTest() { int x = 42; int y = 24; // 引用一旦绑定就不能改变 int& ref = x; ref = y; // 这是赋值操作,不是重新绑定 // 指针可以随时改变指向 int* ptr = &x; ptr = &y; // 改变指针指向 } //重复引用 void multiLevelTest() { int x = 42; // 不存在引用的引用 // int& & ref; // 错误! // 可以有多级指针 int* ptr = &x; int** pptr = &ptr; // 正确 }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论