当前位置: 首页 > 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。

在这里插入图片描述

相关文章:

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

06- 数组的基础知识详细讲解 一、基本概念 一次性定义多个相同类型的变量&#xff0c;并且给它们分配一片连续的内存。 int arr[5];1.1 初始化 只有在定义的时候赋值&#xff0c;才可以称为初始化。数组只有在初始化的时候才可以统一赋值。 以下是一些示例规则&#xff1a; …...

CentOS6系统因目录有隐含i权限属性致下属文件无法删除的故障一例

CentOS6服务器在升级openssh时因系统目录权限异常&#xff08;有隐含i权限属性&#xff09;&#xff0c;下属文件无法删除&#xff0c;导致系统问题的故障一例。 一、问题现象 CentOS6在升级openssh时&#xff0c;提示如下问题&#xff1a; warning: /etc/ssh/sshd_config c…...

【视频转码】ZLMediaKit漏洞报告的问题

漏洞问题&#xff1a; 支持ss1 rc4密码套件(bar mitzvah) 漏洞级别&#xff1a; 中危 漏洞修复&#xff1a; 方法&#xff1a;避免使用RC4密码&#xff0c;参考代码如下&#xff1a; 修改文件位于&#xff1a;webrtc/DtlsTransport.cpp ret SSL_CTX_set_cipher_list(ssl…...

100道大模型面试八股文

算法暑期实习机会快结束了&#xff0c;校招大考即将来袭。 当前就业环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;岗位在变少&#xff0c;要求还更高了。 最近&#xff0c;我们陆续整理了很多大厂的面试题&#xff0c;帮助球友解惑答疑和职业规划&#xff0c;分…...

【ARM Cache 及 MMU 系列文章 6.2 -- ARMv8/v9 Cache 内部数据读取方法详细介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Direct access to internal memoryL1 cache encodingsL1 Cache Data 寄存器Cache 数据读取代码实现Direct access to internal memory 在ARMv8架构中,缓存(Cache)是用来加速数据访…...

使用Vue.js将form表单传递到后端

一.form表单 <form submit.prevent"submitForm"></form> form表单像这样写出来&#xff0c;然后把需要用户填写的内容写在form表单内。 二.表单内数据绑定 <div class"input-container"><div style"margin-left: 9px;"&…...

6、架构-服务端缓存

为系统引入缓存之前&#xff0c;第一件事情是确认系统是否真的需要缓 存。从开发角度来说&#xff0c;引入缓存会提 高系统复杂度&#xff0c;因为你要考虑缓存的失效、更新、一致性等问题&#xff1b;从运维角度来说&#xff0c;缓存会掩盖一些缺 陷&#xff0c;让问题在更久的…...

服务器遭遇UDP攻击时的应对与解决方案

UDP攻击作为分布式拒绝服务(DDoS)攻击的一种常见形式&#xff0c;通过发送大量的UDP数据包淹没目标服务器&#xff0c;导致网络拥塞、服务中断。本文旨在提供一套实用的策略与技术手段&#xff0c;帮助您识别、缓解乃至防御UDP攻击&#xff0c;确保服务器稳定运行。我们将探讨监…...

美团发布2024年一季度财报:营收733亿元,同比增长25%

6月6日&#xff0c;美团(股票代码:3690.HK)发布2024年第一季度业绩报告。受益于经济持续回暖和消费复苏&#xff0c;公司各项业务继续取得稳健增长&#xff0c;营收733亿元(人民币&#xff0c;下同)&#xff0c;同比增长25%。 财报显示&#xff0c;一季度&#xff0c;美团继续…...

sql注入-布尔盲注

布尔盲注&#xff08;Boolean Blind SQL Injection&#xff09;是一种SQL注入攻击技术&#xff0c;用于在无法直接获得查询结果的情况下推断数据库信息&#xff1b;它通过发送不同的SQL查询来观察应用程序的响应&#xff0c;进而判断查询的真假&#xff0c;并逐步推断出有用的信…...

docker-compose部署 kafka 3.7 集群(3台服务器)并启用账号密码认证

文章目录 1. 规划2. 服务部署2.1 kafka-012.2 kafka-022.3 kafka-032.4 启动服务 3. 测试3.1 kafkamap搭建&#xff08;测试工具&#xff09;3.2 测试 1. 规划 服务IPkafka-0110.10.xxx.199kafka-0210.10.xxx.198kafka-0310.10.xxx.197kafkamp10.10.xxx.199 2. 服务部署 2.1…...

LeetCode-704. 二分查找【数组 二分查找】

