11.数组的分类和定义

1.数组的概念

数组是若干个相同类型变量在内存中有序存储的集合。

int a[10];//定义了一个整型的数组a,a是数组的名字,数组中有10个元素,每个元素的类型都是int类型,而且在内存中连续存储。
这十个元素分别是a[0] , a[1] , … , a[9]
a[0] ~ a[9] 在内存中连续的顺序存储

2.数组的分类

按元素的类型分类
2.1 字符数组

即若干个字符变量的集合,数组中的每个元素都是字符型的变量
char s[10]; // s[0] , s[1] , … , s[9];

2.2 短整型数组

short int a[10];

2.3 整型数组

int a[10];

2.4 长整型数组

long int a[5];

2.5 浮点型的数组(单,双)

float a[6]; // a[4] = 3.14f;
double a[8]; // a[7] = 3.1415926;

2.6 指针数组

char *a[10];
int *a[10];

2.7 结构体数组

struct stu boy[10];

按维数分类

一维数组
int a[30];

二维数组
int a[2][30];

多维数组
int a[4][2][10];
三维数组是由多个相同的二维数组构成的

3.数组的定义

定义一个数组,在内存里分配空间

3.1 一位数组的定义

格式:

数据类型 数组名 [数组元素个数];
int a [10];
char b [5]; // 定义了5个char类型变量的数组b

在数组定义的时候可以不给出数组元素的个数,根据初始化的个数来定数组的大小。

#include<stdio.h>
int main()
{
	int a[5];
	int b[] = { 1,6,9,3 };
	printf("sizeof(a)=%d\n", sizeof(a));
	printf("sizeof(b)=%d\n", sizeof(b));
	return 0;
}

在这里插入图片描述

3.2 二维数组的定义

格式:

数据类型 数组名 [行的个数][列的个数];
int a [4][5];
定义了20个int类型的变量,分别是:
a[0][0] , a[0][1] , a[0][2] , a[0][3] , a[0][4];
a[1][0] , a[1][1] , a[1][2] , a[1][3] , a[1][4];
a[2][0] , a[2][1] , a[2][2] , a[2][3] , a[2][4];
a[3][0] , a[3][1] , a[3][2] , a[3][3] , a[3][4];

二维数组在定义的时候,可以不给出行数,但必须给出列数,二维数组的大小根据初始化的行数来定。

#include<stdio.h>
int main()
{
	int a[3][4];
	int b[][3] = {
		{1,2,3},
		{4,5,6},
		{7,8,9},
		{10,11,12},
		{13,14,15}
	};
	printf("sizeof(a)=%d\nsizeof(b)=%d\n", sizeof(a),sizeof(b));
	return 0;
}

在这里插入图片描述

