数组与内存分配

结构体和结构体数组在栈区和堆区分配内存 目录一、结构体1.结构体在栈区分配内存2.结构体在堆区分配内存二、结构体数组1.结构体数组在栈区分配内存2.结构体数组在堆区分配内存(2种方法)总结 一、结构体 1.结构体在栈区分配内存 程序目的:定义一个结构体变量,包含姓名和年龄。 实现方式:(1)在栈区开辟空间,定义结构体;(2)将数据赋值给结构体;(3)打印输出结构体内容 代码如下: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #i 阅读详情

1. 数组

数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。

1.1 数组定义格式

数据类型[] 数组名
int[] arr;
double[] arr;
char[] arr;

数据类型 数组名[]
int arr[];
double arr[];
char arr[];

1.2 数组初始化

数组动态初始化

动态初始化:创建数组的时候,指定数组的长度,由虚拟机为数组的元素设置默认值

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

等号左边:
int:数组的数据类型
[]:代表这是一个数组
arr:代表数组的名称
    
等号右边:
new:为数组开辟内存空间
int:数组的数据类型
[]:代表这是一个数组
3:代表数组的长度

数组静态初始化

静态初始化:创建数组的时候,直接指定了数组中的元素数据,长度由虚拟机来自动计算

完整版格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
int[] arr = new int[]{1,2,3};

简化版格式
数据类型[] 数组名 = {元素1,元素2,...};
int[] arr = {1, 2, 3};

1.3 数组元素访问

索引

每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。
这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。

访问数组元素格式

数组名[索引];

int[] arr = new int[3];
//输出数组名
System.out.println(arr); //[I@880ec60
//输出数组中的元素
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);

1.4 内存分配

内存概述

内存是计算机中的重要原件,临时存储区域,作用是运行程序。
我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。
必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

Java虚拟机默认占用本地内存,最小为本地内存的1/64,最大为1/4

java中的内存分配

目前我们只需要记住两个内存,分别是:栈内存和堆内存

区域名称作用
寄存器给CPU使用,和我们开发无关。
本地方法栈JVM在使用操作系统功能的时候使用,和我们开发无关。
方法区存储可以运行的class文件。
堆内存存储对象或者数组,new来创建的,都存储在堆内存。
方法栈方法运行时使用的内存,比如main方法运行,进入方法栈中执行。

基本数据类型存在栈中,引用数据类型(new 出来的)存在堆中

变量存放在栈内存,对象存放在堆内存

如果是基本数据类型直接存放在栈内的变量里,如果是引用数据类型就把堆内存中地址值存到栈内的变量里

int[] arr = new int[5];
    变量        对象

2. 数组遍历

就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。

int[] arr = { 1, 2, 3, 4, 5 };
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);

以上代码是可以将数组中每个元素全部遍历出来,但是如果数组元素非常多,这种写法肯定不行,因此我们
需要改造成循环的写法。数组的索引是 0 到 lenght-1 ,可以作为循环的条件出现。
//定义数组
int[] arr = {11, 22, 33, 44, 55};
//使用通用的遍历格式
for(int x=0; x<arr.length; x++) {
System.out.println(arr[x]);
}

3. 数组操作的两个常见小问题

3.1索引越界异常

出现原因:
数组长度为3,索引范围是0~2,但是我们却访问了一个3的索引。
程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。

解决方案:
将错误的索引修改为正确的索引范围即可!

int[] arr = new int[3];
System.out.println(arr[3]);

3.2 空指针异常

出现原因:
arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出 NullPointerException 空指针异常。在开发中,数组的空指针异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。

解决方案:
给数组一个真正的堆内存空间引用即可!

int[] arr = new int[3];
//把null赋值给数组
arr = null;
System.out.println(arr[0]);

4. 数组类型

基本数据类型都可以成为数组,直接打印数组名出现的是地址值,而char数组出现的是数组内容,要想出现地址值需要打印数组名.toString()

