参数类型*&是什么意思?
Posted hotpants
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了参数类型*&是什么意思?相关的知识,希望对你有一定的参考价值。
前两天摸鱼聊天的时候遇到一个问题,一个链表的函数中,有一个参数显得很奇怪
(大概是一个样子的)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所指的对象。
于是,这个故事告诉我们不要凭感觉做事(逃)
以上是关于参数类型*&是什么意思?的主要内容,如果未能解决你的问题,请参考以下文章
java Type是一个啥接口,啥叫参数化类型,原始类型,类型变量