如何让指针退回到初始位置

googlebaiduyahoo 2011-08-27 10:08:43
下面的代码将数组arr1中的内容复制到dest中,然后再输出dest中的值。现在的问题是指针dest已经向前移了10,在输出dest数组的for循环里如何将指针p初始化在dest最开始的位置?

int main()
{
int arr1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *source = arr1;
size_t sz = sizeof(arr1) / sizeof(*arr1);
int *dest = new int[sz];
while(source != arr1 + sz)
{
//*dest++ = *source++;
*dest = *source;
dest++;
source++;
}
//output the array dest
for(int *p = dest - sz; p != dest + sz; p++)
{
cout << *p << endl;
}
return 0;
}
...全文
1096 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackyjkchen 2011-08-27
  • 打赏
  • 举报
回复 1
在改变指针之前,声明一个变量保存就行了
hackbuteer1 2011-08-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 googlebaiduyahoo 的回复:]
我想知道在for 循环里int *p = dest - sz; 为什么P指针指向的不是dest的初始位置?
[/Quote]
dest是数组的首地址,是不能改变的。。
googlebaiduyahoo 2011-08-27
  • 打赏
  • 举报
回复
我想知道在for 循环里int *p = dest - sz; 为什么P指针指向的不是dest的初始位置?
Nosky100 2011-08-27
  • 打赏
  • 举报
回复
被让dest++啊,定义个指针指向dest。
wxf041041 2011-08-27
  • 打赏
  • 举报
回复
在使用指针之前先保存就好!
shenyan008 2011-08-27
  • 打赏
  • 举报
回复
for(int *p = dest -= sz; p != dest; p++){...}
luciferisnotsatan 2011-08-27
  • 打赏
  • 举报
回复
开始时,就声明一个变量,保存起始位置不就行了
玫瑰色酒杯 2011-08-27
  • 打赏
  • 举报
回复
你用new在堆空间里申请的内存空间,
我用 0,1,2,3,4,5,6,7,8,9,-1 表示。
那么while循环结束后,dest指向了-1的位置,for循环中定义p指向dest-sz确实是0位置,这个没错
但是p!=dest+sz这个条件就表示当P指向-1后的第10个int大小的位置时,结束循环,所以实际输出是20个
前10个是0到9,后10个是乱码。

总结下

1.你的代码存在指针越界,比如数组从arr1[0]到arr1[9],但是指针已经指向到arr1[10]的位置,特别是dest指针,已经指向超出你自己申请的堆空间。建议使用数组的时候,不要改变指针的数值。可以这样去遍历数组
while(source != arr1 + sz)
{
int i = 0;
*(dest+i) = *(source+i);
i++;
}
这样dest和source一直指向数组所在内存的首地址。

2. 利用new申请堆空间,最好养成在程序末尾用delete释放掉的习惯,避免内存泄漏问题。
delete dest;
这个前提是dest值没有变,仍然指向的是首地址,如果按你的代码,就要在while循环之前先保存首地址
然后再delete
int *add = dest;
//.....
delete add;

希望对你能有帮助

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