前两天摸鱼聊天的时候遇到一个问题,一个链表的函数中,有一个参数显得很奇怪

(大概是一个样子的)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所指的对象。

于是,这个故事告诉我们不要凭感觉做事(逃)

参数类型*&是什么意思?的更多相关文章

  1. Mybatis传入参数类型为Map

    mybatis更新sql语句: <update id="publishT00_notice" parameterType="Map"> update ...

  2. C++11 图说VS2013下的引用叠加规则和模板参数类型推导规则

    背景:    最近在学习C++STL,出于偶然,在C++Reference上看到了vector下的emplace_back函数,不想由此引发了一系列的“探索”,于是就有了现在这篇博文. 前言:     ...

  3. android:inputType参数类型说明

    android:inputType参数类型说明 android:inputType="none"--输入普通字符 android:inputType="text" ...

  4. Mybatis的mapper接口接受的参数类型

    最近项目用到了Mybatis,学一下记下来. Mybatis的Mapper文件中的select.insert.update.delete元素中有一个parameterType属性,用于对应的mappe ...

  5. 关于mybatis的参数2个使用经验(类似于struts2的通配所有页面的action配置,xmlsq语句参数类型为基本类型时的快捷指定办法)

    1.我们都知道在struts2中为防止浏览器绕过struts过滤器直接请求页面,所以我们都会配置一个拦截所有页面的action,如下: <action name="*"> ...

  6. [c++][语言语法]函数模板和模板函数 及参数类型的运行时判断

    参考:http://blog.csdn.net/beyondhaven/article/details/4204345 参考:http://blog.csdn.net/joeblackzqq/arti ...

  7. MyBatis的返回参数类型和查询结果遍历

    MyBatis的返回参数类型分两种 1. 对应的分类为: 1.1.resultMap: 1.2.resultType: 2 .对应返回值类型: 2.1.resultMap:结果集 2.2.result ...

  8. ParameterDirection参数类型

    IDataParameter[] paramArray = new IDataParameter[]{ AdoHelper.GetParameter("ReturnValue",D ...

  9. c语言参数类型

    今天看ntcip源码时看到,函数参数有点不一样.在函数实现时,没有括号中没有指明参数类型.注意这里说的是函数实现,不是说函数声明.这里在函数列表括号后面做了类型的说明,以前看到过,没想起来,今天做个记 ...

  10. C# WebService的简单和复杂参数类型和结果的JSON格式

    Jquery作为一款优秀的JS框架,简单易用的特性就不必说了.在实际的开发过程中,使用JQ的AJAX函数调用WebService 的接口实现AJAX的功能也成了一种比较普遍的技术手段了.WebServ ...

随机推荐

  1. XSS的简单过滤和绕过

    XSS的简单过滤和绕过 程序猿用一些函数将构成xss代码的一些关键字符给过滤了.但是,道高一尺魔高一丈,虽然过滤了,还是可以尝试进行过滤绕过,以达到XSS攻击的目的. 最简单的是输入<scrip ...

  2. [Vuejs] Vue解决代理设置导致浏览器Session丢失的问题

    以下是会造成Session丢失的代理: proxyTable: { '/proxyApi': { target: 'http://111.18.149.215:8080/WRSOCXSystem/ht ...

  3. java.math包简介

    java.math包提供了java中的数学类 包括基本的浮点库.复杂运算以及任意精度的数据运算   '可以看得到,主要包括三个类一个枚举 BigDecimal和BigInteger接下来会详细介绍 先 ...

  4. 2019JAVA第九次实验报告

    Java实验报告 班级 计科二班 学号 20188442 姓名 吴怡君 完成时间 2019.11.8 评分等级 课程总结 1.实验代码 package Domon8; import java.awt. ...

  5. 【基本优化实践】【1.4】tempdb优化

    [1]tempdb介绍 tempdb全局存储内部对象,用户对象,临时表,临时对象,以及SQL Server操作创建的存储过程.每个数据库实例只有一个tempdb,所以可能存在性能以及磁盘空间瓶颈. 各 ...

  6. 【一个蒟蒻的挣扎】LCA (倍增)

    #include<cstdio> #include<iostream> #include<cstring> using namespace std; struct ...

  7. Luogu P2612 [ZJOI2012]波浪

    题目 我们考虑从\(1\)到\(n\)把每个数放到序列里面去,以消掉绝对值. 在最后的序列中,如果\(i\)的某一边是序列的边界,那么\(i\)会产生\(0\)的贡献.如果\(i\)的某一边是一个比\ ...

  8. php开发环境推荐使用

    万丈高楼平地起,好用得环境才能建立宏伟大厦,php开发环境推荐使用 1,自己安装 lamp 环境 linux+apache+mysql+php 2,自己安装 lnmp 环境 linux+nginx+m ...

  9. Oracle及SQLPLUS使用笔记

    Oracle及SQLPLUS使用笔记 自己之前粗粗的学过MySQL,学校用的是Oracle,学生使用sqlplus,这是个命令行界面的数据库管理软件(为了学习嘛,不用图形化可以理解),这里记录一些使用 ...

  10. 剑指offer-3:跳阶梯

    三.跳台阶 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 分析 青蛙每一次跳跃只有两种选择:一是再跳1级阶梯到达第n ...