热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从零开始的数据结构生活数组与指针基础(含个人深度理解)

大一初入数据结构,错漏请指教,与大家共同进步。数组与指针何为数组一段连续的空间(明确告诉编译器,一共有多少块空间)用来相同类型的数据数组

大一初入数据结构,错漏请指教,与大家共同进步。


数组与指针


  • 何为数组

    • 一段连续的空间(明确告诉编译器,一共有多少块空间) 用来相同类型的数据

    • 数组的名字是给用户看的,在实际的内存中是用地址寻找

    • 访问元素通过数组下标,数组下标从0开始

    • 数组都是顺序存储

    • 数组名是首元素的地址

  • 一维数组

    int array1[3]={1,2,3};//静态初始化
    int array2[3];//动态初始化 用于遍历输入和输出
    for(int i&#61;0;i<3;i&#43;&#43;){array2[i]&#61;1;
    }
    for(int j&#61;0;j<3;j&#43;&#43;){printf("%d\n",array[j]);
    }
    int array3[3]&#61;{[1]&#61;2,3};//指定初始化

    • 指定初始化时会延顺赋值&#xff0c;越界不报错

    • 有个别元素初始化时&#xff0c;其他默认为0

  • 二维数组

    • 实际内存上不是矩阵&#xff0c;而是一维数组的嵌套

    • array01[3]中存放三个&#xff08;一维数组&#xff09;序列相应的地址,本质上就是指针&#xff0c;存放指向三个数组的地址&#xff08;指向三个地址&#xff09;

      int array01[3][3] &#61; {//二维数组静态初始化{1,2,3},{7,8,9},{4,5,6}};
      for (int i &#61; 0; i <3; i&#43;&#43;) {//二维的遍历for (int j &#61; 0; j <3; j&#43;&#43;) {printf("%d\n", array01[i][j]);

  • 指针

    • 指针指向某个变量&#xff08;具体空间&#xff09;即指针变量中存放了这个变量&#xff08;具体空间&#xff09;的地址

    • 地址按照字节编制的,地址就是16进制

    • 指针使用要初始化&#xff0c;但不是单纯赋值&#xff0c;而是指向具体空间

    • 野指针&#xff1a;有指向空间的,但是是乱指

    • 空指针&#xff1a;指的NULL&#xff0c;用于判断&#xff0c;多一步判断就是为程序的健壮性&#xff0c;例如数据边界问题

      //错误示范
      int *p;
      *p&#61;5;//因为这个5不知道存放在哪&#xff0c;有可能修改了内部数据&#xff0c;所以视为非法访问
      //正确示范
      int a;//有具体空间
      int* p1&#61;&a;
      *p1&#61;5;

  • 数组与指针的联系

    • array[3]&#61;{2,4,6};中有两种方法找到4这个元素&#xff1a;一种是通过数组下标array[1],二是*(p&#43;1),本质都是通过索引

    • 理解指针类型的作用(为什么指针要有类型)

      int array&#61;{1,3,5};
      int *p&#61;array;
      printf("%d\n",*p&#43;1);//结果为2
      printf("%d\n",(*p&#43;1));//结果为2
      printf("%d\n",(*p)&#43;1);//结果为2
      printf("%d\n",*(p&#43;1));//结果为3
      //本质区别在于*和&#43;的优先级关系
      //但是为什么p&#43;1能指向下一个格子呢&#xff1f;在于指针有类型
      //所以指针类型的作用&#xff1a;方便移动&#xff0c;即&#43;1之后找到相同类型的数据&#xff08;比如int类型4个字节 double类型8个字节&#xff09;
      //所以此例中地址&#43;1 实际上是增加一个int类型的存储单元
      //所以array&#43;4<&#61;>&array[2]

    • 数组即指针&#xff08;通过二维数组来理解&#xff09;

      int array[3][3] &#61; {//二维数组{1,2,3},//为什么说array[3]中存放三个&#xff08;一维数组&#xff09;序列相应的地址&#xff1f;{7,8,9},{4,5,6}};
      int(*p)[3];//二维数组的另一种表达
      p&#61;array;

      • 利用降维思想来理解

        1. 指针指向普通变量

          int a&#61;5;
          int*p&#61;&a&#xff1b;

        p指向a这个具体空间

        即p的空间存放a空间的地址

        即p&#61;&a

        即*p时&#xff0c;找到p中放有的地址的值&#xff08;找到这个空间有什么&#xff09;

        1. 指针指向一维数组

          int array[3]&#61;{4,5,6};
          int* p&#61;array;

          由数组名是首元素地址

          p指向4这个元素&#xff0c;是指向一个int类型的值&#xff08;空间&#xff09;

          *p时&#xff0c;找到首元素4&#xff0c;当array[0]时&#xff0c;也能找到首元素4

          所以*parray[0]等价

          所以*p&#43;1array[1]等价

        2. 指针指向二维数组

          int array[2][2] &#61; {{5,6},{7,8}};
          int (*p)[2];
          p&#61;array;

          • 由数组名是首元素的地址

          • 数组名arrayarray[0]的地址&#xff0c;即array存放array[0]的地址&#xff0c;即array指向array[0],并且array[0]是包含两个int的一维数组&#xff0c;所以array指向两个int大小的空间(此时把array[0]当作数组来理解)

          • 可以令array[0]array1&#xff0c;则一维数组简化为array1[3]

          • 数组名array1则为array[0][0]的地址&#xff0c;则数组名array[0]则为array[0][0]的地址,即array[0]存放array[0][0]的地址&#xff0c;即array[0]指向array[0][0],并且array[0][0]包含一个int的单个元素&#xff0c;所以array[0]指向一个int大小的空间(此时把array[0]当作指针来理解)

          • array&#61;&#61;&array[0]
            array[0]&#61;&#61;&array[0][0]
            **array&#61;&#61;*array[0]&#61;&#61;array[0][0]
            //所以只能说明始于同一个地址&#xff0c;但是指向空间大小不一样
            //所以在&#43;1移动时得到不同的值

          • 所以*p是指向包含两个int大小的空间

            printf("%d\n",**p&#43;1);//结果为6
            printf("%d\n",*(*p&#43;1));//结果为6
            printf("%d\n",**(p&#43;1));//结果为7结构体


推荐阅读
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有