64,647
社区成员
发帖
与我相关
我的任务
分享
*(++a) = 4;
008A1037 mov eax,dword ptr [a]
008A103A add eax,4
008A103D mov dword ptr [a],eax
008A1040 mov ecx,dword ptr [a]
008A1043 mov dword ptr [ecx],4
[/quote]
今天特地请教了别人,前来道歉,我之前说的执行顺序是错误的。
实际上++a是操作的整个数组,将其整体的地址向后偏移4个字节,这样的做法是有风险的,
因为释放的时候还会漏掉一段4个字节的空间,容易造成野指针。这样操作的结果是无论++a多少次,
其对应的地址还是a[0],所以*(++a)=4实际上还是赋值给了a[0]。
而*(a+1)=4才是操作的这个指向数组的,将其向后偏移4个字节移动到a[1],所以赋值给了a[1]。[/quote]
*(++a)=4实际上还是赋值给了a[0],这个确实是,但是此时的a跟原来的a已经是不同的了(就起始地址来说)
共同进步[/quote]
*(++a) = 4;
008A1037 mov eax,dword ptr [a]
008A103A add eax,4
008A103D mov dword ptr [a],eax
008A1040 mov ecx,dword ptr [a]
008A1043 mov dword ptr [ecx],4
[/quote]
今天特地请教了别人,前来道歉,我之前说的执行顺序是错误的。
实际上++a是操作的整个数组,将其整体的地址向后偏移4个字节,这样的做法是有风险的,
因为释放的时候还会漏掉一段4个字节的空间,容易造成野指针。这样操作的结果是无论++a多少次,
其对应的地址还是a[0],所以*(++a)=4实际上还是赋值给了a[0]。
而*(a+1)=4才是操作的这个指向数组的,将其向后偏移4个字节移动到a[1],所以赋值给了a[1]。[/quote]
*(++a)=4实际上还是赋值给了a[0],这个确实是,但是此时的a跟原来的a已经是不同的了(就起始地址来说)
共同进步
*(++a) = 4;
008A1037 mov eax,dword ptr [a]
008A103A add eax,4
008A103D mov dword ptr [a],eax
008A1040 mov ecx,dword ptr [a]
008A1043 mov dword ptr [ecx],4
[/quote]
今天特地请教了别人,前来道歉,我之前说的执行顺序是错误的。
实际上++a是操作的整个数组,将其整体的地址向后偏移4个字节,这样的做法是有风险的,
因为释放的时候还会漏掉一段4个字节的空间,容易造成野指针。这样操作的结果是无论++a多少次,
其对应的地址还是a[0],所以*(++a)=4实际上还是赋值给了a[0]。
而*(a+1)=4才是操作的这个指向数组的,将其向后偏移4个字节移动到a[1],所以赋值给了a[1]。
*(++a) = 4;
008A1037 mov eax,dword ptr [a]
008A103A add eax,4
008A103D mov dword ptr [a],eax
008A1040 mov ecx,dword ptr [a]
008A1043 mov dword ptr [ecx],4
// 我猜它相当于,不要问我为什么,我也不知道。
int *a = new int[10];
cout<<a<<endl;
++a;
*(a) = 50;
int n;
string *const p=new string[n]; //构造n个空string
string s;
string *q=p; //q指向第一个string
while(cin>>s && q != p+n)
*q++=s; //赋予*q一个新值
const size_t size=q-p; //记住我们读取了多少个string
//使用数组
delete [] p; //p指向一个数组;记得用delete[]来释放
具体情况可以看一看http://blog.csdn.net/cutter_point/article/details/37594625
如果这个不清楚的话C++primer里面还有有详细介绍