数组动态初始化 String默认值为null,char默认值为空,boolean默认为false,其他为0
String arr[] = new String[3];
arr[0] = "c";
arr[1] = "b";
System.out.println(arr);
System.out.println(arr[2]);//null
动态数组与普通数组在内存分配上的区别 // // main.cpp // test // // Created by Cong on 13-3-24. // Copyright (c) 2013年 liuchyin. All rights reserved. // #include #include using namespace std; int main(){ //int **matrix = new 阅读详情

相关推荐

深入理解C语言数组与内存分配

C语言在定义数组时是否允许使用变量指定数组长度,如果您的答案否,那我建议您仔细阅读以下这篇文章:)

weixin_44793395的博客 7123

数组内存分配

使用C语言编程,实际上使用的内存只有一种——虚拟内存。根据功能的不同在C语言中又将虚拟内存为分三类:栈区、堆区、静态数据区,无论单一变量还是数组,其内存分配都是如此。其中,栈区、静态数据区、堆区都会有编译器负责分配、操作系统负责管理,程序员可以在堆区使用malloc()来动态分配堆内存。 1、栈区:一般每一个函数对应一个栈区,在编译原理中称为栈帧。比如下面的代码: int main() { //定义一个有20个int元素的数组。此时数组a分配的虚拟内存称为栈区,有编译器自行分配。 int a[20] =

weixin_44679229的博客 3142

指针与数组的内存分配

博客搬家:https://blog.youkuaiyun.com/zheyufuck/article/details/53079058 在实践中经常遇到这样的情况:①二维数组、②指向指针的指针、③指针数组、④数组指针 的使用,经常容易混淆,这里从内存分配的情况进行对比 ①二维数组 char a[2][3]; 二维数组的内存分配情况 ②指向指针的指针 char **p1; 指针的指针在内存分配时...

flying white bugs 3926

数组在内存中如何分配?最详细解答!看这个就够了!

在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静态的,所以想要使用就必须先初始化(为数组对象的元素分配空间)。 对于Java数组的初始化,有以下两种方式: 1.静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度 ,如:int[] a = {2,4,65}; 。 2.动态初始化:初始化时由程序员显示的指定数组的长度,由系统为数据每个元素分配初始值 ,如: int[] a1 = new int[2];//动态初始化数组,先分配空间。 总结:

zovee的博客 3122

Verilog实现8位到64位数据位宽的转换

在FPGA设计中,数据位宽决定了所需资源的数量以及系统的性能。总之,数据位宽转换是FPGA设计中常见的需求之一。本文提供了一个简单的实现方法,读者可以根据自己的需求进行调整和优化。在很多场景下,需要对不同长度的数据进行转换处理。需要注意的是,这个实现方法并不是唯一的,还可以根据具体需求进行调整优化。例如,可以使用循环语句来实现数据位宽的转换,或者依靠FPGA硬件资源实现高效的数据位宽转换。本例中,输入数据位宽为8位,输出数据位宽为64位。运算符将输入数据的低8位放入高56位的0中,从而得到输出数据。

m0_47037246的博客 960

动态数组(内存分配)

写代码:描述 事 物事 函数 代码语句 算法物 数据 数据结构。

Jcrry的博客 358

C++ Gotchas 条款60:没能区分单体内存分配与数组内存分配

Gotcha #60: Failure to Distinguish Scalar and Array AllocationGotcha条款60:没能区分单体内存分配与数组内存分配 单一个Widget与一个Widget数组是等同的吗?当然不是。那为何这么多C++程序员在发现“数组(arrays)与单个量(scalars)采用不同的运算符进行空间的分配和释放”时会感到吃惊? 我们

方舟 K ][ N G of A R K 1743

Java数组的使用与内存分配详解

本章深入介绍了Java数组的基础概念、类型、内存分配以及如何在程序中使用数组。详细解释了数组的连续内存分配特性、同质数据类型元素以及如何声明和操作单维或多维数组。此外,本章还探讨了Java数组类型的继承层次结构、特殊属性以及如何通过数组索引访问元素和操作数组。

weixin_35757531的博客 356

变长数组与普通数组在内存分配上有什么不同?

这样一个普通数组时,编译器就会根据数组类型( int 类型占一定字节数)以及指定的数组大小(这里是5个元素),在程序的静态存储区(如果是全局数组)或者栈上(如果是局部数组)提前预留好相应固定大小的内存空间,后续这个数组大小就不能改变了。- 变长数组:虽然名字叫变长数组,但实际上它在运行时确定好长度后,也很难再去动态改变其大小重新调整内存空间(不像动态数组那样方便改变大小),不过它相比普通数组好在可以根据运行时的实际情况来首次确定合适的内存大小,而不是像普通数组那样在编译时就固定好了。

2301_81152393的博客 310

ARM 汇编指令:LSL(逻辑左移) 和 LSR(逻辑右移)

ARM 汇编中的 LSL(逻辑左移)和 LSR(逻辑右移)是基础移位指令,分别实现二进制位的左移和右移操作。LSL 低位补0,等效于乘以2^n;LSR 高位补0,等效于无符号除以2^n。这两个指令可以单独使用或与其他指令结合(如ADD、MOV等),利用ARM的"桶形移位器"硬件实现高效运算。关键特性包括:移位范围0-31(LSL)或1-32(LSR),可选更新标志位,以及与其他指令结合时的无额外开销优势。LSR与ASR(算术右移)的主要区别在于高位填充方式,分别适用于无符号和有符号数处理

guigenyi的专栏 1814

为什么你的SiC MOSFET仿真不准?可能是离子注入的‘沟道效应’在捣鬼(Silvaco BCA模块详解)

本文深入分析了SiC MOSFET仿真中离子注入沟道效应的关键影响,揭示了Silvaco BCA模块在模拟SiC晶向和角度参数时的核心设置要点。通过详细解析晶圆偏切与注入角度的等效关系,提供优化MOSFET沟道区注入仿真的五步实战方法,帮助工程师将阈值电压仿真误差从26%降低到5%以内。

weixin_26789847的博客 410

Java中数组的存储与内存分配

Java数组及其内存分配 [日期:2013-03-28] 来源:Linux社区  作者:xiaoxuetu [字体:大 中 小] 几乎所有的程序设计语言都支持数组。Java也不例外。当我们需要多个类型相同的变量的时候,就考虑定义一个数组。在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静态的,

Java我人生的技术博客 6172

UNITY2022 Cardboard环境搭建

必须安装 Git,并且 git 可执行文件必须位于 PATH 环境变量中。考文档:https://developers.google.cn/cardboard/develop/unity/quickstart?转到 Assets/Samples/Google Cardboard//Hello Cardboard/Scenes/HelloCardboard 场景中。粘贴https://github.com/googlevr/cardboard-xr-plugin.git到文本输入字段中。

weixin_39510925的博客 1211

java数组的初始化与内存分配

java数组与java实例一样是引用数据类型。所谓引用数据类型,相似于c中的指针,就是给变量赋值的时候不是直接获得数据的值而是一种引用(即数据的地址)。例如   int[] t1=new int[]{1,2};   int[] t2=t1; 当有表达式t2[0]=000; t2[1]=1111; 时会有t1[0]=000; t1[1]=1111;。由此可见t1,t2同时指向了内存中的一块

i_yjn的博客 4014

2024年淘宝平板电脑销售数据分析

本项目的目标是从淘宝电商平台上自动化爬取商品信息,并通过数据分析帮助了解价格、销量等相关指标,为商业决策提供支持。使用Selenium实现数据爬取,结合Python的数据处理与可视化工具,进一步分析和展示结果。

2301_76728517的博客 1474

RK3588开发板RKNPU2环境部署实战:更新rknn_server与librknnrt.so详解

本文详细介绍了在RK3588开发板上更新rknn_server与librknnrt.so核心组件的完整实战流程。通过adb工具推送文件、设置权限并执行同步操作,确保RKNPU2环境部署成功,从而解决推理速度慢或初始化失败等问题,提升AI模型运行效率与稳定性。

weixin_29194817的博客 344

Java---数组与数组的内存分配

1.辨析数组变量和数组对象 代码实例: int[] a; //#1 a = new int[2]; //#2 上面一小段代码展示了什么是数组变量,什么是数组对象。在#1中声明了一个数组类型的变量a,这个时候a并未指向任何一段内存,编译器也为替a分配内存,这个a是未初始化的,在这里a就是一个数组变量。 数组变量是数组变量是一种引用类型的变量,数组变量并不是数组本身,它只是指向...

Milkha的博客 540

R语言机器学习:XGBoost线性回归模型的SHAP值

SHAP(SHapley Additive exPlanations)值是一种基于博弈论Shapley值的机器学习模型解释方法,能够解释任何模型的预测结果。其主要用途包括:1)提高模型的可解释性,帮助非技术用户理解模型预测;2)识别对模型预测最重要的特征,辅助特征选择;3)调试模型,发现预测中的异常;4)评估模型公平性,避免偏见。SHAP值的计算方法包括初始化、迭代计算、归一化和解释,常用工具如Python的shap库支持多种计算方式(如TreeSHAP、KernelSHAP等)。本文还提供了基于R语言计算

