Item M1:指针与引用的区别

C++成员函数指针绑定:从编译错误到std::function与lambda实战 在C++面向对象编程中,回调机制是实现事件驱动、插件架构等模式的核心技术。其原理在于将特定操作封装为可延迟执行的函数单元,通过函数指针或可调用对象进行传递与触发。这一机制的技术价值在于实现模块间的松耦合与动态行为扩展,广泛应用于GUI事件处理、定时任务调度、异步通信等场景。然而,当涉及非静态成员函数时,直接使用普通函数指针会遇到“a pointer to a bound function”编译错误,这是因为成员函数隐式依赖this指针,无法独立调用。现代C++通过std::function与lambda表达 阅读详情

指针用操作符“*”和“->”,引用使用操作符“. ”,但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。

首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。

char *pc = 0; // 设置指针为空值

char& rc = *pc; // 让引用指向空值

/*以上代码在vs2008下生成成功,运行时出现错误*/

这是非常有害的,毫无疑问,结果将是不确定的。我们以后将忽略一个引用指向空值的可能性。因为引用肯定会指向一个对象,在C++里,引用应被初始化。

string& rs; // 错误,引用必须被初始化

string s("xyzzy");

string& rs = s; // 正确,rs指向s

指针没有这样的限制。

string *ps; // 未初始化的指针 ,合法但危险

不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。

void printDouble(const double& rd)

{

cout << rd; // 不需要测试rd,它

}              // 肯定指向一个double值

相反,指针则应该总是被测试,防止其为空:

void printDouble(const double *pd)

{

if (pd) { // 检查是否为NULL

cout << *pd;

}

}

其次,指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。

string s1("Nancy");

string s2("Clancy");

string& rs = s1; // rs 引用 s1

string *ps = &s1; // ps 指向 s1

rs = s2; // rs 仍旧引用s1,

// 但是 s1的值现在是

// "Clancy"

ps = &s2; // ps 现在指向 s2;

// s1 没有改变

在以下情况下你应该使用指针:

一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空)

二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。

以下情况应该使用引用:

(1)总是指向一个对象并且一旦指向一个对象后就不会改变指向。

(2)当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。

vector<int> v(10); // 建立整形向量(vector),大小为10;

// 向量是一个在标准C库中的一个模板(见条款M35)

v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值

如果操作符[]返回一个指针,那么后一个语句就得这样写:

*v[5] = 10;

但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。(这有一个有趣的例外,参见条款M30)

Qt C++智能指针实战指南:告别内存泄漏与悬空指针 在C++编程中,内存管理是开发者必须面对的核心挑战,尤其涉及动态内存分配时,手动管理极易引发内存泄漏和悬空指针问题。RAII(资源获取即初始化)是一种重要的编程范式,通过将资源生命周期与对象作用域绑定,确保资源自动释放。智能指针技术正是RAII思想的典型实践,它通过封装原始指针并引入所有权语义(如独占所有权、共享所有权),自动化内存管理,显著提升代码安全性与可维护性。在Qt框架开发中,内存管理更具特殊性,需协调C++对象与Qt对象模型。本文聚焦Qt C++开发场景,深入解析QScopedPointer、QS 阅读详情

相关推荐

用Python实现图片风格迁移,让你的图片更加的高逼格!

先来看下效果: 上图是老王在甘南合作的米拉日巴佛阁外面拍下的一张照片,采用风格迁移技术后的效果为: 一些其它效果图: 下面进入正题。 近年来,由深度学习所引领的人工智能(AI)技术浪潮,开始越来越广泛地应用到生活各个领域。这其中,人工智能与艺术的交叉碰撞,在相关技术领域和艺术领域引起了高度关注。就在上个月,由电脑生成的艺术品在佳士得(Christie’s)的拍卖价竟高达43.25万美元,...

Python追梦 6180

指针和引用的区别

