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

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;
}
...全文
1273 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;

希望对你能有帮助
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 第 一 章 概述 1-1 简述计算机程序设计语言的发展阶段。 解: 自从计算机诞生以来,程序设计语言经历了从机器语言、汇编语言到高级语言的演变过程,C++语言作为一种面向对象的编程语言,也属于高级语言范畴。 1-2 面向对象的编程语言具备哪些特性? 解: 面向对象的编程语言与传统的编程语言有着本质的区别,其设计初衷是为了更直观地模拟现实世界中存在的事物及其相互关系。这类编程语言将客观事物视为具有属性和行为的对象,通过抽象方法提取出同一类对象的共同属性(静态特征)和行为(动态特征),从而构建类。借助类的继承与多态机制,能够便捷地实现代码复用,显著缩短软件开发周期,并确保软件风格的一致性。因此,面向对象的编程语言使得程序能够较为准确地反映问题域的本质,软件开发人员可以运用人类惯用的思维模式进行开发工作。C++语言是目前应用最为广泛的面向对象编程语言。 1-3 结构化程序设计方法是什么?这种方法有哪些优势和不足? 解: 结构化程序设计的核心思想是自顶向下、逐步求精;其程序结构按照功能划分为多个基本模块;各模块之间的关联尽可能简化,在功能上保持相对独立性;每个模块内部均由顺序、选择和循环三种基本结构构成;模块化实现的具体途径是利用子程序。结构化程序设计由于采用模块分解与功能抽象,自顶向下、分而治之的策略,从而有效地将一个较为复杂的程序系统设计任务分解成许多易于管理和处理的子任务,便于开发与维护。 尽管结构化程序设计方法具备诸多优点,但它本质上仍是一种面向过程的程序设计方法,将数据与处理数据的操作分离为相互独立的实体。当数据结构发生变化时,所有相关的处理过程都需要进行相应的调整,每一种...

33,316

社区成员

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

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