您的位置:首页 > 编程语言 > C语言/C++

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

2015-06-02 16:55 281 查看
在写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;
注释掉就可以了,记住:将表示地址的变量传到函数中时,穿进去的是变量的副本,副本表示的是地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++