今天在使用指针做参数传递的时候遇到一个语法级别的问题,伪代码如下。
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 的值也修改了。
所以,在参数传递的时候,无路是指针也好,一般变量也好,其实都是传递一份 “ 值 ” 过去,这个 “ 值 ” 可以是一个地址,可以是一个什么数
或者什么数据结构,但是最终要看的是对这分 “ 值 ” 的操作,是否会对被调一方有影响,在传递过程中有拷贝过程,但是传递的是地址的话
怎么拷贝,指向不会变化,如果有任何操作都会作用到对应的内存上去。