LeetCode-704. 二分查找【数组 二分查找】 题目描述&#xff1a;解题思路一&#xff1a;注意开区间和闭区间背诵版&#xff1a;解题思路三&#xff1a; 题目描述&#xff1a; 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xf…...

Rust 性能分析

都说Rust性能好,但是也得代码写得好,猜猜下面两个代码哪个快 . - 力扣&#xff08;LeetCode&#xff09; use std::collections::HashMap; use lazy_static::lazy_static;lazy_static! {static ref DIGIT: HashMap<char, usize> {let mut m HashMap::new();for c in …...

Gradle和Maven都是广泛使用的项目自动化构建工具

Gradle和Maven都是广泛使用的项目自动化构建工具&#xff0c;但它们在多个方面存在差异。以下是关于Gradle和Maven的详细对比&#xff1a; 一、构建脚本语言 Maven&#xff1a;使用XML作为构建脚本语言。XML的语法较为繁琐&#xff0c;不够灵活&#xff0c;对于复杂的构建逻辑…...

Seed-TTS语音编辑有多强?对比实测结果让你惊叹!

GLM-4-9B 开源系列模型 前言 就在最近&#xff0c;ByteDance的研究人员最近推出了一系列名为Seed-TTS的大规模自回归文本转语音(TTS)模型,能够合成几乎与人类语音无法区分的高质量语音。那么Seed-TTS的表现究竟有多强呢?让我们一起来感受下Seed-TTS带来的惊喜吧! 介绍Seed-TTS…...

Vue3——实现word,pdf上传之后,预览功能(实测有效)

vue-office/pdf - npm支持多种文件(**docx、excel、pdf**)预览的vue组件库&#xff0c;支持vue2/3。也支持非Vue框架的预览。. Latest version: 2.0.2, last published: a month ago. Start using vue-office/pdf in your project by running npm i vue-office/pdf. There are …...

JVM之【类的生命周期】

首先&#xff0c;请区分Bean的声明周期和类的声明周期。此处讲的是类的声明周期 可以同步观看另一篇文章JVM之【类加载机制】 概述 在Java中数据类型分为基本数据类型和引用数据类型 基本数据类型由虚拟机预先定义&#xff0c;引用数据类型则需要进行类的加载 按照]ava虚拟机…...

分库分表场景下,如何设计与实现一种高效的分布式ID生成策略

在构建大规模分布式系统时&#xff0c;随着数据量的爆炸式增长&#xff0c;单个数据库往往难以承载如此庞大的数据存储与访问需求。这时&#xff0c;分库分表便成为一种有效的解决方案&#xff0c;它通过将数据分散存储在多个数据库或表中&#xff0c;从而提高系统的处理能力和…...

机器人系统ros2-开发学习实践16-RViz 用户指南

RViz 是 ROS&#xff08;Robot Operating System&#xff09;中的一个强大的 3D 可视化工具&#xff0c;用于可视化机器人模型、传感器数据、路径规划等。以下是RViz用户指南&#xff0c;帮助你了解如何使用RViz来进行机器人开发和调试。 启动可视化工具 ros2 run rviz2 rviz2…...

安全测试 之 安全漏洞 CSRF

1. 背景 安全测试是在功能测试的基础上进行的&#xff0c;它验证软件的安全需求&#xff0c;确保产品在遭受恶意攻击时仍能正常运行&#xff0c;并保护用户信息不受侵犯。 2. CSRF 定义 CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;中文名为“跨站请…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...

Linux操作系统共享Windows操作系统的文件

目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项&#xff0c;设置文件夹共享为总是启用&#xff0c;点击添加&#xff0c;可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download&#xff08;这是我共享的文件夹&#xff09;&…...

【靶场】XXE-Lab xxe漏洞

前言 学习xxe漏洞,搭了个XXE-Lab的靶场 一、搭建靶场 现在需要登录,不知道用户名密码,先随便试试抓包 二、判断是否存在xxe漏洞 1.首先登录抓包 看到xml数据解析,由此判断和xxe漏洞有关,但还不确定xxe漏洞是否存在。 2.尝试xxe 漏洞 判断是否存在xxe漏洞 A.send to …...

jieba实现和用RNN实现中文分词的区别

Jieba 分词和基于 RNN 的分词在技术路线、实现机制、性能特点上有显著差异&#xff0c;以下是核心对比&#xff1a; 1. 技术路线对比 维度Jieba 分词RNN 神经网络分词范式传统 NLP&#xff08;规则 统计&#xff09;深度学习&#xff08;端到端学习&#xff09;核心依赖词典…...