读书人

动态分配数组后赋值很蛋疼…求解!解

发布时间: 2012-03-14 12:01:13 作者: rapoo

动态分配数组后,赋值很蛋疼……求解!

C/C++ code
#include <iostream>using namespace std;int main(){    int* p = new int(10);    cout<<"p="<<*p<<endl;    int arr[5]={11,22,33,44,55};    int* arr_p = new int[5];    //堆中分配一个数组,然后返回一个首地址指针。    *arr_p = 10;                //使用指针法赋值就会出现问题。    arr_p[1] = 20;              //这样赋值没问题        arr_p[2] = 30;        *(arr_p++)=50;             //这种方法赋值就全乱乱套了。值会变成一个随机值。    system("pause");    return 0;}


上诉代码有很多不解的地方,求求大家解惑。 还有一个问题,就是用循环把arr中每个元素赋给arr_p每个元素。循环变量要用指针,不能从新定义循环变量,如何解决?

[解决办法]
#include <iostream>
using namespace std;

int main()
{
int arr[5] = {11, 22, 33, 44, 55};
int *arr_p = new int[5]();
int *p = arr_p;

// 赋值
for (int *pBegin = arr, *pEnd = arr + 5; pBegin != pEnd; ++pBegin, ++p)
{
*p = *pBegin;
}

// 输出
for (int *pBegin = arr_p, *pEnd = arr_p + 5; pBegin != pEnd; ++pBegin)
{
cout<<*pBegin<<endl;
}

system("pause");
return 0;
}
[解决办法]
*arr_p = 10; //使用指针法赋值就会出现问题。
//////////////////////////
这个怎么会出错?这句==ARR_P[0]=10啊,VS08编译通过,LZ什么编译器??

*(arr_p++)=50; //这种方法赋值就全乱乱套了。值会变成一个随机值。
//////////////////////////
这一句也是正确的,他把app_p[0]赋值为50
只是有个arr_p++,所以是把这个指针向后移动了一个int得长度,相当于错开了一个Int
不信楼主可以看看arr_p[-1]这个位置等于50不
[解决办法]
*(arr_p++)=50; //这种方法赋值就全乱乱套了。值会变成一个随机值。
// 首先将指针arr_p的地址赋值给eax寄存器,也就是你new出来数组的首地址
00E213F4 mov eax,dword ptr [arr_p]
// 32h=50,赋值操作,将数组首地址的int值赋值为50.数组的第0个int值为50
00E213F7 mov dword ptr [eax],32h
// 将arr_p的地址赋值给ecx寄存器
00E213FD mov ecx,dword ptr [arr_p]
// 我的机器是32位机,所以++操作会是的指针向前移动4个byte
00E21400 add ecx,4
// 更新arr_p的值。此时arr_p指向数组的第1个int的位置。
00E21403 mov dword ptr [arr_p],ecx

我不知道你为什么会说随机值
[解决办法]
对于一个INT型指针变量p,p+1代表了p中的地址+4,就是指针移动了一个整型变量的位置,即指向了下一个整型变量
对p++的赋值操作“*(arr_p++)=50” 会将值先赋值给*arr_p,然后arr_p=arr_p+1;试试*(++arr_p)=50

读书人网 >C++

热点推荐