当前位置: 首页 > news >正文

06- 数组的基础知识详细讲解

06- 数组的基础知识详细讲解

一、基本概念

一次性定义多个相同类型的变量,并且给它们分配一片连续的内存

int arr[5];

在这里插入图片描述

1.1 初始化

只有在定义的时候赋值,才可以称为初始化。数组只有在初始化的时候才可以统一赋值。
以下是一些示例规则:

int arr[5] = {1,2,3,4,5}; // 定义并初始化数组
int arr[5] = {1,2,3}; // 可以,不完全初始化
int arr[5] = {1,2,3,4,5,6,7,8,9}; // 错误(但可以用),越界初始化,越界部分将被编译器舍弃
int arr[] = {1,2,3,4,5,6,7,8,9}; // 可以,未指定大小,但有初始化,大小为9
int arr[]; // 错误,没有指定大小也没有初始化,内存大小无法确定

注意

  • 数组在定义时必须确定其大小
  • 中括号 [] 必须有数组的大小,如果没有则必须初始化。

1.2 数组元素引用

存储模式:一片连续的内存,按照数据的类型进行分割成若干个大小相同的格子。

元素的下标与偏移量:以数组开头为基础的偏移量(数据类型大小)。
在这里插入图片描述

int arr[5] = {1,2,3,4,5}; // 定义并初始化数组printf("arr[0]:%d\n", arr[0]); // 输出第一个元素arr[0] = 99; // 把数组的第1个元素(偏移量为0)修改为99printf("arr[0]:%d\n", arr[0]); // 输出修改后的第一个元素arr[5] = 250; // "错误" 越界访问,可能造成非法访问
printf("arr[5]:%d\n", arr[5]); // 越界访问的输出arr = {9,8,7,6,5,4}; // 错误,整体赋值只允许在初始化中
arr = 100; // 错误,数组不能整体赋值为一个值printf("sizeof(arr):%ld\n", sizeof(arr)); // 输出数组的大小
int len = sizeof(arr) / sizeof(int); // 求数组元素的个数for (size_t i = 0; i < len; i++) {printf("arr[%ld]:%d\n", i, arr[i]); // 输出每个元素
}

在这里插入图片描述

说明

  • sizeof(arr):获取数组占用的内存大小(字节数)。
  • sizeof(int):获取单个元素的大小(字节数)。
  • len:计算数组元素的个数。

注意事项

  1. 数组的下标从0开始。
  2. 越界访问数组会导致未定义行为,可能导致程序崩溃或错误结果。
  3. 数组整体赋值只能在初始化时进行,不能在定义之后进行整体赋值。

二、字符数组

概念: 专门用来存放字符类型数据的数组,称为字符数组。

2.1 初始化+引用

  1. 定义一个字符类型的数组并把’H’,‘e’,‘l’,‘l’,'o’一个一个存进去:
char ch1[5] = {'H', 'e', 'l', 'l', 'o'};
  1. 定义一个字符型的数组,并把"Hello"字符串存放到数组中,因此该数组为字符串数组:
char ch2[6] = {"Hello"};
  1. 与ch2一样,大括号可以省略:
char ch3[6] = "Hello";
  1. 修改字符数组中的某个元素:
ch3[1] = 'E'; // 可以,把数组中第二个元素‘e’修改为‘E’
  1. 整体赋值只允许在初始化时进行:
ch3 = "Even"; // 不可以,只有在初始化的时候才能整体赋值
  1. 输出字符数组:
printf("%s\n", ch1); // 在访问ch1的时候并没有发现结束符,因此很有可能会把ch2的内容一并输出

注意

  • 字符数组的结束符: ch1 为字符数组,但它没有结束符,因此在打印输出的时候应该避免使用%s 进行输出,否则可能会造成越界访问。字符串在C语言中以 \0 作为结束符,确保字符数组输出安全。
