参数类型*&是什么意思?
前两天摸鱼聊天的时候遇到一个问题,一个链表的函数中,有一个参数显得很奇怪
(大概是一个样子的)ListNode<T>*& l
这个参数l除了用了一个*之外还用了一个&,直觉上*&是一个解引用一个取地址,似乎应该相互抵消,但是那样这样的代码就毫无意义,既然没有意义作者也没有必要这样去写,因此这肯定是一个特殊的用法,事实上,我之前在stl源码剖析中遇到过这个,但是之前我将它这样解释:因为*的运算优先级比较低(在我的印象中,*一直很低,但是和&谁先我并不清楚,导致了之后的一个错误理解),所以我认为是这样解释的:ListNode<T>* (&L),那么就是首先提取L的地址,传入的就是一个ListNode对象的地址,然后再解引用,让L成为一个单纯的对象,这样可以省去一个构造函数和一个析构函数成本。然而当有人提到这个问题的时候,我却发现这个解释有点站不住脚,因为我是凭印象认为*解引用的优先级比较低,然而那是针对加减之类的运算符而言的,与&的关系我并不明确;而且传入一个地址,L却这样神奇的转化成了一个对象,有点太过玄幻。
于是我百度了一下,发现应该是这样解释的:(ListNode<T>*)& l,即将ListNode<T>*整个的作为一个类型,并将l设置成这样的一个类型的引用。
那么这个l的实际意义其实是一个指针的引用,这个指针的类型是ListNode<T>*
需要注意的是,它与ListNode<T>* l的区别:
乍看之下对一个指针用引用有点奇特,但是根据指针也只是一个变量来分析,可以想到,传递一个指针的引用,同时就可以修改这个指针本身。
接下来就是结论:
ListNode<T>* l,这个l可以修改l所指的链表节点对象,然而这个函数不能修改l指针本身,也就是修改l所指的对象并不能起作用(如果作为返回值就另说,不在这篇博客的讨论范围内)
ListNode<T>*& l 这个l不仅可以修改l所指的链表节点对象,而且这个函数可以修改l指针本身,也就可以修改l所指的对象。
于是,这个故事告诉我们不要凭感觉做事(逃)
参数类型*&是什么意思?的更多相关文章
- Mybatis传入参数类型为Map
mybatis更新sql语句: <update id="publishT00_notice" parameterType="Map"> update ...
- C++11 图说VS2013下的引用叠加规则和模板参数类型推导规则
背景: 最近在学习C++STL,出于偶然,在C++Reference上看到了vector下的emplace_back函数,不想由此引发了一系列的“探索”,于是就有了现在这篇博文. 前言: ...
- android:inputType参数类型说明
android:inputType参数类型说明 android:inputType="none"--输入普通字符 android:inputType="text" ...
- Mybatis的mapper接口接受的参数类型
最近项目用到了Mybatis,学一下记下来. Mybatis的Mapper文件中的select.insert.update.delete元素中有一个parameterType属性,用于对应的mappe ...
- 关于mybatis的参数2个使用经验(类似于struts2的通配所有页面的action配置,xmlsq语句参数类型为基本类型时的快捷指定办法)
1.我们都知道在struts2中为防止浏览器绕过struts过滤器直接请求页面,所以我们都会配置一个拦截所有页面的action,如下: <action name="*"> ...
- [c++][语言语法]函数模板和模板函数 及参数类型的运行时判断
参考:http://blog.csdn.net/beyondhaven/article/details/4204345 参考:http://blog.csdn.net/joeblackzqq/arti ...
- MyBatis的返回参数类型和查询结果遍历
MyBatis的返回参数类型分两种 1. 对应的分类为: 1.1.resultMap: 1.2.resultType: 2 .对应返回值类型: 2.1.resultMap:结果集 2.2.result ...
- ParameterDirection参数类型
IDataParameter[] paramArray = new IDataParameter[]{ AdoHelper.GetParameter("ReturnValue",D ...
- c语言参数类型
今天看ntcip源码时看到,函数参数有点不一样.在函数实现时,没有括号中没有指明参数类型.注意这里说的是函数实现,不是说函数声明.这里在函数列表括号后面做了类型的说明,以前看到过,没想起来,今天做个记 ...
- C# WebService的简单和复杂参数类型和结果的JSON格式
Jquery作为一款优秀的JS框架,简单易用的特性就不必说了.在实际的开发过程中,使用JQ的AJAX函数调用WebService 的接口实现AJAX的功能也成了一种比较普遍的技术手段了.WebServ ...
随机推荐
- python基础及安装
一.python介绍 介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Python这个名 ...
- 【VS开发】使用WinPcap编程(3)——设置过滤器
设置过滤器要用到两个函数,一个是pcap_compile(),另一个是pcao_setfilter().他们的函数原型如下所示: int pcap_compile (pcap_t *p, struct ...
- 【VS开发】【智能语音处理】DTW算法(语音识别)
DTW主要是应用在孤立词识别的算法,用来识别一些特定的指令比较好用,这个算法是基于DP(动态规划)的算法基础上发展而来的.这里介绍语音识别就先介绍下语音识别的框架,首先我们要有一个比对的模版声音,然后 ...
- python 并发编程 io模型 目录
python 并发编程 IO模型介绍 python 并发编程 socket 服务端 客户端 阻塞io行为 python 并发编程 阻塞IO模型 python 并发编程 非阻塞IO模型 python 并 ...
- python 并发编程 多线程 互斥锁
互斥锁 并行变成串行,牺牲效率 保证数据安全,实现局部串行 保护不同的数据,应该加不同的锁 现在一个进程 可以有多个线程 所有线程都共享进程的地址空间 实现数据共享 共享带来问题就会出现竞争 竞争就会 ...
- 四、Kubernetes_V1.10集群部署-master-创建kubeconfig
1.生成配置文件 # 创建 TLS Bootstrapping Token # export BOOTSTRAP_TOKEN=$( /dev/urandom | od -An -t x | tr -d ...
- Spring(三)--Spring bean的生命周期
Spring bean的生命周期 ApplicationContext Bean生命周期流程 1.需要的实体类 ackage com.xdf.bean; import org.springframew ...
- Java中的模板设计模式,太实用了!
顾名思义,模板设计模式就是将许多公用的常用的代码封装成一个模板,我们只需要实现不同的业务需求的代码,然后和模板组合在一起,那么就得到完整的逻辑. 在我们的日常开发中,常用的模板模式有两种实现方式:继承 ...
- Luogu P3959 [NOIP2017]宝藏
题目 STO rqy OTZ 首先这种题一看我们就知道可以爆搜. prim一眼假了,但是加个SA也能过. 所以我们来写状压. 记\(f_{i,j,S}\)表示起点到\(j\)距离为\(i\),我们现在 ...
- 通过web.xml监听器启动main方法
web.xml中添加要启动的类 <listener> <listener-class>server.NettyServer</listener-class> < ...