精华内容
下载资源
问答
  • 在定义变量后,将一个变量赋值给另一个变量时,在内存中的存储方式为: int a; int b; 定义变量a,b后,他们在栈中存储的方式如下,a,b存储的位置是系统随机分配的,可能是不连续的空间。 int b = a; 将a中的值...

    定义变量

    int a = 10;
    int b = a;
    
    b = 20;
    System.out.println("a = " + a); // a = 10
    a = 30;
    System.out.println("b = " + b); // b = 20
    

    在定义变量后,将一个变量赋值给另一个变量时,在内存中的存储方式为:

    int a;
    int b;
    定义变量a,b后,他们在栈中存储的方式如下,a,b存储的位置是系统随机分配的,可能是不连续的空间。

    在这里插入图片描述

    int b = a;
    将a中的值10赋值给b。此时在a和b中都有值。
    若改变a的值,将不会影响b的值,改变b的值也不会影响a的值

    在这里插入图片描述

    定义数组

    int[] arr = new int[]{10,20,30};
    int[] brr = arr;
    
    
    brr[0] = 20;
    System.out.println("a = " + arr[0]); // arr[0] = 20
    arr[0] = 30;
    System.out.println("b = " + brr[0]); // brr[0] = 30
    

    在定义一个数组时,new在堆中开辟内存空间,系统会在栈中声明一个数组名,同时在堆中开辟一块内存空间来存放数组,将首元素的地址存放在数组名中。
    在这里插入图片描述

    int[] brr = arr;
    因为brr没有new创建新的对象,而只是将arr变量名中存放的地址赋值给brr,这样,brr中就存放与arr相同的地址。所以此时修改arr中的值时,brr中的值也会修改。反之亦然。

    在这里插入图片描述

    定义二维数组

    数据类型[][] 数组名 = new 数据类型[m][n];

    	m:表示这个二维数组有多少个一维数组。
    	n:表示每一个一维数组的元素有多少个。
    

    例如:

    int arr[][]=new int[3][2];
    

    在这里插入图片描述

    总结:
    1、栈:程序运行,堆:数据存储
    2、栈存储方法调用时产生的局部变量(如 8种基本数据类型byte、boolean、char、short、int、long、float、double,以及 对象引用地址), 而堆存储对象的实例(使用new创建的对象实例)
    3、栈没有 GC, 而堆有 GC(GC的全称是garbage collection,垃圾回收)
    4、栈是不同线程间是隔离的, 而堆是共享的

    展开全文
  • #define MAXSIZE 100 #define ElementType int typedef struct LNode* List; struct LNode { ElementType Data[MAXSIZE]; int Last; };...//访问下标为 i 的元素:Lnode.Data[i]或Ptrl->Da...
    #define MAXSIZE 100
    #define ElementType int
    typedef struct LNode* List;
    struct LNode
    {
    	ElementType Data[MAXSIZE];
    	int Last;
    };
    struct LNode Lnode;
    List PtrL;
    
    //访问下标为 i 的元素:Lnode.Data[i]或Ptrl->Data[i]
    //线性表的长度:Lnode.last + 1或Ptrl->last + 1
    
    //初始化(建立空表)
    List MakeEmpty()
    {
    	List PtrL;
    	PtrL = (List)malloc(sizeof(struct LNode));
    	PtrL->Last = -1;
    	return PtrL;
    }
    
    //查找元素
    int Find(ElementType X, List PtrL)
    {
    	int i = 0;
    	while (i < PtrL->Last && PtrL->Data[i] != X)
    	{
    		i++;
    	}
    	if (i > PtrL->Last)
    		return -1;
    	else
    		return i;
    }
    
    //插入元素(在第 i 个位置上插入元素X)
    void Insert(ElementType X, List PtrL, int i)
    {
    	int j;
    	if (PtrL->Last == MAXSIZE - 1)
    	{
    		printf("表满");
    		return;
    	}
    	if (i<1 || i>PtrL->Last + 2)
    	{
    		printf("位置越界");
    		return;
    	}
    	for (j = PtrL->Last; j > i; j--)
    	{
    		PtrL->Data[j + 1] = PtrL->Data[j];
    	}
    	PtrL->Data[i - 1] = X;
    	PtrL->Last++;
    	return;
    }
    
    //删除某位置上元素
    void Delete(List PtrL, int i)
    {
    	int j;
    	if (i<1 || i>PtrL->Last + 2)
    	{
    		printf("位置越界");
    		return;
    	}
    	for (j = i; j <= PtrL->Last; j++)
    	{
    		PtrL->Data[j - 1] = PtrL->Data[j];
    	}
    	PtrL->Last--;
    	return;
    }
    
    
    展开全文
  • 视频课程: 尚硅谷韩顺平Java数据结构与算法 稀疏数组(sparsearray) ...稀疏数组存储方法 稀疏数组第一行记录原数组一共有几行几列,有多少个不同的值。 稀疏数组其他行记录原数组中有意义值的行.

    视频课程: 尚硅谷韩顺平Java数据结构与算法

    稀疏数组(sparsearray)


    稀疏数组问题引入

    五子棋程序中,存盘退出和继续上盘的功能

    在这里插入图片描述

    存在问题:将棋盘映射成一个二维数组后,数组中的许多值是0;数组中记录了许多没有意义的数据。

    稀疏数组基本介绍

    当一个数组中的大部分元素为0,或者为同一个值的数组,可以使用稀疏数组来保存该数组
    稀疏数组的列固定为3列(行,列,值)

    稀疏数组的存储方法

    1. 稀疏数组第一行记录原数组一共有几行几列,有多少个不同的值。
    2. 稀疏数组其他行记录原数组中有意义值的行列和值的大小,
    稀疏数组图解

    在这里插入图片描述

    二维数组与稀疏数组的转换

    • 二维数组转稀疏数组步骤

      1. 遍历二维数组获取二维数组中有效值的个数count

      2. 创建稀疏数组 根据count;sparseArr int[count+1][3];

      3. 将二维数组中的有效值存储到稀疏数组中

    • 稀疏数组转二维数组

      1. 读取稀疏数组的第一行,根据第一行的数据,创建二维数组
      2. 读取稀疏数组的后几行数据,赋值给二维数组
    • 代码实现

    //将二维数组转为稀疏数组
    public  static int[][] toSparseArr(int[][] arr) {
            int count = 0;
            //1-遍历二维数组,获取二维数组中有效数据的个数
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                    if (arr[i][j] != 0){
                        count++;
                    }
                }
            }
            //2-根据count创建稀疏数组(稀疏数组恒定3列)
            //sparseArr定义为count+1行,因为稀疏数组第一行要存储二维数组行列信息
            int[][] sparseArr = new int[count+1][3];
    
            //3-将二维数组的有效值赋给稀疏数组
            //3-1-稀疏数组第一行
            sparseArr[0][0] = arr.length;  //存储二维数组的行数
            sparseArr[0][1] = arr[0].length; //存储二维数组的列数
            sparseArr[0][2] = count;
            //3-2-稀疏数组的其它行
            int row = 0; //用于定位稀疏数组的当前行
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                    if (arr[i][j] != 0){
                        row++;
                        sparseArr[row][0] = i;
                        sparseArr[row][1] = j;
                        sparseArr[row][2] = arr[i][j];
                    }
                }
            }
            return sparseArr;
        }
    
    //将稀疏数组还原回二维数组
    public static int[][] toArray(int[][] sparseArr) {
            //1-根据稀疏数组第一行创建二维数组
            int row = sparseArr[0][0];
            int col = sparseArr[0][1];
            int count = sparseArr[0][2];
    
            int[][] arr = new int[row][col];
            //2-遍历稀疏数组(从下标1开始) 给二维数组赋值
            for (int i = 1; i < sparseArr.length; i++) {
                arr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
            }
            return arr;
        }
    
    展开全文
  • 现在数组存储的不再是int,double..的类型了,而是存储数组数组中的元素还是数组,我们把它称之为数组中的数组,也就做二维数组。维度增加了一层。二二维数组的基本定义→(这个数组里面存放的还是数组)→(最...

    一.

    a802bd77e93714f47365963c1bdba78c.png

    接下讨论数组中特殊的一部分。数组是一个容器,用来存储数据的。现在数组中存储的不再是int,double..的类型了,而是存储的数组。

    数组中的元素还是数组,我们把它称之为数组中的数组,也就做二维数组。维度增加了一层。

    二维数组的基本定义

    65859e366be810443a4750c44d0a5982.png

    b1e1fa4bd9eb804537df53d13b4a22c0.png(这个数组里面存放的还是数组)→

    df556635e01ce3575ddd64fcb4e85aa6.png(最里面装的是int类型元素)

    这就是定义了一个二维数组,但是数组需要长度,里面有几个一维数组。

    12c493962ace03db0d46bec8d9f5ff59.png这个代表着有三个小箱子,每个小箱子里有两个小格子。这个书写的形式挺奇怪的。

    对二维数组的定义的理解:先通过new创建一个数组new [],接着数组中装的元素也是数组new [][],数组里装的数组里面的元素是int类型,new int[][],然后每一个数组都有固定的长度。二维数组要明确数组里面装了几个数组,每个数组里有几个元素,new int[3][2]。为了操作创建好的数组,给它命名arr=new int[3][2], 名字叫arr的变量是什么类型?元素为int类型的二维数组类型 int [][] arr=new int[3][2]。

    这里还有一点要注意的就是格式问题,数组的符号[]可以移动,三种写法都可以,int[][] arr,int[] arr[],int arr[][]。

    二. 二维数组的应用

    打印二维数组是什么样的?

    55f935748c24f8a04abe96e1a240429e.png

    1ec043b28168f53f293289c72572616f.png

    对于二维数组而言,arr[0]代表的是二维数组里的第一个一维数组。

    现在我们想操作二维数组中的第一个一维数组里的0角标元素。

    03f54e071a757fd1c874ea19cffe41e3.png

    连续两个数组符号[],它们分别代表的含义是不同的。第一个数组符号[]代表的是第几个一维数组,第二个数组符号里面的数字代表的是某个一维数组中的第几位元素。arr[0][0]代表的是二维数组中第0位数组中的第0位元素。

    这里有一点,二维数组的输出arr[0]打印出来的内容是什么样的?

    先介绍二维数组在内存中的图解。

    688947c2a895282f2bf12d174f53e6dc.png

    34349cf3aee7687500f1e0fb86103d95.png

    首先,arr在函数中,属于局部变量,在栈中。右边式子中有new新建的数组,因此其在堆中开辟内存空间。之所以两者分开了存储,就在于它们之间是一个引用的关系,和直接用常量赋值变量int a=4的方式不一样,堆中的对象是靠的编号的,它把编号给栈中的变量,靠这个编号两者之间搭上关系。

    7a41111e6c528ec28328fbf988619816.png

    对于二维数组的分析是一步步来的,以new int[3][2]为例,先明确二维数组的长度,二维数组的长度为3,上面截图中的虚线格子代表就是一维数组,0,1,2代表的是二维数组的长度是3,每一个里面角标里面都是一个一维数组。

    94b3119e6daf9aa5d3babc88c21a41aa.png

    上面的截图体现了二维数组在内存中分布的意思,但是这么画是错误的。开辟一个空间出来,0是由默认初始化的值,那这里面是什么?它这里本身就应该存数组,如果没有数组,应该存什么?(),因为数组是实体,当没有实体时 ,引用型数据类型的默认值就是null(代表着没有任何指向)。int类型的默认值是0,double默认值是0.0。

    519b1fece01d1fa66fbe3e2fc656ab65.png

    任何一个实体,在堆内存中产生,它里面的数据都会进行默认初始化。这是系统自动完成的。接着问题就来了,一维数组在哪儿?

    一维数组也是个实体,是要是实体,都要在堆内存中开辟空间,所以一维数组也要自己独立的开辟一个内存空间,同时分配了一个地址空间。接着把这个地址空间送入对应的位置。

    a1c9eedd9f2a2bb7d9b1406572d036ee.png   

    4c8396f5b34731a552bcda8f9941ef45.png

    上面的右侧截图后,二维数组才真正的初始化完毕。紧接着二维数组把地址给arr,然后arr就可以指向二维数组。

    31cc040f2f54624854b29b0e52337e5d.png

    展开全文
  • 第二,matrix是一个二维数组,二维数组在内存中是按行存放的,即先放第1行,再放第2行……每行中的元素是按列下标由小到大的次序存放,这样的存储方式也称为行优先存储。 第三,这里定义的数组 int *matrix是一个...
  • 如下:a1 = np.zeros((3,4)) # 创建3*4全零二维数组输出:array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]])可以看出创建了一个3×4的矩阵,由于python与matlab都是行优先存储的,...
  • 数组存储二叉树遍历

    2021-03-30 15:55:26
    从数据结构来看,数组存储方式和树的存储方式可以相互转换,数组可以转换成树,树也可以转换成数组 分析 树的左子节点为 父节点坐标2+1 树的右子节点为 父节点坐标2+2 父节点坐标 = (当前节点-1)/2 问题 用代码...
  • 从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,看下面的示意图。 顺序二叉树有两个要求: 1.上图的二叉树结点,以数组的方式来存放 2.要求在遍历数组时,...
  • 数组存储压缩原理

    千次阅读 2019-06-03 20:28:38
    存储方式3.数组存储压缩 1.存储单元 内存分为若干个存储单元,计算机记录着这些存储单元的首地址。一个存储单元的大小通常为4KB。 2.存储方式 计算机只保留每个存储单元的首地址。当我们声明两个变量时(这里假设两...
  • 前言最近我在翻译Eigen的文档中,涉及到了矩阵的按行或列存储,不禁想到多维数组的存储方式,由于把当初学习的内容已还给了老师,并且在网上查看的一些数组存储方式,个人认为要么太理论,要么有一些图解的系列中的...
  • 多维数组存储的两种方式

    万次阅读 2013-11-08 12:47:30
    1 数组存储的要求 数组存储的要求:连续存储。   连续:数组的n个元素对应n(或n+1)个内存地址,两相邻元素的地址相邻。   相邻元素:对于一维数组来说,相邻元素没有多大的选择,就是下标差绝对值为1的两...
  • Fortran和 C语言中数组存储方式

    千次阅读 2012-10-21 12:11:31
    Fortran和matlab语言中的多维数组存储方式为列优先原则,内循环最好是列循环;而c语言中的多维数组存储方式为行优先原则,内循环最好是行循环。下面介绍何为行优先存储,何为列优先存储。  例如二维数组Amn ...
  • 1、数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入某个值(按一定顺序)会整体移动,效率较低 2、链式存储...
  • 前言最近我在翻译Eigen的文档中,涉及到了矩阵的按行或列存储,不禁想到多维数组的存储方式,由于把当初学习的内容已还给了老师,并且在网上查看的一些数组存储方式,个人认为要么太理论,要么有一些图解的系列中的...
  • Java 数组存储机制

    2019-04-14 16:01:24
    数组用来存储类型相同的一组数据,一旦初始化完成,其所占的空间也确定下来了,即使清除某个元素,其所占用的空间仍然存在,即,数组的长度不能被改变,且数组只有在分配空间后才能使用。 数组的初始化方式有两种,a...
  • java数组存储方式

    2020-07-25 09:48:09
    java数组在内存中的存储方式 数组的引用存在栈中,而数组中的元素都存储在堆中。数组作为一种容器,它在堆中所被分配的是一段连续的空间。用来存放元素,这段连续的空间每一个空间都有下标,下标是连续的对应的! ...
  • Fortran和matlab语言中的多维数组存储方式为列优先原则,内循环最好是列循环;而c语言中的多维数组存储方式为行优先原则,内循环最好是行循环。下面介绍何为行优先存储,何为列优先存储。 例如二维数组Amn (1)...
  • 最近在学数据结构,想了解一下 JavaScript 中数组存储方式,觉得以下文章写的挺好,记录一下。 Javascript中的数组在内存中是如何保存的? HashMap(哈希映射) ArrayBuffer(阮一峰老师) ...
  • 二维数组存储地址

    千次阅读 2016-09-19 23:20:11
    数据结构题二维数组存储地址 二维数组A[10...20,5....10]采用行序为主存方式存储,每个元素占4个存储单元,且A[10,5]的存储地址为1000,则A[18,9]的存储地址? 1、不管按行还是按列,都是顺序存储。按行...
  • C 语言数组存储汉字问题小结

    千次阅读 2020-10-25 14:52:40
    在讨论数组存储汉字之前,首先要明确一个基本概念:汉字存储占用空间大小与使用何种编码方式有关。常见的中文编码 GB2312(国标简体中文字符集)和 GBK(国标扩展)使用 2 个字节编码来表示一个汉字,不常用的 GB...
  • java数组存储方式

    千次阅读 2016-10-29 21:28:33
    本文有Arckal撰写,转载请注明出处:http://blog.csdn.net/u014108439/article/details/52966794Java数组是一种引用数据类型。数组变量并不是数组本身,而是指向堆内存中存放的数组对象。...- 用于存储数组和对
  • 数据结构之用数组存储图 题目 从给定的ctiy.dat文件中读取顶点数据,从distance.dat文件中读取边上的权值,先以矩阵表示法来存储这个图,然后采用深度优先遍历的方式访问这个图。 题目大意 #include<stdio.h&...
  • 多维数组存储与访问方式 二维数组:一维数组可对应数学中的向量,而二维数组可对应矩阵,可用一个二维数组存储矩阵。 图1 二维数组mat示意图 二维数组的横向称为行,纵向称为列,上面这个数组为三行六列。...
  • 复习内容: 数组存储方式、Arrays.toString()、Arrays.sort()、Arrays.copyOf()、System.arraycopy()、数组排序、数组复制、数组扩容、数组作为方法参数等 如有错误,欢迎在评论区指出,非常感谢! 一、数组存储...
  • 在编写S5P6818的液晶屏应用程序时,用到了数组,其中我认为二维数组比较容易理解,所以简单得探讨了二维数组存储方式。我时在LInux下的gcc编译的。 猜想: 二维的开头的内存地址会链接上一维开头的末尾。如一个[3]...
  • 数组存储方式

    2016-03-21 17:24:48

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,156
精华内容 6,462
关键字:

数组存储方式