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

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.如果不一样,那到底有什么区别呢?求大虾指教,谢谢了。
...全文
147 点赞 收藏 9
写回复
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日
求来人,不会都下班吃饭去了吧
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告