Java基础教程 - 5 数组

news2024/9/22 11:36:21

更好的阅读体验:点这里 ( www.doubibiji.com
更好的阅读体验:点这里 ( www.doubibiji.com
更好的阅读体验:点这里 ( www.doubibiji.com

5 数组

前面我们保存数据的时候,是将数据保存在变量中,如果要保存2个数据,就声明2个变量。

如果要保存100个数据呢,1000个数据…呢?

所以就需要保存数据的集合来保存批量的数据,下面介绍一下数组。

数组的主要特点:

  • 有序,顺序排列;
  • 只能存储相同类型的元素;
  • 大小在创建的时候就确定了,大小不可变;

5.1 一维数组

1 初始化

同样,数组和变量一样,在使用之前也要进行声明和初始化,数组变量是引用类型的

// 数组声明
// 声明方式1
int[] numbers1;
// 声明方式2
int numbers2[];

// 对上面声明的数组进行初始化
// 初始化方式1:动态初始化
numbers1 = new int[5];										// 表示定义了长度为5的数组,此时数组中的值都为0
// 初始化方式2:静态初始化,直接初始化各个元素的值
numbers2 = new int[]{1, 2, 3, 4, 5, 6};	  // 表示定义了长度为5的数组,内容为1,2,3,4,5
// 初始化方式3:静态初始化,直接初始化各个元素的值
int[] number3 = {1, 2, 3, 4, 5};				  // 初始化列表

// 声明并初始化
String[] names = new String[5];				// 表示定义了长度为5的数组,内容为null
String[] names2 = {"Hello", "Doubi"};

定义数组就是类型加上 [][] 可以在类型后,也可以在变量名后,Java 中推荐放在类型后面。

int[] numbers1 中,[] 表示是数组,int 表示是整形的数组,里面只能放 int 类型的数据。

2 基础操作

获取长度

使用 .length 属性可以获取到数组的长度。

int [] numbers = new int[]{1, 2, 3, 4, 5};
System.out.println("数组长度:" + numbers.length);    // 输出:5

访问元素

访问数组元素是使用下标来访问的,从0开始。

注意不要越界,下标越界会报错。

public static void main(String[] args) {
    int [] numbers = new int[]{1, 2, 3, 4, 5};

    int firstNum = numbers[0];      		// 获取第一个元素
    System.out.println(firstNum);      	// 输出:1

    int lastNum = numbers[numbers.length - 1];     // 获取最后一个元素
    System.out.println(lastNum);      						 // 输出:5

    numbers[0] = 100;        						// 修改第一个元素的值
    System.out.println(numbers[0]); 		// 100
}

因为数组的长度创建后就无法更改了,所以我们无法删除和添加更多到元素到数组中,只能访问和修改数组中的元素。

例如现在创建了一个长度为20的数组,添加学生姓名,现在发现长度不够了,像扩大数组的长度,放更多的元素,这种做法你只能想想。实际上你只能重新创建一个更大的数组,将这个数组的数据复制到更大的数组中。


访问元素的时候一定要注意,不要超越数组的长度,例如:

int [] numbers = new int[]{1, 2, 3, 4, 5};	// 数组的长度为5
int num = numbers[numbers.length];      		// 报错,数组越界

长度为 5 的数组,最后一个元素的下标 index 为 4,所以不能大于4,否则会越界报错。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


3 遍历数组

遍历就是依次访问数组中的元素。

使用 for 循环遍历

int[] numbers = new int[10];

// 遍历数组并进行赋值
for (int i = 0; i < numbers.length; i++) {
    numbers[i] = i;
}

// 遍历进行输出
for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);         // 依次输出0 1 2 3 4 5 6 7 8 9
}

注意编辑结束的条件是: i < numbers.length ,是用 for 循环,可以对数据进行遍历赋值和访问。


使用 for-each 循环遍历

for-each 循环也叫 增强型 for 循环,使用起来更加简洁,但是不能使用 for-each 循环进行赋值。

int[] numbers = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

for (int num : numbers) {				// num 表示每次取出的元素	
    System.out.println(num);    // 依次输出0, 1 2 3 4 5 6 7 8 9
}

for-each 循环,冒号前面是依次取出的数组中的每个元素。

4 数组元素的默认值

动态初始化方式定义的数组,例如 new int[5] ,没有设置数组中元素的值,元素是有默认值的。对于基本数据类型,byte、short、int、long、char 类型的数组,默认值为 0,float、double 类型的数组,默认值为 0.0,boolean 类型数组,默认值为 false。对于引用类型的数组,元素的默认值都是 null

举个栗子:

int [] numbers = new int[3];
System.out.println(Arrays.toString(numbers));       // [0, 0, 0]

boolean [] bools = new boolean[3];
System.out.println(Arrays.toString(bools));         // [false, false, false]

String [] strs = new String[3];
System.out.println(Arrays.toString(strs));          // [null, null, null]

Arrays.toString() 方法可以以字符串的形式打印数组中的内容。

5 内存结构

数组是引用类型的,和普通的数据类型有一些不同。

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

对于上面的代码,在内存中的结构是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

内存中会有不同的存储数据的区域,这里使用的有,栈中存放的是局部变量,也就是方法中定义的变量,现在我们定义的变量都是在方法中的,也就是 main 方法,所以 numbers 变量是存储在栈中的,但是右边的数组值是存储在堆中的,numbers 变量中存储的是一个地址值,是数组的首地址(第一个元素的起始地址,也就是1的起始地址,上面的地址值是胡诌的)。


再看一段代码:

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

上面的代码,重新将一个数组赋值给 numbers,内存结构如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

numbers 被赋值为一个新的数组,那么存储的是新的数组的首地址值,numbers 与新的数组建立关系,与原来的数组断开联系了。

5.2 二维数组

一维数组看上去只是一行或一列数据:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二维数组可以存储类似一个表格的数据:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二维数组其实是:一维数组的每一个元素也是一个数组。

也就是一个一维数组中的每个元素,存储的都是一维数组的地址,地址指向的都是第二层一维数组,如下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1 初始化

// 静态初始化,数组3*4
int[][] numbers1 = new int[][]{{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};

// 静态初始化,数组的长度是3,数组中的各个数组元素的长度是不同的
int[][] numbers2 = new int[][]{{1,2,3,4}, {5,6}, {7,8,9}};

//动态初始化,长度3*2
String[][] strs1 = new String[3][2];

//动态初始化,数组的长度是3,数组中的元素是空的,但是数组中的元素只能是数组类型
int[][] number3 = new int[3][];

现在看一下上面定义二维数组的内存结构:

int[][] numbers1 = new int[][]{{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};

内存结构如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

首先在栈中定义了一个变量 numbers1,numbers1 存储的是第一层数组的首地址,第一层中的各个元素存储的是第二层各个数组的首地址。


int[][] numbers2 = new int[][]{{1,2,3,4}, {5,6}, {7,8,9}};

内存结构如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


String[][] strs1 = new String[3][2];

内存结构如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


int[][] number3 = new int[3][];

内存结构如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上面第一层数组的值是空的,还没有指向第二层数组,后面可以创建第二层数组,将地址赋值给第一层数组。

2 基础操作

获取长度

也是使用 .length 属性可以获取到数组的长度。

但是数组中第二层数组元素的长度需要获取到第一层数组元素再获取长度。

int[][] numbers = new int[][]{{1,2,3,4}, {5,6}, {7,8,9}};
System.out.println(numbers.length);    // 3
System.out.println(numbers[0].length); // 4
System.out.println(numbers[1].length); // 2

String[][] strs = new String[3][];
System.out.println(strs.length);    // 3
//System.out.println(strs[0].length);    // 报错,因为strs[0]为null

访问元素

访问二维数组中的元素,需要通过两个 [] 获取,第一个表示获取到的是第一层的元素,第二个才是获取到二维数组中的元素。

int[][] numbers = new int[][]{{1,2,3,4}, {5,6}, {7,8,9}};
System.out.println(numbers[0][0]);    // 1
System.out.println(numbers[1][1]);    // 6
numbers[2][1] = 1;      									  // 修改值
numbers[1] = new int[]{1,2,3,4,5,6,7,8,9};  // 修改值

String[][] strs = new String[3][];
strs[0] = new String[]{"red", "yellow"};   // 元素就是数组
System.out.println(strs[0][1]); // yellow

不是数组的长度无法更改吗,为什么可以这样操作 numbers[1] = new int[]{1,2,3,4,5,6,7,8,9}; ,这是将第一层数组指向了一个新的第二层数组而已。


3 遍历数组

使用 for 循环遍历

遍历二维数组,需要两层 for 循环。

// 创建一个3x3的二维数组
int[][] numbers = new int[3][3];

// 赋值
for (int i = 0; i < numbers.length; i++) {
    for (int j = 0; j < numbers[i].length; j++) {
        numbers[i][j] = i * 10 + j;
    }
}

// 遍历并打印数组元素
System.out.println("二维数组的内容:");
for (int i = 0; i < numbers.length; i++) {
    for (int j = 0; j < numbers[i].length; j++) {
        System.out.print(numbers[i][j] + " ");
    }
    System.out.println(); // 换行
}

上面使用 for 循环对二维数组进行了遍历赋值和打印。

注意:第一层 for 循环取的是第一层数组的长度,第二层数组取的是第二层数组的长度。

执行结果:

二维数组的内容:
0 1 2
10 11 12
20 21 22


使用 for-each 循环遍历

// 创建一个3x3的二维数组
int[][] numbers = new int[3][3];

// 赋值
for (int i = 0; i < numbers.length; i++) {
    for (int j = 0; j < numbers[i].length; j++) {
        numbers[i][j] = i * 10 + j;
    }
}

// 遍历并打印数组元素
System.out.println("二维数组的内容:");
for (int[] nums : numbers) {
    for (int i : nums) {
        System.out.print(i + " ");
    }
    System.out.println(); // 换行
}

使用 for-each 循环看上去要简洁很多,第一层 for-each 循环获取到的每个元素其实是一维数组,然后第二层 for-each 循环遍历每个一维数组。

5.3 数组的其他操作

1 数组复制

将一个数组的值赋值给另一个数组,该如何操作。

先看下面的代码,看看能否将 numbers1 的值复制给 numbers2

int[] numbers1 = {1, 2, 3, 4, 5, 6};
int[] numbers2 = new int[6];

numbers2 = numbers1;
System.out.println(Arrays.toString(numbers2));      // [1, 2, 3, 4, 5, 6]

numbers1[0] = 8;			// 修改numbers1的元素
System.out.println(Arrays.toString(numbers2));      // [8, 2, 3, 4, 5, 6] numbers2的值也变了

很明显上面并不能将 numbers1 的值复制给 numbers2,因为后来修改 numbers1 的值, numbers2 的值也发生了变化,说明不是独立的两份数据。

其实内存结果是下面这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

初始化两个数组的时候, numbers1numbers2 还是独立的数据,后来 numbers2 = numbers1; 则将 number1 中存储的地址值赋给了 number2,那么 number2 也之下那个了 number1 指向的堆中的内存地址。


所以我们在复制数组的时候,需要遍历数组,一个一个元素的去复制:

int[] numbers1 = {1, 2, 3, 4, 5, 6};
int[] numbers2 = new int[6];

// 将数组numbers1的值赋值给number2,这里要注意numbers1和numbers2的长度,不要越界
for (int i = 0; i < numbers1.length; i++) {
    numbers2[i] = numbers1[i];
}
System.out.println(Arrays.toString(numbers2));      // [1, 2, 3, 4, 5, 6]

numbers1[0] = 8;		// 修改numbers1的元素
System.out.println(Arrays.toString(numbers2));      // [1, 2, 3, 4, 5, 6],不影响numbers2

Java API 给我们提供了很多可以用的类,可以帮我们完成很多功能,不用需要我们编写代码去实现。

所谓的 Java API 就是为 Java 编程语言提供的可以直接使用的类库和方法。

例如上面的数组复制功能,也可以调用 Java 提供的 API :System.arraycopy

int[] numbers1 = {1, 2, 3, 4, 5, 6};
int[] numbers2 = new int[6];

// 将numbers1的值复制给numbers2
System.arraycopy(numbers1, 0, numbers2, 0, numbers1.length);
System.out.println(Arrays.toString(numbers2));

numbers1[0] = 8;		// 修改numbers1的元素
System.out.println(Arrays.toString(numbers2));      // [1, 2, 3, 4, 5, 6],不影响numbers2

System.arraycopy 参数说明:

  • 第一个参数:源数组,数据从哪里来;
  • 第二个参数:从源数组的哪个位置开始复制;
  • 第三个参数:目标数组,数据复制给谁;
  • 第四个参数:放到目标数组哪个位置;
  • 第五个参数:要复制的数据的长度;

还有另外的API : Arrays.copyOfArrays.copyOfRange ,也可以完成数组的复制,不过是重新开辟了内存空间。

int[] numbers1 = {1, 2, 3, 4, 5, 6};
int[] numbers2 = new int[6];
numbers2 = Arrays.copyOf(numbers1, 4);
System.out.println(Arrays.toString(numbers2));      // [1, 2, 3, 4]

int[] numbers3 = Arrays.copyOfRange(numbers1, 2, 5);
System.out.println(Arrays.toString(numbers3));			// [3, 4, 5]

在上面的代码中,并没有修改原来 numbers2 的内存空间的数据,而是重新开辟了内存控制,然后将内存地址给了变量 number2

Arrays.copyOf 的第一个参数是源数组,第二个是复制的数据长度,复制是从索引0开始复制的。

Arrays.copyOfRange 的第一个参数是源数组,第二个参数是复制的起始位置(包含该位置),第三个参数是复制的结束位置(不包含该位置)。

2 冒泡排序

思考:

一个 int[] 类型的数组,其中的元素大小没有顺序,该如何实现将其中的元素由大到小排列呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


原理

冒泡排序是数组排序中一个非常经典的算法。

原理是:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。

首先取出第一个数,依次和后面的元素比较,如果比后面的元素大,就交换,否则继续用后面的数比较。

用图示例一下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面只是第一轮的比较,会找到最大的数,排到数组末尾;第二轮需要拿4进行比较,最终找到第二大的数6,6会沉到7前面,就不用和7比较了,也就是每比较一次,在最后面就会少比较一次,因为大的都沉到底部了,后面都是排序好的,自然就不用比较了。

冒泡算法因为在排序的过程中,较大(或较小)的元素会像气泡一样从数组的一端“浮”到另一端,像冒泡一样。


Java代码实现

下面使用 Java 代码实现冒泡排序。

public static void main(String[] args) {
    int[] num = {6, 4, 7, 1, 2, 5, 3};

    // 总共比较数组长度-1次,i就是当前比较的次数
    for (int i = 0; i < num.length - 1; i++) {
        // 每一次比较,在最后面都会少比较已经比较的次数
        for (int j = 0; j < num.length - i - 1; j++) {
            // 如果当前元素大于下一个元素,则交换它们
            if (num[j] > num[j + 1]) {
                // 交换两个位置的值
                int temp = num[j];
                num[j] = num[j + 1];
                num[j + 1] = temp;
            }
        }
    }

    System.out.println(Arrays.toString(num));   // [1, 2, 3, 4, 5, 6, 7]
}

同样,在实际开发中也不需要我们手写排序算法, Java API 也提供了排序的方法,可以直接调用排序方法来对数组进行排序,只是 Java API 底层不是用冒泡排序实现的,冒泡排序的效率不是很高。

int[] num = {6, 4, 7, 1, 2, 5, 3};

// 从小到大对数组进行排序
Arrays.sort(num);
System.out.println(Arrays.toString(num));   // [1, 2, 3, 4, 5, 6, 7]

所有当我们要实现一个功能的时候,可以先查一下 Java API 有没有提供现成的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1645686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java毕设之学院党员管理系统的设计与实现

运行环境 环境说明: 开发语言:java 框架:springboot&#xff0c;vue JDK版本:JDK1.8 数据库:mysql5.7(推荐5.7&#xff0c;8.0也可以) 数据库工具:Navicat11 开发软件:idea/eclipse(推荐idea) Maven包:Maven3.3.9 系统实现 管理员功能实现 党员管理 管理员进入指定功能操作…

AI 不仅会画画,还能造车 | 最新快讯

本周的北京&#xff0c;正在上演一场深刻的变革。 汽车产业&#xff0c;这个曾经以工业制造为核心的行业&#xff0c;正迅速地被数字化浪潮所改变&#xff0c;汽车、电商、互联网、人工智能等领域的界限变得模糊。在这样的背景下&#xff0c;车企们纷纷开始打破传统&#xff0c…

【AI】深度学习框架的期望与现实 机器学习编译尚未兑现其早期的一些承诺……

深度学习框架的期望与现实 机器学习编译尚未兑现其早期的一些承诺…… 来自&#xff1a;Axelera AI 资深软件工程师 Matthew Barrett 原帖是linkedin帖子&#xff1a; https://linkedin.com/posts/matthew-barrett-a49929177_i-think-its-fair-to-say-that-ml-compilation-ac…

【driver2】设备读写,同步和互斥,ioctl,进程休眠,时间和延时,延缓

文章目录 1.实现设备读写&#xff1a;write函数中一个进程写没问题&#xff0c;两进程写&#xff1a;第一个进程运行到kzalloc时&#xff0c;第二个进程也执行了kzalloc&#xff0c;只第二个进程地址保存在c中&#xff0c;第一个进程分配内存空间地址丢失造成内存泄漏。第一个进…

【Three.js基础学习】14.Galaxy Generator

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 课程知识点 1. 实现星际编辑器 2. 创建粒子 1000&#xff0c; 在随机位置 3. 创建材质 PointsMaterial 4. Points() 接收 5. 放到gui 中调试 但是会发现调整size 等 属…

4.任务创建和删除的API函数

一、简介 二、动态创建任务函数:xTaskCreate() 此函数用于使用动态的方式创建任务&#xff0c;任务的任务控制块以及任务的栈空间所需的内存&#xff0c;均由 FreeRTOS 从 FreeRTOS 管理的堆中分配&#xff0c;若使用此函数&#xff0c;需要在 FreeRTOSConfig.h 文件 中将宏 c…

5.6 qt day1

自由创建一个登录页面 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口this->setWindowTitle("");//设置窗口图标this->setWindowIcon(QIcon("C:\\Users\\14123\\Desktop\\b3119313b07eca80842876219…

【go项目01_学习记录05】

学习记录 1 依赖管理 Go Modules1.1 弃用 $GOPATH1.2 Go Modules 日常使用1.2.1 初始化生成go.mod文件1.2.2 Go Proxy代理1.2.3 go.mod文件查看1.2.4 go.sum文件查看1.2.5 indirect 含义1.2.6 go mod tidy 命令1.2.7 清空 Go Modules 缓存1.2.8 下载依赖1.2.9 所有 Go Modules …

知到java笔记(4.1--继承的用法以及this和super的用法)

格式&#xff1a; 例子&#xff1a; get set获取父类的私有变量 private属性 this和super区别&#xff1a; this用法 super用法 例子

从固定到可变:利用Deformable Attention提升模型能力

1. 引言 本文将深入探讨注意力机制的内部细节&#xff0c;这是了解机器如何选择和处理信息的基础。但这还不是全部&#xff0c;我们还将探讨可变形注意力的创新理念&#xff0c;这是一种将适应性放在首位的动态方法。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2. 注…

重学java 29.经典接口

光阴似箭&#xff0c;我好像跟不上 —— 24.5.6 一、java.lang.Comparable 我们知道基本数据类型的数据(除boolean类型外)需要比较大小的话&#xff0c;直接使用比较运算符即可&#xff0c;但是引用数据类型是不能直接使用比较运算符来比较大小的。那么&#xff0c;如何解决这个…

linux部署java1.8(jdk1.8)

两种方式&#xff1a; 方式一 1.输入查找命令&#xff1a; yum -y list java*2.输入安装命令&#xff1a; yum install -y java-1.8.0-openjdk.x86_643.测试是否已经安装&#xff1a; java -version方式二&#xff1a; 点击链接进入官网&#xff1a;https://www.oracle.com/…

【教程】极简Python接入免费语音识别API

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;请不吝给个[点赞、收藏、关注]哦~ 安装库&#xff1a; pip install SpeechRecognition 使用方法&#xff1a; import speech_recognition as srr sr.Recognizer() harvard sr…

idea2023.2.5的控制台动态配置当前环境

一、idea2023.2.5的控制台动态配置当前环境 1.1、idea版本 1.2、配置方式 1.2.1、方式一 1.2.2、方式二 1.3、参考 https://blog.csdn.net/xiaoheihai666/article/details/127757658

使用idea编辑器回退git已经push的代码

直接上结果 选择想要回退的那次/多次提交历史, 右击, 选中 revert commit git自动产生一个Revert记录&#xff0c;然后我们会看到git自动将我第三次错误提交代码回退了&#xff0c;这个其实就相当于git帮我们手动回退了代码。 后续&#xff0c;只需要我们将本次改动push到远…

从零开始的软件测试学习之旅(五)web测试项目

这里写目录标题 功能型测试非功能性测试面试拓展项目与数据库关系 测试用例设计—基于TPshop前台下单流程 功能型测试 一.设计测试 a,需求分析 1.输入分析 分析项目中要求如:输入长度,类型要求,组成规则,是否为空,是否重复 2.交付分析 判断所有数据正确,有错误给出提示(优化…

锂电池SOH估计 | Matlab实现基于ALO-SVR模型的锂电池SOH估计

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池SOH估计 | Matlab实现基于ALO-SVR模型的锂电池SOH估计 蚁狮优化支持向量机锂电池健康状态SOH估计&#xff1b; 具体流程如下&#xff1b; 1、分析锂离子电池老化数据集&#xff0c;从中选取具有代表电池性能衰减…

2024第2届华东国际宠物用品展(苏州)

第2届华东宠物展&#xff08;苏州&#xff09;2024.06.28-30 苏州国际博览中心 中国宠业新锐品牌展 400海外展商 20000平方展出面积 3000知名品牌 60000优质观众 参展组委会咨询&#xff1a;深宠展邹春宇 关于展会 第2届华东国际宠物用品展览会(苏州)暨中国宠业新锐品牌…

【自用】了解移动存储卡的基本信息

前言 本文是看B站视频做的一个简单笔记&#xff0c;方便日后自己快速回顾&#xff0c;内容主要介绍了存储卡基本参数&#xff0c;了解卡面上的数字、图标代表的含义。对于日后如何挑选判断一张存储卡的好坏、判别一张存储卡是否合格有一定帮助。 视频参考链接&#xff1a;【硬…

嵌入式Linux学习第二天

今天学习linuxC编程。首先要熟悉linux下编写c程序的过程。 编写程序Hello World! 首先创建存放程序的文件夹&#xff0c;如下图所示&#xff1a; 接下来在创建一个文件夹来保存这节要编写的代码。指令&#xff1a;mkdir 3.1 接下来我们要设置VIM编辑器的一些配置&#xff0…