参数类型*&是什么意思?
前两天摸鱼聊天的时候遇到一个问题,一个链表的函数中,有一个参数显得很奇怪
(大概是一个样子的)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 ...
随机推荐
- USACO1.6 回文质数 Prime Palindromes
题目传送门 题目的提示已经非常明显了,可以先生成回文数再判断质数,因为生成回文数的复杂度较小.判断质数用了之前学到的那种做法. 其实可以用一些比较优秀的筛质数的方法,再判断回文数. /* ID: St ...
- react 中 EventEmitter 事件总线机制
此机制可用于 react 中兄弟组件中的通信 npm install events -S 事件总线: // eventBus.js import {EventEmitter} from 'events ...
- ElasticSearch 7.3.0 查询、修改、删除 文档操作
PUT chuyuan/_doc/ { "name":"xiaolin", , "sex":"F", "lov ...
- 微软宣布加入 OpenJDK,打不过就改变 Java 未来!
近日,微软的 Bruno Borges 在 OpenJDK 邮件列表中发布了一条消息,内容包含接下来发生的事情以及微软如何开始将其团队整合到 OpenJDK 社区. 在邮件中,Bruno Borges ...
- Java第四周总结报告
本周做了什么? 学习了Java的面向对象知识,包括对类,对象,抽象的理解 下周准备做什么? 学习Java面向对象的有关知识,包括对象与类,继承关系等内容 代码联系时间五个小时,看书四个小时. 本周遇到 ...
- js实现回车键搜索
前端关键代码: <input type="text" onkeydown="entersearch()" class="form-control ...
- django-xadmin使用
django-xadmin使用基础环境为: PS:如下环境如需升级python则先升级python,然后安装django python3.6.4安装: http://www.cnblogs.com/c ...
- JavaSE--关键字
关键字 1.static 属于成员修饰符,被静态修饰符修饰的成员要使用类名直接调用,该成员优先于对象存在,属于类且被所有实例化对象共享,静态成员随着类的加载而加载. 访问权限:静态成员优先于对象加载致 ...
- Dynamic Compilation and Loading of .NET Objects
This is another approach to dynamic compilation of objects and their usage via Interfaces. Introdu ...
- NoSQL与其常见的产品
一. 什么是NoSQL NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",它是一种非关系型数据库. 二. 为什么要有NoSQL 在现代的计算系统上每 ...