<think> 首先,用户的问题是关于鸿蒙系统中数组的使用特性。用户提到了“鸿蒙系统中数组相关的内容,如用法、特性等”,所以我需要基于提供的引用来回答。 回顾引用内容: - 引用[1]:讨论了鸿蒙开发中的集合与数组容器,包括线性容器、非线性容器原生数组API的使用方法。它提到了容器类概述与分类。 - 引用[2]:展示了在仓颉语言中使用数组的reduce方法来计算与积,体现了函数式编程风格。 - 引用[3]:给出了一个使用filterincludes方法来处理数组去重的例子,涉及数组操作。 - 引用[4]:讨论了在鸿蒙多线程环境中使用SharedArrayBuffer的问题,强调共享内存原子操作的重要性。 用户的上一次问题是:“我想了解鸿蒙系统中数组相关的内容,如用法、特性等”,所以这是一个新的问答序列的开始。系统指令要求我生成相关问题,所以我需要在回答结束时添加相关问题。 系统指令要求: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 在这个回答中,可能没有数学表达式,但如果涉及,我需要正确格式化。用户的问题是编程相关的,所以可能没有数学,但如果有计算或公式,我需要处理。 结构回答: 1. **引言**:简要介绍鸿蒙系统中的数组用途。 2. **用法**:基于引用,解释数组的使用方法。 - 从引用[1]:原生数组API的使用。 - 从引用[2]:函数式编程风格的数组操作,如reduce。 - 从引用[3]:数组过滤唯一性检查。 - 从引用[4]:多线程下的SharedArrayBuffer使用。 3. **特性**:讨论数组的特性,如类型安全、性能、多线程支持等。 4. **实战示例**:如果需要,给出简化代码示例,但要基于引用。 5. **相关问题**:在结束时生成相关问题。 引用处理:在回答中,当引用某个部分时,在末尾添加[^n]。例如,提到容器类概述时,添加[^1]。 回答结构: - 清晰、逻辑性强。 - 使用中文。 生成相关问题:在结束时,添加§§相关问题§§部分,列出相关问题。 基于引用,总结数组在鸿蒙中的内容: - 鸿蒙支持原生数组更高级的集合容器(引用[1])。 - 在仓颉语言中,数组用于函数式操作(引用[2])。 - 数组操作如filter、includes用于数据处理(引用[3])。 - 多线程环境下,SharedArrayBuffer需要注意原子操作(引用[4])。 所以,回答应覆盖: - 原生数组的基本用法。 - 集合容器与数组的区别。 - 常用数组方法(如map,filter,reduce)。 - 多线程注意事项。 - 实战例子。 确保回答真实可靠:基于提供的引用,不要发明新东西。 最终回答大纲: 1. 介绍鸿蒙系统中数组的重要性。 2. 用法:原生数组API、集合容器、数组方法。 3. 特性:高效性、类型安全、多线程支持。 4. 示例:简要展示代码,从引用中提取。 5. 结尾:总结。 6. 相关问题。 生成相关问题示例: - 鸿蒙中数组与集合的区别是什么? - 如何在鸿蒙中处理数组的去重? - 多线程下数组操作需要注意什么? - 仓颉语言数组的函数式操作有哪些优势? 现在,撰写回答。 </think> ### 鸿蒙系统中数组的使用与特性 在鸿蒙(HarmonyOS)应用开发中,数组是一种核心的数据结构,广泛用于存储管理有序数据集合。数组以其高效的内存访问操作性能,成为处理实时数据、算法实现高性能计算的基石。鸿蒙系统提供了原生数组支持以及更高级的集合容器(如List、Map),这些工具在仓颉语言(HarmonyOS Next中的编程语言)中得到了深度优化。下面我将从用法、特性两方面进行详细解析,内容基于站内引用的相关知识。 #### 一、数组的用法 鸿蒙系统中的数组用法灵活多样,开发者可以通过原生数组API或结合集合框架进行操作。以下是关键用法示例: 1. **原生数组的基本操作**: 鸿蒙支持标准的原生数组,开发者可以定义、初始化访问数组元素。引用[1]强调了容器类(包括数组)在数据存储中的核心作用,尤其在处理线性数据结构时。例如,在仓颉语言中,数组可以通过类型注解定义: ```typescript // 定义一个数字数组 let numbers: number[] = [1, 2, 3, 4, 5]; // 访问元素 console.log(numbers[0]); // 输出: 1 ``` 原生数组适用于简单数据存储,但鸿蒙推荐结合集合容器(如`ArrayContainer`)来实现更复杂的功能,如动态扩容[^1]。 2. **函数式数组操作**: 在仓颉语言中,数组支持高阶函数(如`map`、`filter`、`reduce`),实现简洁的函数式编程风格。引用[2]提供了一个计算数组与积的示例: ```typescript // 计算数组元素之 function add(a: number, b: number): number { return a + b; } let sum = numbers.reduce(add, 0); // 结果为: 15 // 计算数组元素之积 function multiply(a: number, b: number): number { return a * b; } let product = numbers.reduce(multiply, 1); // 结果为: 120 ``` 这种方法提升了代码可读性可维护性,特别适合分布式场景下的数据处理[^2]。 3. **数组过滤与唯一性处理**: 鸿蒙开发者常用`filter``includes`方法操作数组,例如实现数据去重或差异比较。引用[3]展示了基于属性(如`name`)筛选唯一元素的实战: ```typescript interface Person { name: string; age: number; } let array: Person[] = [{name: '1', age: 30}, /* ...更多元素 */]; let array1: Person[] = [{name: '1', age: 30}, /* ...更多元素 */]; // 获取不同部分元素 let allNames = array.map(person => person.name); let allNames1 = array1.map(person => person.name); let onlyInArray = array.filter(person => !allNames1.includes(person.name)); console.log("只在array中的元素:", onlyInArray); // 输出差异结果 ``` 此方法依赖于数组的迭代比较操作,确保数据处理的精确性,常用于UI数据绑定或缓存管理[^3]。 4. **多线程环境下的数组操作**: 鸿蒙支持多线程共享内存,使用`SharedArrayBuffer`处理数组时需注意原子性。引用[4]指出,自增操作等非原子步骤会导致竞态条件: ```javascript // 共享内存数组示例 let sharedBuffer = new SharedArrayBuffer(4); // 4字节整数数组 let sharedArray = new Int32Array(sharedBuffer); // 多线程自增操作(非线程安全) function increment() { for (let i = 0; i < 10000; i++) { sharedArray[0]++; // 非原子操作,可能出错 } } // 预期结果20000,但实际结果不稳定 ``` 为解决此问题,鸿蒙推荐使用原子操作如`Atomics.add`,确保线程安全[^4]。 #### 二、数组的特性 鸿蒙系统中的数组具备以下关键特性,这些特性使其在移动端分布式环境中表现优异: - **高效性与性能优化**:数组在鸿蒙中基于原生内存管理实现$O(1)$时间复杂度访问,适合高频数据操作。线性容器(如数组)在引用[1]中被强调为“高效的数据存储工具”,尤其适用于实时计算高吞吐场景[^1]。 - **类型安全与静态检查**:在仓颉语言中,数组支持类型注解(如`number[]`),编译器会进行静态类型检查,避免运行时错误。这提升了代码可靠性,如引用[2]所示范的函数式操作[^2]。 - **多线程与分布式支持**:鸿蒙数组可与`SharedArrayBuffer`结合,支持跨线程数据共享。但引用[4]警告,非原子操作可能导致数据不一致,因此系统提供了原子API(如`Atomics`)来确保并发安全[^4]。 - **与集合容器的互补性**:数组常作为基础结构,与鸿蒙的集合框架(如List、Set)协同工作。非线性容器(如Map)在引用[1]中被分类为扩展功能,而数组则用于轻量级任务[^1]。开发者可根据场景选择:数组用于固定大小数据,集合用于动态结构。 - **函数式编程集成**:数组方法如`reduce``filter`体现了鸿蒙对现代编程范式的支持,引用[2]指出这种风格简化了分布式数据处理,提升了代码可读性[^2]。 #### 总结 鸿蒙系统中的数组是一种多功能、高性能的工具,适用于从简单数据存储到复杂并发操作的场景。通过原生API高阶函数,开发者能高效处理数据,但需注意多线程下的原子性问题。在实际开发中,建议结合鸿蒙的文档工具链(如DevEco Studio)进行优化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oo0day

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值