当前位置:   article > 正文

重新理解指针:用实例分清int* int** int*[] (int*)[]四者的区别

int*

一,int * int**

这种就是最简单的指针指向一个对象。

int *直接指向一个对象;int **指向一个指针

如下:

    int initialInt = 10;
    int *initialIntPoint = &initialInt;     一个指针对象指向对象
    int **initialIntPointPoint = &initialIntPoint;       这个是双指针,指向一个指针对象
    cout << "对象:  " << initialInt << endl;
    cout << "对象地址:  " << &initialInt << endl;     
    cout << "指针对象:  " << initialIntPoint << endl;        对象的地址
    cout << "指针解引用:  " << *initialIntPoint << endl;        解引用获得对象的值
    cout << "双指针对象:  " << *initialIntPointPoint << endl;      指针对象的地址
    cout << "双指针解引用:  " << *initialIntPointPoint << endl;
    cout << "双指针双解引用:  " << **initialIntPointPoint << endl << endl;      使用双解引用获得原本的值


二,一维数组和二维数组

    int initialArray[10] = { 1, 5, 10, 15, 20 };
    cout << "数组首地址:  " << initialArray << endl;       就一维,所以直接就是第一个的位置
    cout << "数组首地址解引用:  " << *initialArray << endl;
    cout << "数组首地址+1解引用:  " << *(initialArray + 1) << endl << endl;

    int initialTwoArray[2][4] = { { 2, 5, 6, 8 }, { 22, 55, 66, 88 } };
    cout << "二维数组第一行地址:  " << initialTwoArray << endl;     相当于指向某一维
    cout << "二维数组第一行第一个地址:  " << *initialTwoArray << endl;      指向某一维的第一个的地址
    cout << "二维数组第一行第一个地址解引用(第一个的值):  " << **initialTwoArray << endl;    某一维的第一个的值
    cout << "二维数组第一行地址第一个地址+1:  " << *initialTwoArray + 1 << endl;        指向某一维的第二个地址
    cout << "二维数组第一行地址第一个地址+1解引用(第二个值):  " << *(*initialTwoArray + 1) << endl;
    cout << "二维数组第一行地址+1(第二行):  "<<initialTwoArray + 1 << endl;         指向第二维
    cout << "二维数组第一行地址+1的第一个地址(第二行第一个的地址):  " << *(initialTwoArray + 1) << endl;         第二维的第一个的地址
    cout << "二维数组第一行地址+1的第一个地址解引用(第二行第一个的值):  " << **(initialTwoArray + 1) << endl;        第二维的第一个的值
    cout << "示例:第二行的第二个的值:  "<<*(*(initialTwoArray + 1) + 1) << endl << endl;    第一维加一的解引用表示第二维的首地址  再加一的解引用表示第二维的第二个的值


三,int*p[]

表示是一个数组,数组里面每一个都是指针;

    int *initialPointArray[10];
    *initialPointArray = initialArray;
    cout << "指向一个指针数组的地址:  " << initialPointArray << endl;
    cout << "指向一个指针数组的地址的第一个指针的地址(数组第一个对象位置):  " << *initialPointArray << endl;
    cout << "指向一个指针数组的地址的第一个指针的地址的解引用(数组第一个对象值):  " << **initialPointArray << endl;
    cout << "指向一个指针数组的地址的第二个指针的地址的解引用(数组第二个对象值):  " << *(*initialPointArray + 1) << endl << endl;

四,(int*p)[]

表示每一个指针指向一个数组

    int(*initialArrayPoint)[10];
    initialArrayPoint = &initialArray;
    cout << "指针指向一个位数为10的数组:" << endl;    表示指向一个一维数组
    cout << "指针指向一个数组的指针地址:  " << initialArrayPoint << endl;   代表这个数组第一个位置
    cout << "指针指向一个数组的指针地址的第一个地址:  " << *initialArrayPoint << endl;    这个数组第一个位置的地址
    cout << "指针指向一个数组的指针地址的第一个地址的值:  " << **initialArrayPoint << endl << endl;        这个数组第一个位置的值

    int(*initialArrayPoint2)[4];
    initialArrayPoint2 = *(&initialTwoArray);
    cout << "指针指向一个位数为4的二维数组:" << endl;     表示指向一个二维数组
    cout << "指针指向一维数组的指针地址:  " << initialArrayPoint2 << endl;      二维数组的第一维
    cout << "指针指向一维数组的指针地址的第一个地址:  " << *initialArrayPoint2 << endl;       二维数组第一维的第一个地址
    cout << "指针指向一维数组的指针地址的第一个地址的值:  " << **initialArrayPoint2 << endl;     二维数组的第一维的第一个的值
    cout << "指针指向二维数组的指针地址:  " << initialArrayPoint2+1 << endl;      二维数组的第二维
    cout << "指针指向二维数组的指针地址的第一个地址:  " << *(initialArrayPoint2+1) << endl;
    cout << "指针指向二维数组的指针地址的第一个地址的值:  " << **(initialArrayPoint2+1) << endl;        二维数组第二维的第一个的值

