鱼C论坛

 找回密码
 立即注册
查看: 2543|回复: 7

C++关于指针的一个小问题求解

[复制链接]
发表于 2019-12-8 11:57:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如下代码,这个代码是我们老师给我们举的例子,我为了调试家了很多输出,后面的注释是英文的,:
  1. int main{
  2. int y[10] = { 5, 2, 9, 6};
  3.     int* p = y + 3;//p=&y[3]=6
  4.     cout<<y[2]<<' '<<y[3]<<' '<<*p<<endl;
  5.     cout<<p<<endl;
  6.     //++*p;//p=&y[3] y[3]=7
  7.     //cout<<*p<<' '<<y[3]<<endl;
  8.     ++*(p-1);//p=&y[2]???????     y[2]=9+1=10;        but *p != y[2]=10?????????????????and the address of p does not change!
  9.     cout<<p<<endl;//actually the address of p does not change! it still  means p=&y[3];
  10.     cout<<"*p= "<<*p<<' '<<"y[2]= "<<y[2]<<' '<<"y[3]= "<<y[3]<<endl;
  11.     p++;//p=&y[4] y[4]=0
  12.     cout<<"*p= "<<*p<<' '<<"y[3]= "<<y[3]<<endl;
  13.     cout<<"#####################"<<endl;
  14.     cout<<p[0]<<' '<<p[1]<<' '<<p[2]<<' '<<p[3]<<' '<<p[4]<<' '<<p[5]<<endl;
  15.     p[2] += 3;//
  16.     cout<<"y[2]= "<<y[2]<<"p[2]= "<<p[2]<<endl;
  17.     for (int i = 0; i < 10; i++)
  18.         cout << y[i] << ' ';
  19.     cout << '\n';                                 //______5 2 10  6  0 0 3 0 0 0 ?????????????______________________
  20. }
复制代码


这段代码我不懂的地方就是,
  1. ++*(p-1);
复制代码
这句话,因为我之前只练习过++*p;他的意思是当前数值自+1,但是老师突然给了这行,我很不明白,而且我调试输出的时候,发现前后p指针指向的地址竟然没变(这里一头雾水 ),然后数组y[2]的值竟然变成了10,但是此时*p的值竟然是指针p指向y        [3]=6.
1.我的理解是p-1为p指针的地址先减1,p=&y[2] ,++*(p-1),然后再把y[2]+1=9+1=10,但是此时p应该是依然只向&y[2]的呀????为啥不变呢??
2.最不懂的是最后输出的时候,y[6]竟然是3???
3.p既然是只向了y的地址,那么我的理解是p[n]n=1,2,3,4....,不应该是等于数组y中的元素值吗,为啥这里全都是0呢?


希望大神能给我讲一讲,谢谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-12-8 12:30:56 | 显示全部楼层
  1. #include <iostream>

  2. int main()
  3. {
  4.         int a[3] = {1, 2, 3};
  5.         int *p = &a[1];

  6.         std::cout << p << std::endl;
  7.         ++*(p);
  8.         std::cout << p << std::endl;
  9.         std::cout << a[0] << std::endl;
  10.         std::cout << a[1] << std::endl;
  11.         std::cout << a[2] << std::endl;
  12.         return 0;
  13. }

  14. /*
  15. 000000C3A112F94C
  16. 000000C3A112F94C
  17. 1
  18. 3
  19. 3
  20. 请按任意键继续. . .
  21. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 12:32:18 | 显示全部楼层
  1. #include <iostream>

  2. int main()
  3. {
  4.         int a[3] = {1, 2, 3};
  5.         int *p = &a[1];

  6.         std::cout << p << std::endl;
  7.         ++*(p - 1);
  8.         std::cout << p << std::endl;
  9.         std::cout << a[0] << std::endl;
  10.         std::cout << a[1] << std::endl;
  11.         std::cout << a[2] << std::endl;
  12.         return 0;
  13. }

  14. /*
  15. 0000006A6177F73C
  16. 0000006A6177F73C
  17. 2
  18. 2
  19. 3
  20. 请按任意键继续. . .
  21. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 12:33:54 | 显示全部楼层
p指向a[1]
*p就是a[1]

++*p就是++a[1]

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 12:35:38 | 显示全部楼层
  1. ++*(p - 1);
复制代码


*(p - 1)是p[-1]
++*(p - 1)是++p[-1]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 12:36:11 | 显示全部楼层
  1. #include <iostream>

  2. int main()
  3. {
  4.         int a[3] = {1, 2, 3};
  5.         int *p = &a[1];

  6.         std::cout << p << std::endl;
  7.         //++*(p - 1);
  8.         ++p[-1];
  9.         std::cout << p << std::endl;
  10.         std::cout << a[0] << std::endl;
  11.         std::cout << a[1] << std::endl;
  12.         std::cout << a[2] << std::endl;
  13.         return 0;
  14. }

  15. /*
  16. 000000C0294FFA1C
  17. 000000C0294FFA1C
  18. 2
  19. 2
  20. 3
  21. 请按任意键继续. . .
  22. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 12:38:43 | 显示全部楼层
  1. ++*(p);
复制代码


*(p)是*(p + 0)
*(p + 0)是p[0]
++*(p)是++p[0]

  1. #include <iostream>

  2. int main()
  3. {
  4.         int a[3] = {1, 2, 3};
  5.         int *p = &a[1];

  6.         std::cout << p << std::endl;
  7.         ++p[0];
  8.         std::cout << p << std::endl;
  9.         std::cout << a[0] << std::endl;
  10.         std::cout << a[1] << std::endl;
  11.         std::cout << a[2] << std::endl;
  12.         return 0;
  13. }

  14. /*
  15. 0000009DBFBFF99C
  16. 0000009DBFBFF99C
  17. 1
  18. 3
  19. 3
  20. 请按任意键继续. . .
  21. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 12:42:36 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2019-12-8 12:44 编辑
  1.         int y[10] = [5 , 2 , 9 , 6] , * p = y + 3 ;
复制代码

        p 指向 y[3],p - 1 自然指向 y[2],那么,语句:
  1.         ++ * (p - 1) ;
复制代码

        的意思自然是
  1.         ++ y[2]  ;
复制代码

        所以,y[2] 的值从 9 变成了 10,而 p 则依旧指向 y[3],这不是很正常吗?
        
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 11:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表