有个指针申请内存方面的问题请教大家

wanyangnumberone 2013-03-12 05:30:25
[code=c]
#include <iostream>

using namespace std;

int main()
{
int array[5] = {1,2,3,4,5};
/*
int* array=new int[5];
array[0]=1;
array[1]=2;
array[2]=3;
array[3]=4;
array[4]=5;
*/
for(int i=0;i<5;i++){
cout<<"array["<<i<<"]="<<array[i]<<",location="<<&array[i]<<endl;
}
int *ptr = (int*)(&array+1);
cout << (&array+1)<<endl;
cout << (array+1) << " " << (ptr-1) << endl;
cout << *(array+1) << " " << *(ptr-1) << endl;
//delete[] array;
return 0;
}
[/code]
请问如果用int* array=new int[5]也就是注释掉的部分,并赋值的方式来进行操作,主要有3个问题:1.为什么(ptr-1)地址的值会发生变化?2.是不是因为new申请的内存和int array的申请的内存不一样导致的呢?3.如果不一样,那到底有什么区别呢?求大虾指教,谢谢了。
...全文
197 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanyangnumberone 2013-03-13
  • 打赏
  • 举报
回复
引用 8 楼 haierpro 的回复:
1.为什么(ptr-1)地址的值会发生变化? 好像程序中也没有哪两行能看出(ptr-1)的地址发生变化了啊?
我的意思是两种申请内存不同的方式下:new和array,ptr-1的地址发生了变化,这个楼上已经解释的比较清楚了啊
haierpro 2013-03-13
  • 打赏
  • 举报
回复
1.为什么(ptr-1)地址的值会发生变化? 好像程序中也没有哪两行能看出(ptr-1)的地址发生变化了啊?
starytx 2013-03-12
  • 打赏
  • 举报
回复
如果是动态分配的话,ptr的定义应该是int**(双重指针),此时不能使用(int *)来强转(&array+1),原因3楼已经说明了,此时array是一个指针,对指针取地址所以是**,再看下边程序最后一行的*(*(ptr-1)+1),它输出的是第二个元素的值2,如果输出第三个元素,lz想想应该怎么改?想明白了就知道咋回事了。我在下边公布答案,可以对一下,改对了说明你明白咋回事了。得亏lz提这个问题,我也是F5调减的时候看变量发现的。呵呵
   int* array=new int[5];     
   array[0]=1;     
   array[1]=2;     
   array[2]=3;     
   array[3]=4;     
   array[4]=5;     
       
   for(int i=0;i<5;i++)
   {         
       cout<<"array["<<i<<"]="<<array[i]<<",location="<<&array[i]<<endl;     
   }     
   int **ptr = (&array+1);     
   cout <<  (&array+1)<<endl;     
   cout <<  (array+1) <<  "    " <<  (ptr-1) << endl;     
   cout << *(array+1) <<  "    " << *(*(ptr-1)+1) << endl; 
输出第三个元素的话应该是*(*(ptr-1)+2);也就是说最里边括号必须是ptr-1,这样才会将指针array的地址回归正位,然后对其进行解引用*,这才取出了动态开辟的空间的首地址,然后对其+1就是移动到第二个元素,等等...
wanyangnumberone 2013-03-12
  • 打赏
  • 举报
回复
还有个问题,如何用new申请的内存来实现int array上面的答案呢?有人来讨论讨论吗
wanyangnumberone 2013-03-12
  • 打赏
  • 举报
回复
引用 3 楼 fishion 的回复:
int array[5] ; &array+1的话,地址是array的地址增加5x4 而int* array的话 &array+1的话,是指针地址的地址上增加4 是两个不同的值
我懂你的意思了,相当于指针的指针,是这个意思么?
wanyangnumberone 2013-03-12
  • 打赏
  • 举报
回复
引用 2 楼 haierpro 的回复:
当然不一样,int array[5]是在栈上分配内存,new是在堆上分配内存。
感觉是new的话,如果&array+1好像是随机选取一块内存,而栈上的话,则是连续的内存,不知道这样理解对不对?
fishion 2013-03-12
  • 打赏
  • 举报
回复
int array[5] ; &array+1的话,地址是array的地址增加5x4 而int* array的话 &array+1的话,是指针地址的地址上增加4 是两个不同的值
haierpro 2013-03-12
  • 打赏
  • 举报
回复
当然不一样,int array[5]是在栈上分配内存,new是在堆上分配内存。
wanyangnumberone 2013-03-12
  • 打赏
  • 举报
回复
求来人,不会都下班吃饭去了吧

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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