全部代码如下,可以自己实验

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int initialInt = 10;
  6. int *initialIntPoint = &initialInt;
  7. int **initialIntPointPoint = &initialIntPoint;
  8. cout << "对象: " << initialInt << endl;
  9. cout << "对象地址: " << &initialInt << endl;
  10. cout << "指针对象: " << initialIntPoint << endl;
  11. cout << "指针解引用: " << *initialIntPoint << endl;
  12. cout << "双指针对象: " << initialIntPointPoint << endl;
  13. cout << "双指针解引用: " << *initialIntPointPoint << endl;
  14. cout << "双指针双解引用: " << **initialIntPointPoint << endl << endl;
  15. int initialArray[10] = { 1, 5, 10, 15, 20 };
  16. cout << "数组首地址: " << initialArray << endl;
  17. cout << "数组首地址解引用: " << *initialArray << endl;
  18. cout << "数组首地址+1解引用: " << *(initialArray + 1) << endl << endl;
  19. int initialTwoArray[2][4] = { { 2, 5, 6, 8 }, { 22, 55, 66, 88 } };
  20. cout << "二维数组第一行地址: " << initialTwoArray << endl;
  21. cout << "二维数组第一行第一个地址: " << *initialTwoArray << endl;
  22. cout << "二维数组第一行第一个地址解引用(第一个的值): " << **initialTwoArray << endl;
  23. cout << "二维数组第一行地址第一个地址+1: " << *initialTwoArray + 1 << endl;
  24. cout << "二维数组第一行地址第一个地址+1解引用(第二个值): " << *(*initialTwoArray + 1) << endl;
  25. cout << "二维数组第一行地址+1(第二行): "<<initialTwoArray + 1 << endl;
  26. cout << "二维数组第一行地址+1的第一个地址(第二行第一个的地址): " << *(initialTwoArray + 1) << endl;
  27. cout << "二维数组第一行地址+1的第一个地址解引用(第二行第一个的值): " << **(initialTwoArray + 1) << endl;
  28. cout << "示例:第二行的第二个的值: "<<*(*(initialTwoArray + 1) + 1) << endl << endl;
  29. int *initialPointArray[10];
  30. *initialPointArray = initialArray;
  31. cout << "指向一个指针数组的地址: " << initialPointArray << endl;
  32. cout << "指向一个指针数组的地址的第一个指针的地址(数组第一个对象位置): " << *initialPointArray << endl;
  33. cout << "指向一个指针数组的地址的第一个指针的地址的解引用(数组第一个对象值): " << **initialPointArray << endl;
  34. cout << "指向一个指针数组的地址的第二个指针的地址的解引用(数组第二个对象值): " << *(*initialPointArray + 1) << endl << endl;
  35. int(*initialArrayPoint)[10];
  36. initialArrayPoint = &initialArray;
  37. cout << "指针指向一个位数为10的数组:" << endl;
  38. cout << "指针指向一个数组的指针地址: " << initialArrayPoint << endl;
  39. cout << "指针指向一个数组的指针地址的第一个地址: " << *initialArrayPoint << endl;
  40. cout << "指针指向一个数组的指针地址的第一个地址的值: " << **initialArrayPoint << endl << endl;
  41. int(*initialArrayPoint2)[4];
  42. initialArrayPoint2 = *(&initialTwoArray);
  43. cout << "指针指向一个位数为4的二维数组:" << endl;
  44. cout << "指针指向一维数组的指针地址: " << initialArrayPoint2 << endl;
  45. cout << "指针指向一维数组的指针地址的第一个地址: " << *initialArrayPoint2 << endl;
  46. cout << "指针指向一维数组的指针地址的第一个地址的值: " << **initialArrayPoint2 << endl;
  47. cout << "指针指向二维数组的指针地址: " << initialArrayPoint2+1 << endl;
  48. cout << "指针指向二维数组的指针地址的第一个地址: " << *(initialArrayPoint2+1) << endl;
  49. cout << "指针指向二维数组的指针地址的第一个地址的值: " << **(initialArrayPoint2 + 1) << endl << endl;
  50. system("pause");
  51. return 0;
  52. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码秘术家/article/detail/63165
推荐阅读
相关标签
  

闽ICP备14008679号