精华内容
下载资源
问答
  • C++/JAVA数组下标为什么从0开始

    千次阅读 2017-12-05 10:38:52
    在我们日常的学习过程中,我们了解到在C++/JAVA中,数组下标是从0开始的。对于新手来说,遍历的数组的时候还真是容易出错。但是为什么要这样规定,这样规定有什么好处? 其实根据我们前辈的思想,这样规定的主要...

    在我们日常的学习过程中,我们了解到在C++/JAVA中,数组下标是从0开始的。对于新手来说,遍历的数组的时候还真是容易出错。但是为什么要这样规定,这样规定有什么好处?

    其实根据我们前辈的思想,这样规定的主要好处是方便“寻址”。这就要涉及到底层硬件的知识,我们知道程序运行时,变量的值,运算的结果值等都是暂时放在内存中。举个例子:int a = new int [5]  这是JAVA中常用的创建数组的程序语句。

    当这句话执行完毕后,机器都做了什么?

    首先在内存就开辟了一块地址空间(内存中地址空间都是连续的,地址中的内容就是你存储在其中的值),然后变量a就指向了这片地址空间的“首”地址,如果想要访问这片地址的其他地址,那么就得用偏移量来计算,如下图:

                                                             

    变量a已经指向首地址,a[0] = a + 0 ,0代表的就是偏移量,a偏移0个单位,就是其本身,所以a[0]代表的就是第一个地址。  a[1] = a + 1;  a偏移一个单位,那么就可以访问到a[1],也就是第二个地址。所以只需要   变量名+[偏移量] ,(如 a[0]) 就可以访问到相应的内存地址。这是下标从0开始的情况。

    还有一些语言,如pascal , delphin 等下标都是从1开始的,这样的话访问地址就得用   变量名+[偏移量-1]来访问。或者首地址不存储值,只被变量名所指向,但这样就浪费了一个地址空间。

    所以C++/JAVA中 规定数组下标从0开始就是这样的原因,方便寻址,访问便捷。

    展开全文
  • 复习内容: 数组的声明和初始化、数组的长度、数组访问、java.lang.ArrayIndexOutOfBoundsException数组下标越界异常、二维数组、java.lang.NullPointerException空指针异常 如有错误,欢迎在评论区指出,非常感谢! ...

    Java数组

    2021/4/5 周一
    复习内容: 数组的声明和初始化、数组的长度、数组访问、java.lang.ArrayIndexOutOfBoundsException数组下标越界异常、二维数组、java.lang.NullPointerException空指针异常

    如有错误,欢迎在评论区指出,非常感谢!


    数组是一种类型(与基础数据类型不一样),它能一次性定义多个同类型的变量,存放多个同类型数据。

    一、声明数组

    // 数据类型[] 数组名;
    int[] arr;
    
    // 数据类型 数组名[];
    int arr[];
    

    数据类型就是数组里存储元素的类型,[]代表数组,千万不要写漏。

    以上两种方式都可以用来声明数组,但是一般建议使用第一种。

    此时只是声明了数组,数组变量还没有被初始化。注意,在声明时不要规定数组的长度。

    二、数组初始化

    1. 动态初始化-只确定长度
    // 数据类型 []数组名 = new 数据类型[数组长度];
    int[] arr = new int[20];
    

    或者如果数组brr已经被定义了,直接将等号后面new的数组变量赋值给brr也可以

    int[] brr;
    brr = new int[20]; // 这样也可以
    

    此方式创建数组对象时,只需要指定数组的长度,数组中所有的元素的值默认为"零",具体各数据类型的"零"值为:

    数据类型 “零”
    byte short int long 0
    float double 0.0
    boolean false
    char ’ '(空格)
    引用数据类型 null

    注意此方式创建数组对象必须使用 new 关键字,且 = 前后数据类型一致

    2. 动态初始化-确定长度和内容
    // 数据类型 []数组名 = new 数据类型[]{v1,v2,v3,v4,...};
    int[] arr = new int[]{v1,v2,v3,v4,...};
    

    此方式创建数组时,数组中的元素值也依次为{ }里所给定的元素。

    注意,[ ]内必须为空,不能在[ ]内指定数组长度,而是由{ }里元素的个数来决定数组的长度

    此方式也可以定义和赋值分开:

    int[] brr;
    brr = new int[]{v1,v2,v3,v4,...}; // 这样也是可以的
    
    2. 静态初始化
    // 数据类型 []数组名 = {v1,v2,v3...};
    int[] arr = {v1,v2,v3...};
    

    数组的静态初始化也是确定长度和内容的。

    注意,此方式不能先定义后赋值。即如果先声明数组,再用此种方式赋值是不可以的:

    int[] brr;
    brr = {v1,v2,v3...}; // 编译错误!!!
    

    三、数组的属性

    数组有一个长度属性,获得数组长度的方式为:数组名.length

    int len = arr.length; // 获得数组arr的长度
    

    在Java中允许数组的长度为0,即包含0个元素,这样的数组对象仍是一个Java对象,而且不同于null。虽然没有意义,但在语法上是合法的:

    int[] arr = new int[0];
    System.out.println(a.length);    // 输出结果为0
    

    四、访问数组元素

    访问数组元素的方式为:数组名[下标]

    arr[0]; // 访问数组a的第1个元素
    

    下标的取值范围 [0,数组长度),下标为0表示数组的第1个元素,下标的最大值为 数组长度-1

    不能超过下标范围进行元素访问,否则将引发数组中最常见的:
    java.lang.ArrayIndexOutOfBoundsException 数组下标越界异常

    比如

    int []arr ={1,2,3,4};
    

    这个数组的长度为4,如果调用arr[4],运行时就会报数组越界异常:

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    	at review.ErrorTest.main(ErrorTest.java:21)
    

    异常提示了发生错误的时候,下标的值为4

    因为下标为0表示数组的第1个元素,即这个数组的元素只有arr[0]=1, arr[1]=2, arr[2]=3, arr[3]=4,没有arr[4]

    五、二维数组

    如果数组中的元素也是数组,这样就可以组成多维数组,比如二维数组、甚至更多层次的三维数组等等(当然一般超过三维也没什么实际用处了,所以主要掌握二维数组就好了)。

    1.数组声明

    与一维数组声明类似,多一个[ ]

    // 数据类型 [][]数组名;
    int[][] arr ;
    
    2.数组初始化

    (1) 初始化一维数组(指定一维数组长度)

    数据类型 [][]数组名  = new 数据类型[二维数组长度][一维数组长度];
    int[][] arr = new int[3][4];
    

    arr这个二维数组里有3个元素,都是长度为4、数据类型为int的一维数组,此时可以取某个数组里的元素的值,不过因为没给出具体值,所以默认为0。

    可以再给一维数组里的元素赋值,如:

    arr[0][0] = 11; // 第一个数组里的第一个值
    arr[1][0] = 21; // 第二个数组里的第一个值
    arr[2][0] = 31; // 第三个数组里的第一个值
    

    另外要知道,二维数组真正存储的其实是一维数组的地址信息

    (2) 不初始化一维数组(不指定一维数组长度)

    数据类型 [][]数组名  = new 数据类型[二维数组长度][];
    int [][] arr = new int[3][];
    

    此时只说明了arr这个二维数组里有3个元素,都是数组,但这些一维数组并没有初始化过,即arr这个二维数组中的arr[0]、arr[1]、arr[2]这3个数组都是null。

    所以此时不可以取一维数组里具体元素的值,否则运行会报错
    java.lang.NullPointerException 空指针异常

    int [][] arr = new int[3][]; // 一维数组没有初始化
    System.out.println(arr[0][1]);
    
    -----------------控制台输出--------------------
    Exception in thread "main" java.lang.NullPointerException // 空指针异常
    	at review.ErrorTest.main(ErrorTest.java:21)
    

    由于一维数组arr[0]的变量没有指向任何数组对象,这个时候对该数组名进行 . 和 [ ] 的访问就会报空指针异常错误。

    需要继续将一维数组初始化后才能进行取值,而且由于一维数组分别进行初始化,所以他们的长度可以不一样

    数组名[下标] = new 数据类型[数据长度];
    arr[0] = new int[4];
    arr[1] = new int[3];
    arr[2] = new int[2];
    System.out.println(arr[0][1]);
    

    当然此时控制台还是输出0,因为数组里的元素还没有赋值,默认为0

    (3)静态初始化

    // 数据类型 [][]数组名 = new 数据类型[][]{{v1,v2,...},{v3,v4,..},{v5,...}...};
    int [][] arr = new int[][]{{v1,v2,...},{v3,v4,..},{v5,...}...};
    

    与一维数组的静态初始化类似,直接给出了二维数组中的所有一维数组的所有内容

    展开全文
  • 数组下标为什么是从0开始?

    千次阅读 2017-08-30 10:49:08
    大家是否会觉得数组下标从0开始很烦,下标0开始就代表第一个,下标1就是第二个,是不是觉得特别别扭?那为什么会从0开始计呢? int[] a=new int[]{1,2,3,4,5};   这里有5个值,首先我们假设数组在内存中开辟的5...

    //盗墓者是个丑奴儿,原

    大家是否会觉得数组下标从0开始很烦,下标0开始就代表第一个,下标1就是第二个,是不是觉得特别别扭?那为什么会从0开始计呢?

    int[] a=new int[]{1,2,3,4,5};

     

    这里有5个值,首先我们假设数组在内存中开辟的5个地址号为1000,1001,1002,1003,1004,假设是为了方便计算。

    此刻我们访问a[0],也就是访问到地址号1000,

     

    想想看,1000就是数组的第一个地址,也就是代表着数组的第一个值1,1000+0等于1000,如果按照逻辑下标也从1开始不就是1000+1=1001访问到第二个地址2咯?

     

    这个就是数组从0开始的原因,因为a引用的就是数组中的第一个地址号了,从0开始是访问的1个地址。

     

    展开全文
  • 数组下标为什么从零开始

    千次阅读 2019-04-03 11:34:24
    在我们日常的学习过程中,我们了解到在C++/JAVA/python中,数组下标是从0开始的。对于新手来说,遍历的数组的时候还真是容易出错。但是为什么要这样规定,这样规定有什么好处? 其实根据我们前辈的思想,这样规定的...

    在我们日常的学习过程中,我们了解到在C++/JAVA/python中,数组下标是从0开始的。对于新手来说,遍历的数组的时候还真是容易出错。但是为什么要这样规定,这样规定有什么好处?

    其实根据我们前辈的思想,这样规定的主要好处是方便“寻址”。这就要涉及到底层硬件的知识,我们知道程序运行时,变量的值,运算的结果值等都是暂时放在内存中。举个例子:int a = new int [5] 这是JAVA中常用的创建数组的程序语句。

    当这句话执行完毕后,机器都做了什么?

    首先在内存就开辟了一块地址空间(内存中地址空间都是连续的,地址中的内容就是你存储在其中的值),然后变量a就指向了这片地址空间的“首”地址,如果想要访问这片地址的其他地址,那么就得用偏移量来计算,如下图:
    在这里插入图片描述

    变量a已经指向首地址,a[0] = a + 0 ,0代表的就是偏移量,a偏移0个单位,就是其本身,所以a[0]代表的就是第一个地址。 a[1] = a + 1; a偏移一个单位,那么就可以访问到a[1],也就是第二个地址。所以只需要 变量名+[偏移量] ,(如 a[0]) 就可以访问到相应的内存地址。这是下标从0开始的情况。

    还有一些语言,如pascal , delphin 等下标都是从1开始的,这样的话访问地址就得用 变量名+[偏移量-1]来访问。或者首地址不存储值,只被变量名所指向,但这样就浪费了一个地址空间。

    所以C++/JAVA中 规定数组下标从0开始就是这样的原因,方便寻址,访问便捷。

    展开全文
  • 首C语言设计者从数组存储的内存模型来看,“下标”更确切的定义应该是“偏移 offset”,a[0]就是偏移为0的位置,自从他们开始使用0下标后,后面的Java等语言也效仿C语言,但也有一些语言的数组不是从0开始计数的,...
  • Java——数组

    2021-01-24 10:00:45
    Java数组1. 数组概述2. 一维数组(1). 创建一维数组(2). 初始化一维数组(3). 使用一维数组3. 二维数组(1). 创建二维数组(2). 初始化二维数组(3). 使用二维数组4. 对数组的基本操作(1). 遍历数组(2). 对数组进行排序...
  • java数组

    2021-04-16 19:56:35
    一、一维数组 1、Java语言当中的数组是一种引用数据类型,数组的父类型是Object 2、数组实际上是一个容器,可以同时容纳多...6、java规定数组一旦创建,其长度不可变(数组长度不可变) 7、数组的分类:一维数组
  • Java数组与伪数组

    千次阅读 2017-02-22 18:56:27
    在看书时,看到一句话:Java实现了真数组,避免了覆盖数据的可能。竟然数组都有假的,遂找点资料学习一下。 提供一篇博客解释js中的伪数组 js的伪数组 我的理解: ADT(abstract data type)数据抽象类型:一个...
  • Java数组

    2020-12-18 14:02:39
    数组名 元素 角标、下标、索引 数组的长度:元素的个数 3. 数组的特点: 1.数组是序排列的; 2.数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也 可以是引用数据类型; 3.创建数组对象会在内存中...
  • JAVA数组

    2020-06-07 10:14:52
    数组名 元素 角标、下标、索引 数组的长度:元素的个数 3、数组的特点: 数组是序排列的 数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型 创建数组对象会在内存中开辟一整...
  • Java中的数组 Java中的数组与其他语言类似都是一种基本类型或对象的集合,用来快速声明变量或作为存储结构 数组是什么: 所谓数组,是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。...
  • java_数组

    2019-02-25 20:46:49
    所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的分量,也...
  • Java数组的详解

    2021-05-13 22:17:48
    2.3.角标,下标,索引 2.4.数组的长度,元素的个数 数组的特点: 3.1.数组是有序排列的 3.2.数组属于引用数据类型的变量,数组的元素即可以是基本数据类型的变量,也可以是引用数据类型的变量。 3.3.创建数组对象...
  • C语言数组下标为何从0开始

    千次阅读 2007-11-07 14:06:00
    数组下标从0而不是从1开始也是根据编译器设计者的思路而来的,因为偏移量的概念在他们心中已是根深蒂固.但这种设计让非编译器设计者感觉很别扭,他们可能会在一个定义的a[10]的a[10]存储数据,导致有名的一位偏移...
  • java多维数组详解

    2020-11-12 18:52:41
    java中其实没有多维数组的概念,只不过是依据数组的概念以及特点技术上的延伸 本质上就是存储数组数组 多维的数组的使用 ①声明 // ### ①声明 // 1)数据类型 [][] 数组名; // 创建一个存储整数类型数组 ...
  • Java.数组

    2020-02-28 21:24:45
    生活中都是数组 超市 物品是分门别类同样的物品会存放于同一个货架之上 图书馆 <<世界因你而不同>> 10本 存在于图书馆中 在同一个书架上 是连续存储的 每一本书都是有独立的编号,整个编号是有规律可循...
  • 数组数组的基本用法1、什么是数组2、数组的定义2.1创建数组:2.2类型所对应的“0”值3、数组的使用3.1获取长度,访问元素3.2 下标越界问题3.3 遍历数组for循环遍历for-each遍历数组两种遍历的比较4、二维数组不规则...
  • 今天跟大家聊聊一个有意思的话题,C中的数组下标为啥是从0开始?或者说为什么现在大部分的编程语言都会选择从0开始索引!本文将从三个方面展开这个话题。 2、话题引出 凯爷,你见过数组下标从1开始的编程语言吗? 额~...
  • JAVA:数组

    2015-04-11 21:40:54
    数组(基础)  什么是数组 首先明确,数组是一个很重要的内容,非常重要。 前面介绍的if结构、循环,解决的都是算法问题。那什么是算法?所谓算法就是流程,像取钱怎么取?插卡,输入密码,输入要取钱的金额,确定...
  • Java 数组

    2019-11-13 21:15:42
    数组 数组,是由数目固定的、相同类型的元素组成的有序集合,每个元素相当...数组下标的个数就是数组的维数: 有一个下标就是一维数组,有两个下标就是二维数组,依次类推。 使用数组四步 1、声明数组 int[ ] a...
  • java-数组

    2018-07-29 14:12:10
    数组: 1.概念:一组相同类型的数据的组合,也是引用数据类型 2.名称:数组名称不是固定的,与存放的数据的类型有关 -如 数组名称 int[] 3.元素:数组中的每个数据都是这个数组的元素 4.数组的声明与初始化 声明:...
  • JAVA基础数组

    2018-01-23 18:52:00
    数组数组是一种容器 存储同一类型的一组数据(必须是 类型相同的一组数据) 定义数组的公式:(有两种) 1、静态定义 1)数据类型[ ] 数组名 = {元素1,元素2,元素3,元素4,元素5} 2) 数据类型[ ] ...
  • Java数组要求所有数组元素具有相同的类型。在一个数组中,数组元素类型是唯一的,只能储存同一种数据类型,不能出现多种数据类型。 定义数组 定义数组的方式有两种: type[] arrayName type arrayName[] 推荐...
  • 关于Java数组的介绍

    2020-05-08 15:13:47
    元素下标:从0开始 元素类型 数组的的所有元素必须属于相同的数据类型。 如何使用数组 使用数组四步走 声明变量 int [ ] a; 分配空间 a = new int[5]; 赋值 a[0] = 8; 处理数据 a[0] = a[...
  • 关于数组Array(学习笔记) ...如果存储的是Java对象的话,实际存储是对象的引用(内存地址),数组中不能直接存储Java对象。 数组在内存方面存储的时候,数组的内存地址是连续的(存储的每个数...
  • java 数组

    2021-01-19 14:20:07
    数组下标从0开始 声明创建 int[] nums = new int[10];//声明并创建数组 //静态初始化 int[] a = {1,2,3,4}; //动态初始化 int[] b = new int[4]; 数组的长度:nums.length 数组的四个基本特点 长度是确定的,一旦...
  • Java则没有像C++那样的“集合”概念,因为Java中的所有东西都是对象。但它确实有自己的数组,通过数组初始化来提供支持。 数组代表一系列对象或者基本数据类型,定义数组,有两种方式 int[] a1; int a1[]; 后一种...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,642
精华内容 7,856
关键字:

java规定数组的下标

java 订阅