动态分配数组后,赋值很蛋疼……求解!C/C++ code#include iostreamusing namespace stdint main(){int* p
动态分配数组后,赋值很蛋疼……求解!
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