读书人

有个指针申请内存方面的有关问题

发布时间: 2013-03-16 11:51:46 作者: rapoo

有个指针申请内存方面的问题请教大家
本帖最后由 wanyangnumberone 于 2013-03-12 17:32:05 编辑

[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.如果不一样,那到底有什么区别呢?求大虾指教,谢谢了。
[解决办法]
int array[5] ;
&array+1的话,地址是array的地址增加5x4
而int* array的话
&array+1的话,是指针地址的地址上增加4
是两个不同的值
[解决办法]
如果是动态分配的话,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就是移动到第二个元素,等等...

读书人网 >C++

热点推荐