恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
指针 vs 引用
首页
资讯中心
/
指针 vs 引用
指针 vs 引用
发布时间:2026/8/25 16:55:09
旨在理解指针和引用的区别Persona(张三);Person*pa;//指针Personra;//引用定义方式• 指针Person* pp 是独立变量存对象的地址p 自己有内存。• 引用Person r ar 仅仅是对象 a 的别名引用本身不占用独立内存编译器层面逻辑上没有独立实体。• 引用定义的时候必须初始化绑定对象不能先声明后赋值。Personr;//❌编译报错引用必须初始化Person*p;//✅指针可以先定义后面再赋值 pa能不能改变指向绑定目标• 指针可以p b;让指针指向另一个对象。• 引用一旦绑定永远不能换绑定对象。注意r b;不是改变引用绑定等价a b是赋值给原对象 a。Persona(a),b(b);Personra;rb;//❗不是r绑定b把b拷贝赋值给ar依旧是a的别名。是否可以为 NULL / 空• 指针Person* p nullptr; ✅允许可以是空。• 引用不允许为空引用一定绑定一个有效对象。• 工程上引用天然保证不为空指针要时刻判断nullptr。使用语法• 指针解引用p访问成员p-setName()• 引用直接像对象一样用r.setName()不需要、-const 修饰的行为重点const Person* p; //指针指向const对象指针可改指向Person* const p; //指针本身const不能改指向//引用没有“普通引用const”这种写法Person const r a; // ❌语法非法引用天生不能改绑定加const无意义。实测vs2015编译可以通过但是报warning C4227: 使用了记时错误: 忽略引用上的限定符好像标准c缺少不允许这么写。msvc微软编译器的兼容扩展跨平台不能这么写。本身没有意义。const Person r a; // ✅const引用被引用的对象只读sizeof 结果• sizeof§得到指针本身大小x64 为 8 字节。• sizeof®得到原对象 Person 的大小不是引用大小。引用逻辑上没有独立内存sizeof 看的是它绑定的实体。拷贝行为Person* p1 a;Person* p2 p1; //拷贝指针的值地址两个指针指向同一个aPerson r1 a;Person r2 r1; //r2也是a的别名没有拷贝对象没有构造没有拷贝构造没有拷贝赋值运算。函数参数场景对比//指针有可能传入nullptr函数内部要判空void funcPtr(Person* p) { if(nullptr p) return; p-print(); }//引用一定是有效对象不需要判空void funcRef(Person r) { r.print(); }对比项指针 Person* p引用 Person r初始化可以先定义后赋值定义时必须绑定对象能否为空nullptr 合法绝不允许为空能否改变指向目标✅pb可以修改指向❌绑定后永远不能更换目标语法访问对象*pp-xxx直接 r.xxxsizeof得到指针本身大小 (8 字节 x64)得到原始对象大小const 语法const Person* / Person* const两种只有const PersonPerson const非法内存指针变量自己占内存逻辑上只是别名无独立内存传参需要考虑判空一定有效无需判空