今天的问题[2014-10-15]

今天在使用指针做参数传递的时候遇到一个语法级别的问题,伪代码如下。

class Base

{

...

};

class A : public Base

{

...

};

//- 上面是前提,下面是出现问题的地方

static A* a = nullptr;

void Load(  Base* arg )

{

if(  nullptr == a)

a = new A();  // ①

       arg = a;

}

//- 调用部分:

Base* bs = nullptr;

Load( bs ); // ②

if( bs )

{

bs.func( .. );

}

经过单步调试,确定在代码①地方被执行了,我本意是让代码把 bs 指针传递到调用函数里面去在里面获取里面的值,但是我上面的写法存在

问题,代码①确实执行了,但是 bs 任然为 nullptr,找了半天原因,找到了。


//- 代码更正:

void Load( Base** arg )

{

if( nullptr == a)

a = new A();

*arg = a ;

}

//- 调用的地方

Base* bs = nullptr;

Load(  &bs );

if( bs )

{

bs.func( ... );

}

//- 理解

在传递参数的时候,传递 bs 进如试图在调用函数里更改 bs, 其实不然,bs 本为空,而且参数传递是以值的方式传递进入被调函数,

而对于这个值的操作,在被调函数里面,根据需要都可以。如果传递 bs 进去,相当于打算修改 bs 指向的地址。如果传递 &bs 进入

被调函数,那么传递进来的这个参数,其实就是 在调用一方 bs 这个变量的地址,如果把他修改了,那么 bs 的值也修改了。

所以,在参数传递的时候,无路是指针也好,一般变量也好,其实都是传递一份 “ 值 ” 过去,这个 “ 值 ” 可以是一个地址,可以是一个什么数

或者什么数据结构,但是最终要看的是对这分 “ 值 ” 的操作,是否会对被调一方有影响,在传递过程中有拷贝过程,但是传递的是地址的话

怎么拷贝,指向不会变化,如果有任何操作都会作用到对应的内存上去。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值