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

(大概是一个样子的)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. Python中调用c语言(简单版)

    Python中有时需要调用c程序中的函数.使用ctype库可以很方便地调用c语言.现说明方法,以及注意事项. c程序编译为.so文件: 我们需要的c语言文件为test.c,要从其中调用func(x,y ...

  2. 一本值得你反复研读的Python佳作《Python编程从0到1》

    现在的Python入门书太多太多了,究竟如何选择呢? 当然选最好的最入门的讲解最清晰的,没有那么多废话的. 现在就推荐一本<Python编程从0到1>,还带视频的,到时候跟大家一起学习沟通 ...

  3. LayaAir疑难杂症之四:laya引擎自动断点到bundle.js文件中且无报错,但程序不再执行

    在一次断点调试中,突然程序不再按照博主指定的断点执行,莫名其妙端点到了bundle.js文件中的某一行中,这是不应该的,第一次时间反应就是引擎出了问题,但是总不能让博主卸载重装吧. 经过查找资料,询问 ...

  4. Educational Codeforces Round 64 -B(贪心)

    题目链接:https://codeforces.com/contest/1156/problem/B 题意:给一段字符串,通过变换顺序使得该字符串不包含为位置上相邻且在字母表上也相邻的情况,并输出. ...

  5. [转帖].NET Core单文件发布静态编译AOT CoreRT

    .NET Core单文件发布静态编译AOT CoreRT https://www.cnblogs.com/linezero/p/CoreRT.htm .NET Core单文件发布静态编译AOT Cor ...

  6. [转帖]56核Xeon Platinum 9200现身 - 英特尔有史以来最大的CPU封装

    56核Xeon Platinum 9200现身 - 英特尔有史以来最大的CPU封装 https://www.cnbeta.com/articles/tech/835271.htm 当英特尔宣布上周正式 ...

  7. Who will be punished

    Who will be punished Problem Description This time,suddenly,teacher Li wants to find out who have mi ...

  8. BZOJ 1303 中位数图 题解

    题面 因为所求的是中位数,所以考虑改变原序列.把大于 b 的数全部变为 1,小于 b 的数变为 −1,等于 b 则为 0.问题就变为求存在几个包含 b的区间和为 0 . 根据乘法原理,我们枚举每一个l ...

  9. 匿名函数lambda和map函数

    一.map函数,实现迭代操作 map(f1,x) f1为函数的名称(不加括号),x为map的参数,示例如下: def add(a): return a+10 print map(add,[1,2,3] ...

  10. selenium2环境搭建----基于python语言

    selenium支持多种语言如java.c#.Python.PHP等,这里基于python语言,所以这里搭建环境时需做俩步操作: ----1.Python环境的搭建 ----2.selenium的安装 ...