指针的加减算术运算-指针加常数意味着什么?

ゞ 浴缸里的玫瑰 2024-04-18 15:07 185阅读 0赞

一、重点

  1. 指针是一个大小固定为4个byte的变量,不管是什么类型的指针大小都是固定的,它存放的只是一个地址信息。

  2. 指针变量加1,即表示指针变量指向下一个数据元素的首地址。这并不是在原地址值的基础上加1。至于真实的地址加了多少,要看原来指针指向的数据类型是什么。

  3. 真实的地址计算原则上为:指针P+1 = 指针P + sizeof(指针的类型) * 1

二、指针操作分析——“p++”、”*p++”、”*p=*p+1”、”(*p)++”

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int *p;///声明一个指针变量
  6. int n[20];///创建一个简单的数组用于观察指针
  7. for (int i=0;i<20;i++)
  8. {
  9. n[i] = i*10;
  10. }
  11. p= &n [2];///用指针p指向数组中某个元素
  12. ///【1】初始状态
  13. cout << "【1】初始状态" << endl;
  14. cout << " p = " << p << endl;
  15. cout << "*p = " << *p << endl << endl;
  16. /* 输出结果:
  17. 【1】初始状态
  18. p = 0x6dfeb0
  19. *p = 20
  20. */
  21. ///【2】p++的情况
  22. p++;
  23. cout << "【2】p++的情况" << endl;
  24. cout << " p = " << p << endl;
  25. cout << "*p = " << *p << endl << endl;
  26. p--;///复原
  27. /* 输出结果:
  28. 【2】p++的情况
  29. p = 0x6dfeb4
  30. *p = 30
  31. */
  32. ///【3】*p++的情况
  33. *p++;
  34. cout << "【3】*p++之后" << endl;
  35. cout << " p = " << p << endl;
  36. cout << "*p = " << *p << endl << endl;
  37. *p--;///复原
  38. /* 输出结果:
  39. 【3】*p++之后
  40. p = 0x6dfeb4
  41. *p = 30
  42. */
  43. ///【4】*p=*p+1的情况
  44. *p=*p+1;
  45. cout << "【4】*p=*p+1之后" << endl;
  46. cout << " p = " << p << endl;
  47. cout << "*p = " << *p << endl << endl;
  48. *p=*p-1;///复原
  49. /* 输出结果:
  50. 【4】*p=*p+1之后
  51. p = 0x6dfeb0
  52. *p = 21
  53. */
  54. ///【5】(*p)++的情况
  55. (*p)++;
  56. cout << "【5】(*p)++之后" << endl;
  57. cout << " p = " << p << endl;
  58. cout << "*p = " << *p << endl << endl;
  59. /* 输出结果:
  60. 【5】(*p)++之后
  61. p = 0x6dfeb0
  62. *p = 21
  63. */
  64. return 0;
  65. }
  66. /*
  67. 四种操作的效果总结起来如下:
  68. "p++"的效果:指针向下移动一个单位(对于int变量的数组,指针移动了4字节),指针内的内容并未变化。
  69. "*p++"的效果:指针向下移动一个单位(对于int变量的数组,指针移动了4字节),指针内的内容并未变化。与"p++"效果相同!
  70. "*p=*p+1"的效果:指针不移动,但指针所指的数据有+1效果。
  71. *p=*p+1的效果:指针不移动,但指针所指的数据有+1效果。与"*p=*p+1"效果相同!
  72. 结论是:
  73. 若要对指针进行移位操作,只需对指针变量本身进行加减。
  74. 若要对指针所指的内容进行操作,需要将“取内容的*”和指针变量放在一个括号里(比如"(*p)"),这样才能对指针所指的内容进行操作。
  75. */

四种操作的效果总结起来如下:

“p++”的效果:指针向下移动一个单位(对于int变量的数组,指针移动了4字节),指针内的内容并未变化。

“*p++”的效果:指针向下移动一个单位(对于int变量的数组,指针移动了4字节),指针内的内容并未变化。与”p++”效果相同!

“*p=*p+1”的效果:指针不移动,但指针所指的数据有+1效果。

*p=*p+1的效果:指针不移动,但指针所指的数据有+1效果。与”*p=*p+1”效果相同!

结论是:

若要对指针进行移位操作,只需对指针变量本身进行加减。

若要对指针所指的内容进行操作,需要将“取内容的*”和指针变量放在一个括号里(比如”(*p)”),这样才能对指针所指的内容进行操作。

原文链接:https://blog.csdn.net/yibeiyese/article/details/80883037

发表评论

表情:
评论列表 (有 0 条评论,185人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++ 指针运算

    首先明确几点: 1:涉及到数组的指针,若两指针指向的不是同一个数组,那么指针之间的加减运算是无意义的,因为得到的结果就是他们地址之间的差值。 2:指针变量加/减 一个整数,

    相关 (双指针+前缀和)

    题目:给定一个长度为n的序列,进行加一减一的操作不超过k次,最多有多少个数相同? 思路:维护若干个区间,每个区间都能在k步内变为同一个数,求最长的区间。尽量往中位数靠。 两