说明:1、转至http://blog.youkuaiyun.com/dujiangyan101/archive/2008/08/28/2844138.aspx2、根据评论内容修改了文章中的某些部分:     (jjqldyt)引用是一个内容可以改变自身不能改变的指针。加上const即常引用是内容也不能变了。    (woolfzhu)C 中指针和引用的物理实现是一回事,都是内存地址;两者的区别是在编译时编译器无法对指针操作进行类型检查,而对引用可以。这也是引用更安全的原因。(1)引用总是指向一个对象,没有所谓的 nul

慢慢的前进 671

安装matlab_Matlab+yalmip+cplex安装教程及算例

数学建模/科研学习推荐学习软件:Matlab+yalmip+cplex安装教程及算例其实绝大多数本科生都是在用Matlab和LINGO求解优化问题,Matlab可以求解一般优化问题,但是当优化问题规模比较大或者在应对一些非线性问题时候,Matlab会出现求解时间长,求解效率低,甚至难以求解等问题。Matlab+yalmip+cplex是Matlab通过调用商业软件cplex求解,求解时间短,这里简...

weixin_28939637的博客 5005

《more effective c++》Item M1:指针与引用的区别

指针和引用的区别 (1)引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针.  由于C++ 要求 reference 总是指向一个对象所以 reference要求有初值.  String & rs = string s1;  由于没有所谓的 null reference 所以所以在使用前不需要进行测试

coding life 883

Nettrace 源码分析

文章介绍:本文将围绕腾讯开源项目nettrace工具中数据采集,数据处理,数据分析三个模块深入源码分析其实现细节

abobob的博客 989

外设高级定时器互补输出带死区控制实验

外设高级定时器互补输出带死区控制实验

ff_juju的博客 1652

More Effective C++之 Item M1:指针与引用的区别

指针与引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“. ”),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针...

janeqi1987的专栏 165

智能检查点优化:动态频率与差异化存储的断点续训实践(模型训练丨容错机制丨人工智能)

本文深入探讨了大规模模型训练中智能检查点优化的核心实践。针对传统固定频率保存导致的存储浪费与恢复缓慢问题,提出了基于损失变化率的动态频率算法与分层差异化存储策略。通过PyTorch代码示例,详细展示了如何实现动态调度与增量保存,有效降低存储成本,并确保训练中断后能快速、可靠地恢复,显著提升训练任务的容错能力与经济效益。

weixin_29072299的博客 333

《More Effective C++》 Item M1:指针与引用的区别

C++中指针与引用的区别主要体现在两点:引用不可以指向空值、引用总是指向初始化时指定的对象。 1、因此,当你使用一个变量并让它指向一个对象,但是该对象有时可能也不指向任何对象时,应该把该变量声明为指针;相反如果变量肯定指向一个对象,不允许变量为空,此时应把变量声明为引用。但是,如下情况应该注意: char *pc = 0; // 设置指针为空值 char& rc = *

ZhangXL的专栏 524

《时序分析、时序约束和时序收敛》专栏的说明与导航

《时序分析、时序约束和时序收敛》专栏的说明与导航(建议阅读)。

孤独的单刀 14万+

10、网络安全工具:Bettercap 与 Web 应用测试工具全解析

本文详细解析了网络安全工具Bettercap及其在中间人攻击和无线攻击中的应用,同时介绍了多种Web应用测试工具,如Amass、Cadaver、Dirb等,并探讨了工具的使用场景、流程、注意事项以及未来发展趋势,为网络安全测试提供了全面的指导。

u0v1w2x3的博客 226

more effective c++之Item M1:指针与引用的区别

1.参数为引用不用判断为空,指针需要判断空指针; 2.有些函数返回应用比返回指针从语法和形式上更好,例如重载operator [ ]。 指针与引用看上去完全不同(指针用操作符“*”和“->”,引用使用操作符“. ”),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能使用指向空值的引用。

janeqi1987的专栏 342

Windows窗口编程中的WM_PAINT、WM_ERASEBKGND、InvalidateRect、UpdateWindow、BeginPaint和EndPaint等函数详解