char ch1[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 加上结束符
printf("%s\n", ch1); // 现在可以安全地使用 %s 输出

2.2 示例代码

#include <stdio.h>int main() {// 定义并初始化字符数组char ch1[5] = {'H', 'e', 'l', 'l', 'o'};char ch2[6] = {"Hello"};char ch3[6] = "Hello";// 修改字符数组中的某个元素ch3[1] = 'E';// 正确的打印方式char ch1_with_terminator[6] = {'H', 'e', 'l', 'l', 'o', '\0'};printf("ch1 with terminator: %s\n", ch1_with_terminator);printf("ch2: %s\n", ch2);printf("ch3: %s\n", ch3);// 错误的打印方式printf("ch1 without terminator: %s\n", ch1); // 可能导致越界访问return 0;
}

总结

  • 字符数组 用来存放字符数据。
  • 初始化 时可以逐个字符赋值或使用字符串直接赋值。
  • 修改 数组元素可以通过索引访问。
  • 整体赋值 只能在初始化时进行。
  • 结束符 \0 确保字符串的安全输出。

三、数组小细节

3.1 数组未初始化

结论: 当定义数组但未初始化时,数组中的元素将包含内存中的随机值(内存中原有的内容)。

示例代码

#include <stdio.h>int main() {int arr[5];// 输出未初始化的数组元素for (int i = 0; i < 5; i++) {printf("arr[%d] = %d\n", i, arr[i]);}return 0;
}

输出: 可能会显示随机值,因为数组未初始化时,包含的是内存中的原有内容
在这里插入图片描述

3.2 部分初始化

结论: 部分初始化时,已初始化部分是已知值,未初始化的部分则为0

示例代码

#include <stdio.h>int main() {int arr[5] = {1, 2, 3}; // 部分初始化,只初始化前三个元素// 输出部分初始化的数组元素for (int i = 0; i < 5; i++) {printf("arr[%d] = %d\n", i, arr[i]);}return 0;
}

输出:

arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 0
arr[4] = 0

未初始化的元素自动设为0。

总结:

  • 未初始化数组: 包含随机值,来源于内存中的原有内容。
  • 部分初始化数组: 已初始化部分设定为指定值,未初始化部分自动设为0。

在这里插入图片描述

http://www.lryc.cn/news/365333.html

相关文章:

  • CentOS6系统因目录有隐含i权限属性致下属文件无法删除的故障一例
  • 【视频转码】ZLMediaKit漏洞报告的问题
  • 100道大模型面试八股文
  • 【ARM Cache 及 MMU 系列文章 6.2 -- ARMv8/v9 Cache 内部数据读取方法详细介绍】
  • 使用Vue.js将form表单传递到后端
  • 6、架构-服务端缓存
  • 服务器遭遇UDP攻击时的应对与解决方案
  • 美团发布2024年一季度财报:营收733亿元,同比增长25%
  • sql注入-布尔盲注
  • docker-compose部署 kafka 3.7 集群(3台服务器)并启用账号密码认证
  • LeetCode-704. 二分查找【数组 二分查找】
  • Rust 性能分析
  • Gradle和Maven都是广泛使用的项目自动化构建工具
  • Seed-TTS语音编辑有多强?对比实测结果让你惊叹!
  • Vue3——实现word,pdf上传之后,预览功能(实测有效)
  • JVM之【类的生命周期】
  • 分库分表场景下,如何设计与实现一种高效的分布式ID生成策略
  • 机器人系统ros2-开发学习实践16-RViz 用户指南
  • 安全测试 之 安全漏洞 CSRF
  • 交易中的预测和跟随
  • vs2022专业版永久密钥
  • MongoDB环境搭建
  • 数据结构【队列】
  • 微信小程序上架,AI类目审核(AI问答、AI绘画、AI换脸)
  • Vue3学习记录(第一天)
  • springboot+vue+mybatis房屋租贷系统+PPT+论文+讲解+售后
  • Day30 登录界面设计
  • VOJ 迷阵突围 题解 次短路径 dijkstra算法
  • Oracle SQL详解
  • 产业,到底需要什么大模型?