c++ 中 指针的指针** 与 指针的引用 *&

~~~~我的生活,我的点点滴滴!!


     今天在看一些c++开源代码时,无意间看到下面这段代码,突然发觉看起好陌生,完全不懂这样用的意义是什么呀?

void Director::popScene(const std::function<void(Scene* &)>& callback)  
{      
	CCASSERT(_runningScene != nullptr, "running scene should not null");      
	
	_scenesStack.popBack();      
	
	ssize_t c = _scenesStack.size();      
	
	if (c == 0)      
	{          
		end();      
	}      
	else      
	{          
		_sendCleanupToScene = true;          
		
		_nextScene = _scenesStack.at(c - 1);          
		
		if(callback)              
		{
			callback(_nextScene);
		}			
	}  
}

auto callback = [](Scene*& scene){scene = TransitionJumpZoom::create(1.0f, scene);};
Director::getInstance()->popScene(callback);

下面的callback = [](Scene *& scene){}; 这是c++ 11的新语法,这里我不在科普了,前面的blog文中有讲到,主要是看下这个绕眼的符号" *& "

这表示是什么意思,我经常见到" ** "但是我自己不用,我也烦这样使用的人。今天见到这个后,我更加费解了。这样用的意思是什么?为什么要这

样用?好处?一连串的疑问浮现出来,下面我们一起来看看。

<span style="font-family:Arial;color:#666666;"><span style="font-size: 14px; line-height: 24px;">void Director::popScene(const std::function<void(Scene* &)>& callback)
{
}</span></span>

我们抛开std::function()这个功能不说,只单纯讲 void func1( Scene *& pScene );这个函数声明中" *& "的意义。在某种意义上,"*"和"&"是

意思相对的两个东西,把它们放在一起有什么意义呢?。为了理解指针的这种做法,我们先复习一下C/C++编程中无所不在的指针概念。我们都知道

Scene*的意思:指向某个对象的指针,此对象的类型为Scene。

Scene* p = new Scene();

func1(p);

void func1(Scene *pScene)
{ 
  DoSomething(pScene); 
	pScene = // 其它对象的指针 
}

上面这段代码的这种处理方法想必谁都用过,创建一个Scene对象,然后将它传入func1函数。现在假设此函数要修改pScene: 上面第二条语句在函

数过程中只修改了pScene的值,前没有修改上面调用者func1(p)的值,如果p指向某个位于地址0x008a00的对象,当func1返回时,它仍然指向这个

特定的对象。现在假设你想要在func1中修改p的值。这是你的权利。调用者传入一个指针,然后函数给这个指针赋值。以往一般都是传双指针,即

指针的指针,例如,Scene**。

func1(p); 
void func1(Scene *& pMyClass); 
{ 
	*pMyClass = new Scene(); 
	…… 
}


其实,它和前面所讲得指针的指针例子是一码事,只是语法有所不同。传递的时候不用传p的地址&p,而是直接传p本身:


Scene* p = NULL; 
func1(p); 

在调用之后,p指向一个新的对象。一般来讲,引用的原理或多或少就象一个指针,从语法上看它就是一个普通变量。所以只要你碰到*&,就应该想

到**。也就是说这个函数修改或可能修改调用者的指针,而调用者象普通变量一样传递这个指针,不使用地址操作符&。


我们回归到最开始的代码,看callback(_nextScene);这一行代码,_nextScene应该是类的成员变量,他需要保持和关心这个别人对他自己的一些操作

与处理,也就是在别的地方改变了值,需要反馈回来,故用了 "*&" ,现在问题就开朗多了。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值