专注生信领域 3441

1.8.一维数组与内存分配

数组与内存分配:

ADCvbV的博客 144

RTK_ROS_导航(4):接入move_base

现在我们要将之前的数据接入到Move_base中,使得机器人能够根据Map上的终点进行导航,并且实现避障效果如下图。

旋风小短腿 1947

基于Simulink的雷达跟踪系统仿真(附源码)

此示例包含对雷达系统的基本特征进行建模的子系统。该模型是用于目标位置和速度检测的雷达系统的典型模型。该示例包括雷达脉冲发生器、射频发射器子系统、移动目标的 Simulink 表示、射频接收器和接收模块(Rx 模块)。

珞瑜的博客 3515

数组变量与指针变量内存分配区别

上面代码输出为两个字符串的首地址值,也就是数组变量名的值,数组变量名的值等于字符串的首地址值。输出结果两者地址值相差4,这是因为局部变量存放在栈空间里的地址是连续的,且指针变量的大小占4个字节。输出结果两个值是一样的,这就是两种定义的区别,数组定义是直接给数组分配一个内存空间,而指针定义则是将指针变量指向某一块地址。

m0_62672176的博客 248

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java学习之二维数组定义与内存分配详解

转载自:http://www.cnblogs.com/nonghu/p/6328530.html 二维数组:就是元素为一维数组的一个数组。 格式1: 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组。 n:表示每一个一维数组的元素有多少个。 注意: A:以下格式也可以表示二维数组 a:数据类型 数组名[][] =

isabellebaby007的博客 1078

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数组的介绍与内存分配

数组 什么是数组: 数组是一个存储数据的容器,可以存储多个相同数据类型的数据。 什么时候需要用到数组: 当我们需要存储一组相同数据类型的数据时,可以考虑使用数组。 语法格式: (动态数组)数据类型[] 数组名 = new int[数组长度]; (静态数组)数据类型[] 数组名 = {数据,数据,……}; 声明格式: 1.数据类型[] 数组名;2.数据类型 数组名[]; 数组被创建出来后,Java 虚拟机会为数组中每一个元素设置一个初始值,初始值是什么取决于数组的类型。 整数类型:0 浮.

J3021009087的博客 268
上一篇: 运算符与操作
下一篇: 流程控制,顺序,分支,循环
Ly-on
博客等级 码龄6年 3粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值