关于数字组的指针,求解决,问了下周围的人没有给出合理解释的,谢啦

cugwuhan 2014-08-26 10:49:17
int *a = new int[10];
//(1)
*(++a) = 4;//为什么不能给a[1]赋值,如果说数组头指针是指针常量看(2)
cout<< a[1];
//(2)
*(a+1) = 5;
cout<< a[1];
return 0;

希望大神解决,谢啦
...全文
177 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxvivian 2014-08-30
  • 打赏
  • 举报
回复
引用 21 楼 jianwen0529 的回复:
[quote=引用 20 楼 ZXvivian 的回复:] [quote=引用 19 楼 jianwen0529 的回复:] [quote=引用 16 楼 ZXvivian 的回复:] [quote=引用 14 楼 jianwen0529 的回复:] *(++a) = 4; 你都++a了 假如a 首地址为 0, a[1]地址 = 4 ... ++a 后 首地址变成了 4, 也就是现在的 a[0] 其实就是你没有++之前的 a[1] 可否理解?! 就比如我有一排格子,我从第一个格子 移动 到 第二个格子 然后往里面放东西,然后取我面前第一个格子的东西 其实现在我面前的格子 就是 我没有移动之前的那个格子的第二个,但是现在对于我来说是第一个(首元素)
*(a++)=4并不是改变地址,而是改变地址对应的值,东西没看明白不要如此自信的误人子弟[/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已经是不同的了(就起始地址来说) 共同进步[/quote]
幻夢之葉 2014-08-29
  • 打赏
  • 举报
回复
引用 20 楼 ZXvivian 的回复:
[quote=引用 19 楼 jianwen0529 的回复:] [quote=引用 16 楼 ZXvivian 的回复:] [quote=引用 14 楼 jianwen0529 的回复:] *(++a) = 4; 你都++a了 假如a 首地址为 0, a[1]地址 = 4 ... ++a 后 首地址变成了 4, 也就是现在的 a[0] 其实就是你没有++之前的 a[1] 可否理解?! 就比如我有一排格子,我从第一个格子 移动 到 第二个格子 然后往里面放东西,然后取我面前第一个格子的东西 其实现在我面前的格子 就是 我没有移动之前的那个格子的第二个,但是现在对于我来说是第一个(首元素)
*(a++)=4并不是改变地址,而是改变地址对应的值,东西没看明白不要如此自信的误人子弟[/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已经是不同的了(就起始地址来说) 共同进步
zxvivian 2014-08-28
  • 打赏
  • 举报
回复
引用 19 楼 jianwen0529 的回复:
[quote=引用 16 楼 ZXvivian 的回复:] [quote=引用 14 楼 jianwen0529 的回复:] *(++a) = 4; 你都++a了 假如a 首地址为 0, a[1]地址 = 4 ... ++a 后 首地址变成了 4, 也就是现在的 a[0] 其实就是你没有++之前的 a[1] 可否理解?! 就比如我有一排格子,我从第一个格子 移动 到 第二个格子 然后往里面放东西,然后取我面前第一个格子的东西 其实现在我面前的格子 就是 我没有移动之前的那个格子的第二个,但是现在对于我来说是第一个(首元素)
*(a++)=4并不是改变地址,而是改变地址对应的值,东西没看明白不要如此自信的误人子弟[/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]。
幻夢之葉 2014-08-28
  • 打赏
  • 举报
回复
引用 16 楼 ZXvivian 的回复:
[quote=引用 14 楼 jianwen0529 的回复:] *(++a) = 4; 你都++a了 假如a 首地址为 0, a[1]地址 = 4 ... ++a 后 首地址变成了 4, 也就是现在的 a[0] 其实就是你没有++之前的 a[1] 可否理解?! 就比如我有一排格子,我从第一个格子 移动 到 第二个格子 然后往里面放东西,然后取我面前第一个格子的东西 其实现在我面前的格子 就是 我没有移动之前的那个格子的第二个,但是现在对于我来说是第一个(首元素)
*(a++)=4并不是改变地址,而是改变地址对应的值,东西没看明白不要如此自信的误人子弟[/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 
幻夢之葉 2014-08-28
  • 打赏
  • 举报
回复
引用 16 楼 ZXvivian 的回复:
[quote=引用 14 楼 jianwen0529 的回复:] *(++a) = 4; 你都++a了 假如a 首地址为 0, a[1]地址 = 4 ... ++a 后 首地址变成了 4, 也就是现在的 a[0] 其实就是你没有++之前的 a[1] 可否理解?! 就比如我有一排格子,我从第一个格子 移动 到 第二个格子 然后往里面放东西,然后取我面前第一个格子的东西 其实现在我面前的格子 就是 我没有移动之前的那个格子的第二个,但是现在对于我来说是第一个(首元素)
*(a++)=4并不是改变地址,而是改变地址对应的值,东西没看明白不要如此自信的误人子弟[/quote] 我说的++a 已经把a数组的首地址都改变了,你确定认真看我说的话了吗?! 我不知道你哪里看出我说赋值语句是改变地址的?!
引用
假如a 首地址为 0, a[1]地址 = 4 ... ++a 后 首地址变成了 4, 也就是现在的 a[0] 其实就是你没有++之前的 a[1]
赵4老师 2014-08-27
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
artzers 2014-08-27
  • 打赏
  • 举报
回复
++a之后,a就指向原来的a[1]了,cout << a[1]其实指向未初始化的a[2]. *(a+1)指向a[2],a没变还是指向原来的a[1]. LZ的用法很危险,未初始化啊内存泄露啊越界啊都差不多来了
zxvivian 2014-08-27
  • 打赏
  • 举报
回复
引用 14 楼 jianwen0529 的回复:
*(++a) = 4; 你都++a了 假如a 首地址为 0, a[1]地址 = 4 ... ++a 后 首地址变成了 4, 也就是现在的 a[0] 其实就是你没有++之前的 a[1] 可否理解?! 就比如我有一排格子,我从第一个格子 移动 到 第二个格子 然后往里面放东西,然后取我面前第一个格子的东西 其实现在我面前的格子 就是 我没有移动之前的那个格子的第二个,但是现在对于我来说是第一个(首元素)
*(a++)=4并不是改变地址,而是改变地址对应的值,东西没看明白不要如此自信的误人子弟
幻夢之葉 2014-08-27
  • 打赏
  • 举报
回复
引用 11 楼 ZXvivian 的回复:
首先*(a+1)=5是可以实现的,因为a+1相当于是a[1] *(++a)=4却不然,这个运算式的执行过程是*a=4,++a 就是说首先会将4赋值给数组的第一个元素a[0],然后将指针指向下一个元素 你可以测试输出a[0]的值,肯定是4,再输出(++a)的地址,跟数组首地址a的地址,一定是相差4 因为是整形数组,指针按4个字节移动。 如果你无聊的话可以测试++(++(++a))无限++,再输出a[0]的值保证还是4。祝你好运
你这个结果对了,但是原因却是错误的逻辑。
幻夢之葉 2014-08-27
  • 打赏
  • 举报
回复
*(++a) = 4; 你都++a了 假如a 首地址为 0, a[1]地址 = 4 ... ++a 后 首地址变成了 4, 也就是现在的 a[0] 其实就是你没有++之前的 a[1] 可否理解?! 就比如我有一排格子,我从第一个格子 移动 到 第二个格子 然后往里面放东西,然后取我面前第一个格子的东西 其实现在我面前的格子 就是 我没有移动之前的那个格子的第二个,但是现在对于我来说是第一个(首元素)
幻夢之葉 2014-08-27
  • 打赏
  • 举报
回复

// 我猜它相当于,不要问我为什么,我也不知道。
int *a = new int[10];
cout<<a<<endl;
++a;
*(a) = 50;
zxvivian 2014-08-26
  • 打赏
  • 举报
回复
首先*(a+1)=5是可以实现的,因为a+1相当于是a[1] *(++a)=4却不然,这个运算式的执行过程是*a=4,++a 就是说首先会将4赋值给数组的第一个元素a[0],然后将指针指向下一个元素 你可以测试输出a[0]的值,肯定是4,再输出(++a)的地址,跟数组首地址a的地址,一定是相差4 因为是整形数组,指针按4个字节移动。 如果你无聊的话可以测试++(++(++a))无限++,再输出a[0]的值保证还是4。祝你好运
cutter_point 2014-08-26
  • 打赏
  • 举报
回复
引用 9 楼 cutter_point 的回复:
new出来的应该是指向int[10]而不是指向一个int类型的指针

    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里面还有有详细介绍
说错了,7楼正解
cutter_point 2014-08-26
  • 打赏
  • 举报
回复
new出来的应该是指向int[10]而不是指向一个int类型的指针

    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里面还有有详细介绍
cugwuhan 2014-08-26
  • 打赏
  • 举报
回复
是的是的 是应该这样理解 非常感谢
hubo86915531 2014-08-26
  • 打赏
  • 举报
回复
引用 6 楼 cugwuhan 的回复:
不是应该赋值给a【1】吗 为什么是给了a【0】
你做了++a之后,a已经不是指向这段内存的首地址了 原来的a[1] 就是做了++a后的a[0]
cugwuhan 2014-08-26
  • 打赏
  • 举报
回复
不是应该赋值给a【1】吗 为什么是给了a【0】
cugwuhan 2014-08-26
  • 打赏
  • 举报
回复
不是应该先++ 再复制吗
brookmill 2014-08-26
  • 打赏
  • 举报
回复
即使不考虑delete的问题, *(++a) = 4; cout<< a[0]; // 这个才是4,因为a在赋值前已经移动了一个位置
hubo86915531 2014-08-26
  • 打赏
  • 举报
回复
你这是指针不是数组 你做了++a处理 a就指向未做处理的a[1]了 int *a = new int[10]; int* b = a; *(++a) = 4; cout<< b[1]; 这样输出就是4了
加载更多回复(2)

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