C++:按值传递的还有地址

在写vector的时候,我对“地址在传入到函数中时它也是一个变量”这个观点更加的清晰了,在写vector的构造函数的时候需要调用一个函数,该函数具有的功能是分配内存空间并将这些空间填充上应有的值。

这个函数如下:

template<class T, class Alloc>
typename vector<T, Alloc>::iterator vector<T, Alloc>::allocate_and_fill(size_type n, const value_type& val)
{
    iterator result = data_allocator::allocate(n);
    uninitialized_fill_n(result, n, val);
    result = result - n;
    return result;
}

源代码是这样写的,大致的意思就是在以result为起点,对这个迭代器指向的元素进行val的赋值,并对该点及以后的点都是这样进行操作。
但是我之前由于对“地址在传入到函数中时它也是一个变量”理解不深,我认为在将result传入uninitialized_fill_n中后,result也是一步步地向前走,然后当循环n次后退出。

但是我在调试的时候,发现走到最后一步return result;的时候,result显示的地址是一个很大的负数,很明显result所指向的这个地方并没有被初始化。但是明明在uninitialized_fill_n(result, n, val);中已经进行初始话了啊?

这个时候我才反应过来:我们在uninitialized_fill_n(result, n, val);中传进去的是result的副本,result并没有进行变化,在uninitialized_fill_n(result, n, val);中每次循环确实都是将地址进行了++操作,但是那是地址的变化,result这个变量并没有变化,还是表示的是申请新内存所返回的指针。

所以最后的做法将result = result - n;注释掉就可以了,记住:将表示地址的变量传到函数中时,穿进去的是变量的副本,副本表示的是地址。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值