Windows窗口编程中的WM_PAINT、WM_ERASEBKGND、InvalidateRect、UpdateWindow、BeginPaint和EndPaint等函数详解

dvlinker的技术专栏 7165

编程交流与学习--More Effective C++的学习-Item M1:指针与引用的区别

1在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。2不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需

662

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++引用与指针的核心区别及应用场景解析

在C++编程中,内存访问机制是核心基础概念。引用和指针作为两种间接访问方式,虽然底层都涉及地址操作,但设计哲学和使用场景存在本质差异。从实现原理看,指针是存储地址的独立变量,而引用作为对象别名受到编译器严格约束。这种差异带来显著的技术价值:引用提供更安全的语法糖,避免空指针风险;指针则保留灵活的内存操作能力。在函数参数传递、返回值优化等高频场景中,const引用能显著提升代码可读性,而智能指针体系解决了资源管理难题。现代C++11引入的右值引用和移动语义,进一步扩展了引用在性能优化中的应用边界。理解这两种机

weixin_33829657的博客 377

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++指针与引用的本质区别及应用场景详解

指针和引用是C++中实现间接内存访问的核心机制。从计算机科学角度看,指针本质是存储内存地址的变量,支持算术运算和重定向;而引用则是变量的别名,提供更安全的访问方式。在底层实现上,编译器通常将引用优化为指针,但施加了必须初始化、不可重绑定等约束。这种差异使得引用在函数参数传递、操作符重载等场景中更具优势,而指针在动态内存管理和低级操作中不可替代。现代C++开发中,理解const引用、智能指针等特性对编写高效安全代码至关重要。特别是在处理大型对象传递和资源管理时,合理选择指针或引用能显著提升程序性能和可靠性。

weixin_30565199的博客 323

面试题(18)|C/C++基础(10):智能指针

智能指针是否线程安全? 这里的智能指针单指shared_ptr shared_ptr对象提供与内置类型相同级别的线程安全性: 1.同一个shared_ptr对象可以被多个线程同时读; 2.不同的shared_ptr对象可以被多个线程同时修改,即使这些shared_ptr对象管理着同一个对象的指针. 3.任何其他并发访问的结果都是无定义的. shared_ptr线程安全性分析 ...

haimianjie2012的专栏 1309

C语言指针核心概念:void指针、指针数组与数组指针详解

指针是C语言中直接操作内存的核心机制,通过内存地址访问数据实现高效编程。void指针作为通用指针类型,通过类型转换实现灵活的数据处理,常见于qsort等标准库函数。指针数组管理多个指针的集合,适合处理字符串列表等场景;而数组指针则专门指向多维数组,在矩阵运算中表现优异。理解这些指针类型的区别对嵌入式开发和系统编程尤为重要,能有效避免内存错误并提升性能。本文通过实际案例解析这三种指针的内存模型、运算特性和最佳实践,帮助开发者掌握C语言最强大的底层特性。

weixin_30378623的博客 402

C++引用机制详解:从概念到实战应用

在C++编程中,引用(Reference)是一种为已存在变量创建别名的核心机制,它通过绑定到特定变量实现间接访问。从底层实现看,引用通常由常量指针实现,但提供了更高级的语法抽象和安全保障。这一机制的技术价值在于提升代码安全性和可读性,避免了指针常见的空指针和野指针问题。在函数参数传递场景中,引用能有效避免大型对象拷贝带来的性能开销,同时通过常量引用支持只读访问。在C++11引入的范围for循环中,引用成为高效遍历容器的关键。理解引用与指针的本质区别,掌握常量引用的生命周期扩展特性,是编写高效、安全C++代码

weixin_30919571的博客 327

More Effective C++:Item 1-Item 8读书笔记

Item M1:指针与引用的区别 在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向 Item M2:尽量使用C++风格的类型转换 static_cast在功能上基本上与C风格的类型转换一样强大,含义也一样; const_cast用于类型转换掉表达式的const...

