首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

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

有个指针申请内存方面的问题请教大家
本帖最后由 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就是移动到第二个元素,等等...

热点排行