当前位置:   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/blog/article/detail/63165
推荐阅读
  • StartTime:2019-2-19EndTime:2019-4-1updateTime:2019-2-261.主路线1.1掘金郭冬冬——直通大厂,金三银四该专栏涵盖css(9),js(21),浏览器(9),服务端与网络(7),框架:vu... [详细]

  • 1.何谓IT?信息技术(英语:InformationTechnology,简称IT),是主要用于管理和处理信息所采用的各种技术总称。它主要是应用计算机科学和通信技术来设计、开发、安装和实施信息系统及应用软件。它也常被称为信息和通信技术(In... [详细]

  • STM32IAR7.30开发环境搭建_iar7.30如何安装iar7.30如何安装本文主要内容来至于网络,感谢网络同仁的贡献。1Keil-MDK工程后缀:.uvprojx1.1Keil-MDKInstallGuidePSN:U1E21-CM... [详细]

  • a)inta;表示一个内存空间,这个空间用来存放一个整数(int);b)int*a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间;c)int**a;表示一个内存空间,这个空间用来存放一个指针... [详细]

  • 在计算机领域,并发指的是系统在同一时间内处理大量的请求。在Web应用程序中,并发通常是指同时有很多用户访问同一个接口,这时系统需要能够快速响应并处理这些请求。如果系统无法处理这些请求,就会导致性能下降、响应时间变长、甚至崩溃。本文介绍了... [详细]

  • 闭包是能够读取其他函数内部变量的函数要理解闭包,首先必须理解Javascript特殊的变量作用域闭包的特性:1.封闭性:外界无法访问闭包内部的数据,如果在闭包内声明变量,外界是无法访问的,除非闭包主动向外界提供访问接口;2.持久性:一般的函... [详细]

  • c语言初阶之函数_c语言函数可以改变调用参数的值吗c语言函数可以改变调用参数的值吗1.函数是什么?2.函数的分类库函数要求有会掌握一些库函数的模拟实现,及查询库函数的功能和头文件的能力    &nbs... [详细]

  • 一、线性链表元素转置参考书:《数据结构(C语言)》–严蔚敏等编著,清华大学出版社。1、转置思想如图:若线性链表初始化为:1,2,3,4,5从第2个位置进行元素转置步骤:转置元素应为:1,2,5,4,3(1)建立Pre指针指向1,Cur... [详细]

  • 皇后问题:回溯算法,Python_python4皇后问题python4皇后问题概要:四皇后问题出现在回溯算法里,所以主要采用回溯算法解决一共有三个函数实现,作用分别是初始化棋盘,选择皇后所在位置,显示出来第一个函数:InitGrid(d)... [详细]

  • 答:标签闭合、标签小写、不乱嵌套、提高搜索机器人搜索几率、使用外链CSS和JS脚本、结构行为表现的分离、文件下载与页面速度更快、内容能被更多的用户所访问、内容能被更广泛的设备所访问、更少的代码和组件、容易维护、改版方便,不需要变动页面内容、... [详细]

  • 文件下载response响应ContentType与a标签download属性_下载文件content-type下载文件content-type参考资料MediaType介绍了解HTML/HTML5中的download属性header中C... [详细]

  • 技术不同。简单的可以理解为:初级中级的只关注代码,编程。高级的就要考虑系统的架构,整体框架。一、初级部分1、Java程序设计基础,包括J2sdk基础、Java面向对象基础、JavaAPI使用、数据结构及算法基础、JavaAWT图形界面程序开... [详细]

  • 软件需求软件需求是指用户对目标软件系统在功能、性能、质量等方面的期望,以及对目标软件系统在运行环境、资源消耗等方面的约束。通常将用户需求分为两大类:(1)功能性需求:用户对软件系统能够完成何种功能,以及在某些场景下软件系统能够展现的何种外部... [详细]

  • 引言['1','2','3'].map(parseInt)输出结果是什么?这是在Daily-Interview-Question项目看到一个比较有意思的题目。..._daily-interview-questiondaily-intervi... [详细]

  • 在printf时,可以设置输出的精度(%m.pX或%-m.pX格式-这里m、p都是整数,X是字母,p若要省去,m与p之间的.也要省去);但是scanf是不能设置精度的,但是可以设置输入的,即不可以有%.pX类形式,但是可以有%mX... [详细]

  • 华为职级体系与薪酬2019-08-2121:591构成1.1外在激励money股票需要确定标准的维度是员工的入职时间、总工作年限、现岗位工作时间、岗位级别、上年度业绩表现、团队合作度和员工总评价,最终会得出确定符合条件的员工可以购买的股票性... [详细]

  • 给自己的秋招一个总结(最大的感触是注意平时细节问题的整理与积累,多动手写下程序。)推荐的书:1.计算机视觉——算法与应用(RichardSzeliski清华大学出版社)2.计算机视觉中多视图几何(RichardHartley安徽大学出版社)... [详细]

  • 备考pmp需要多长时间?一般来说,考试前三个月是备考的黄金时期,这个时间段不会太长也不会太短,时间太长容易忘记,对学过的知识点不能牢固的记忆,而时间太短学习任务太重,知识点多的时候有些学不过来,并且复习不到位容易造成一种紧急与焦虑感,那么三... [详细]

  • 我们知道SpringBoot已经提供了一套默认的异常处理机制,但是SpringBoot提供的默认异常处理机制却并不一定适合我们实际的业务场景,因此,我们通常会根据自身的需要对SpringBoot全局异常进行统一定制,例如定制错误页面,定制错... [详细]

  • 随着人工智能大火,我们身边几乎处处充满着AL气息,就连停车,都是机器人值班了。可是很多人都不知道人工智能是由什么开发,各种相关联框架都是以Python作为主要语言开发出来Python本身很普通,是所有编程语言中和自然语言或者说伪代... [详细]

相关标签
  

闽ICP备14008679号