部落阁 407

C语言没有引用传递?揭秘指针如何实现等效引用

在编程语言中,'引用传递'常被误解为一种独立传参机制,实则本质是间接访问内存的语法糖。C语言虽不提供引用语法,但通过指针实现了完全等效的语义:指针按值传递地址,再经解引用操作访问原始内存,兼顾安全性与控制力。这种设计体现C对内存模型的显式暴露和确定性承诺,使其在嵌入式、系统编程等强调性能与可控性的场景中不可替代。理解指针与值传递的关系,是掌握函数参数行为、避免悬空指针、正确处理结构体和数组传参的关键基础。本文结合栈帧布局、地址运算与真实固件案例,解析C语言如何用最简原语支撑复杂内存契约。

weixin_30918633的博客 397

Go语言JSON序列化与指针使用详解

JSON序列化是数据交换的核心技术,通过将内存数据结构转换为字符串实现跨平台传输。Go语言的encoding/json包提供Marshal/Unmarshal函数实现这一过程,其底层原理与指针机制密切相关。在序列化时,值类型和指针类型都能被正确处理,而反序列化必须使用指针才能修改目标变量。这种设计源于Go的值传递特性 - 函数参数总是副本传递,只有指针能跨越这一限制。在实际开发中,合理使用指针能优化JSON处理性能,特别是在处理大型结构体或实现自定义序列化逻辑时。理解这些机制对构建高性能API服务和微服务架

weixin_33937778的博客 390

Go语言指针实战指南:从内存原理到高效编程避坑

在编程语言中,指针是理解内存管理和数据传递的核心概念。它本质上是一个存储内存地址的变量,通过地址间接访问和操作数据,这种机制为程序提供了直接操作内存的能力。从原理上讲,指针实现了数据的共享和高效传递,避免了不必要的大数据复制,从而提升了程序性能。其技术价值在于实现灵活的数据结构、支持底层系统交互以及优化内存使用。在工程实践中,指针广泛应用于函数参数传递、结构体方法设计、动态数据结构构建等场景。特别是在Go语言开发中,指针的正确使用关系到代码的性能、并发安全性和内存效率。本文结合值类型与引用类型、结构体方法接

conghuang7343的博客 388

Item18:让接口容易被正确使用,不易被误用

好的接口很容易被正确使用,不容易被误用。应该在所有接口中努力达成这些性质。 “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容。“阻止误用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。 tr1::shared_ptr支持定制型删除器(custom deleter)。这可防范DLL问题,可被用来自动解除互斥锁(mutexes;见条款14)等等。

jdududu的博客 129

Day1-右值引用与移动语义:从拷贝到移动的范式革命

场景做法原因返回局部对象return obj;依赖 NRVO/隐式移动,不要加std::move返回临时对象return T{};prvalue,C++17 强制消除拷贝向容器插入右值避免拷贝,直接移动容器间转移元素当元素确定不再需要时移动构造函数标记noexcept保证 STL 容器 realloc 时选择移动移动赋值运算符包含自赋值检查防止delete[]后资源丢失在类中声明析构函数同时声明移动操作避免编译器不生成默认移动操作参数按值传递调用方决定拷贝还是移动。

如风逝去 341

Python列表底层原理:指针数组与四大操作陷阱解析

Python列表并非传统数组,而是由对象引用指针构成的动态数组,其内存结构决定了索引O(1)、扩容均摊O(1)但存在显著内存开销。理解这一指针本质,是规避赋值共享、+=原地修改、pop(0)性能雪崩、切片与索引安全边界等高频问题的关键。结合CPython实现机制,该结构支撑了列表推导式的编译器级优化,并自然引向array.array和numpy.ndarray等同构数据场景的高效替代方案。

weixin_34111790的博客 465
上一篇: DM论坛网站博客
下一篇: 博客网址大全
生无涯
博客等级 码龄16年 62粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值