c++关于动态数组的问题.

从标准输入设备读入的元素数据建立一个int型vector对象,然后动态创建一个与该vector对象大小一致的数组,把vector对象的所有元素复制给新数组。(c++pri... 从标准输入设备读入的元素数据建立一个int型vector对象,然后动态创建一个与该vector对象大小一致的数组,把vector对象的所有元素复制给新数组。(c++primer习题4.28)
标准答案为
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> ivec;
int ival;

//输入元素数据并建立vector
cout << "Enter numbers:(Ctrl + Z to end)" << endl;
while(cin >> ival)
ivec.push_back(ival);

//动态创建数组
int *pia = new int[ivec.size()];

//复制元素
int *tp = pia; // 为什么需要一个int指针呢?
for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter, ++tp)
*pia = *iter;

//释放动态数组的内存
delete [] pia;
cout << "good2" << endl;
return 0;
}

我的问题是int *tp的作用是什么,如果不用它直接给动态数组赋值会怎样,然后自己改了下程序如下。

int main()
{
vector<int> ivec;
int ival;
cout << "Enter numbers:(Ctrl + Z to end)" << endl;
while(cin >> ival)
ivec.push_back(ival);
int *pia = new int[ivec.size()];

for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter, ++pia)
{
*pia = *iter;
}

delete [] pia; // 出现错误。
return 0;
}
结果发现无法删除pia数组了。
难道直接给动态数组赋值的话,就变成非动态数组了吗?
还有就是为何需要那个int *lp指针的问题。
谢谢。
展开
 我来答
重小楼666
2011-09-02 · TA获得超过355个赞
知道小有建树答主
回答量:223
采纳率:100%
帮助的人:205万
展开全部
赋值后不会变成非动态数组。那是因为你在第二个程序中,对pia执行了++操作,for循环接受后,pia已经指向数组的末尾了,当然不能删除了。同样在第一个程序中定义的lp就是用来对pia数组进行循环赋值的,这样就可以保证不会丢失指向数组首地址的指针。而且第一个程序中,for循环里面的赋值语句应该是*tp=*iter。如果你不想再定义一个指针,可以定义个数组的索引i,然后这样赋值:*(pia+i)=*iter。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
派欧云
2011-09-02 · TA获得超过253个赞
知道小有建树答主
回答量:209
采纳率:100%
帮助的人:140万
展开全部
在你下面的程序里,指针pia在动态数组赋值的时候已经移动了,最后指向动态数组的最后一个元素的位置,而不是起始位置,当然是不能删除的。
这样就明白tp指针式干什么的了吧
另外在复制元素的地方你写错了

*tp=*iter;
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式