C语言:数组
数组
数组的概念
引例
如果我们要在程序中表示一个学生的成绩,我们会使用一个int来表示,如:int score
。假如我们要在程序中表示一组成绩,此时我们所学的常规的数据类型就无法再表示,这个时候我们就需要使用一种新的表现形式,这种表现形式就是我们的数组。
什么是数组
数组是相同类型,有序数据的集合。
数组的特征
- 数组中的数据被称为数组的元素,是同构的
- 数组中的元素放在内存空间里(如:char ct_name[20]:再内存中申请6块连续的基于char类型的变量空间)
衍生概念:下标(索引)
- 下标或索引代表了数组中元素距离第一个元素的偏移位置
- 数组中的元素的地址值,下标越大,地址值越大(每一块内存空间都有一个独有的内存地址,变量空间以字节为单位进行地址的标注,我们也可以说
1内存单元=1字节
) - 数组的下标是从0开始
一堆数组
数组的定义
语法:
类型说明符 数组名[数组容量]
说明:
- 数组的类型说明符由数组中的元素来决定,也就是元素是什么类型,数组就是什么类型。
- 数组名也是标识符,我们所说的数组[名],大家可以理解为数据类型是数组的变量(名)。命名规则与变量名相同。遵循标识符命名规则。
- 数组容量也可以叫做元素个数或者常量表达式,表达式必须为整型,可以包含常量和符号常量,但不能是变量。
int arr[5];// 常量#define COUNT 5
int arrp[COUNT];// 符号常量int arr[800 * 480];// 常量表达式
类型:代表了数组中元素的类型。
容量:数组中能存储多少个元素,数组容量可以是常量、常量表达式、符号常量,但必须是整数。
深入理解:
- 定义一个数组,相当于申请了一个可以容纳所指定元素数量的内存空间。所申请的内存单元是连续的。
- 定义一个数组,相当于定义了多个匿名的变量,这些变量可以通过
数组名[下标]
来标识。
举例:
// 定义一个数组
int arr[10];// 问题:这个数组中,最小索引:0,最大索引:9 = 数组元素个数 - 1
经过上面的案例,分析得到:
数组的最大下标 = 数组元素个数(数组容量) - 1
数组元素的访问
原则:数组中的元素不能一次性访问所有元素,只能一个一个的访问。
语法:
数组名[下标]
说明:以上语法,既能实现数组中元素的取,也能够实现数组中元素的存。
举例:
// 定义一个能够容纳10个元素的int数组
int arr[10];
// 给数组的第一个元素进行赋值
arr[0] = 89;
arr[0] = 88;// 覆盖上面的赋值// 访问数组的第一个元素
int a = arr[0];// 88// 问题:以下访问是否正确
int b = arr[10];// error:下标越界异常
注意:数组元素的访问一定不能越界。
案例:
#include <stdio.h>/*** 需求:一位数组案例-引用数组元素。利用循环给数组元素赋值0~9,并且逆序输出。*/
int arr_test1()
{// 创建一个数组int arr[10];// 利用for循环给数组元素赋值for(int i = 0;i < 10;i++){arr[i] = i + 10;}// 逆序输出// 通过一个循环将数组中的每一个元素取出,称之为遍历。for(int j = 9;j >= 0;j--){printf("%-5d/t",arr[j]);}
}int main(int argc,char *argv)
{arr_test1();return 0;
}
数组的初始化
数组初始化:定义数组的同时,用指定数据来给对应元素赋值。
简化数组定义后,需要对元素一一赋值操作。
语法:
类型 数组名[容量大小] = {常量1,常量2,常量3...};
注意:
- 数组可以部分初始化:也就是可以给数组中的前几个元素初始化,未被初始化的元素系统将会自动初始化;如果定义数组时未被指定数据容量,则系统会根据初始化元素的个数来决定数组容量。
// 1.如果定义数组时只给数组前几个元素初始化,后续剩余元素会自动完成初始化
int arr[10] = {11,12,13,14,15};// 推荐写法,等价于以下写法
int arr[10] = {11,12,13,14,15,0,0,0,0,0};// 2.如果定义数组时,未指定数组容量,根据初始化的元素的个数来决定容量
int arr[] = {1,2,3,4,5};// 推荐写法,等价于以下写法
int arr[5] = {1,2,3,4,5};
衍生概念:
- ==柔性数组:==柔性数组的概念在C99标准,针对结构体的最后一个成员可以是一个未指定大小的数组;
- 广义简单理解:数组容量待定,或者确定的数组,举例:int arr[] = {1,2,3,4,5}
面试题:
- 在不知道数组类型的情况下,如何确定数组元素的个数
int length = sizeof(arr) / sizeof(arr[0]);
说明:
- arr就是我们计算的数组本身,
sizeof(arr)
用来计算该数组中总的字节大小。 sizeof(arr[0])
用来计算数组中第一个元素所占的字节大小,因为数组中元素类型相同,所以计算哪一个都可以。sizeof(arr)/sizeof(arr[0])
就是用数组中总的字节数除以每一个元素所占的字节数,从而得到元素的个数。
一维数组案例:
案例1:
#include <stdio.h>/*** 需求:一维数组案例-非波拉契数列*/
int arr_test1()
{int f[20] = {1,1};// 定义一个数组,用来存储数列,默认存储第1位和第2位// 计算获取数组的大小,主要用于遍历数组int length = sizeof(f) / sizeof(f[0]);// 将生成的序列存入数组(索引绕过0和1)for(int i = 0;i < length;i++){// 给数组元素赋值,从数组的第3个元素开始f[i] = f[i-1]+f[i-2];// 遍历数组for(int j = 0;j < length;j++){// 遍历的时候,要求一行显示5个数if(j % 5 == 0){printf("\n");}printf("%-6d",f[j]);}printf("\n");}}int main(int argc,char *argv)
{arr_test2();return 0;
}
案例2:
/*** 需求:一维数组案例-非波拉契数列*/
int arr_test2()
{int f[20] = {1, 1}; // 定义一个数组,用来存储数列,默认存储第1位和第2位// 计算获取数组的大小,主要用于遍历数组int len = sizeof(f) / sizeof(f[0]);// 将生成的序列存入数组(索引绕过0和1)for (int i = 2; i < len; i++){// 给数组元素赋值,从数组的第3个元素开始f[i] = f[i - 1] + f[i - 2];}// 遍历数组for (int j = 0; j < len; j++){// 遍历的时候,要求一行显示5个数if (j % 5 == 0){printf("\n");}printf("%-6d", f[j]);}printf("\n");
}int main(int argc,char *argv)
{arr_test2();return 0;
}
案例3:
/*** 需求:一维数组案例-冒泡排序*/
int arr_test3()
{// 创建一个数组,用来存储排序的序列int arr[10];// i:外层-比较的轮数,j:内层-每一轮比较的次数,temp:临时变量,用来比较时交换数据交换int i,j,temp;printf("请输入10个测试整数:\n");// 计算数组的大小int len = sizeof(arr) / sizeof(arr[0]);// 循环录入数据for(i = 0;i < len;i++){scanf("%d",&arr[i]);}printf("\n");// 对数组arr使用冒泡进行排序(注意:我们使用的标准的冒泡排序,可以继续优化)// 外层循环:控制比较的轮数,轮数 = 数组容量 - 1,这个案例比9轮for(i = 0;i < len - 1;i++){// 内层循环:每一轮比较的次数,每一轮比较的次数:for(j = 0;j < len - 1 - i;j++){// 相邻的两个数比较,满足条件就交换位置if (arr[j] > arr[j+1]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}printf("冒泡排序遍历数组:\n");for (i = 0; i < len; i++){printf("%-4d",arr[i]);}printf("\n");
}
int main(int argc,char *argv)
{arr_test3();return 0;
}
案例4:
/*** 需求:从键盘输入年、月、日,并计算输出是该年的第几天,2024-12-3*/
int arr_test4()
{// 定义变量:年、月、日,统计天数,循环变量:用来遍历当前月前面的月份int year,month,day,sum,k;// 定义一个数组,用来存放1~12月每月的天数int t[] = {31,28,31,30,31,30,31,31,30,31,30,31};// 柔性数组printf("请输入年份、月份、天:(使用-分割)\n");scanf("%d-%d-%d",&year,&month,&day);// 2024-12-3// 因为2月比较特殊,存在平年和闰年的因素,所以要进行判断处理if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){t[1] = 29;// 闰年}// 先将输入的天记录到总天数sum = day;// 计算当前月前的所有月的天数for(k = 0;k < month - 1;k++){sum += t[k];}printf("%d月%d日是%d年的第%d天。\n",month,day,year,sum);}int main(int argc, char *argv)
{arr_test4();return 0;
}
相关文章:

C语言:数组
数组 数组的概念 引例 如果我们要在程序中表示一个学生的成绩,我们会使用一个int来表示,如:int score。假如我们要在程序中表示一组成绩,此时我们所学的常规的数据类型就无法再表示,这个时候我们就需要使用一种新的…...

时间序列预测之FiLM
没错,就是看电影 文章目录 前言1. 问题描述2. 创新之处3. 贡献 一、时间序列在legende - fourier域的表示1. 勒让德投影2. 傅里叶变换 二、 模型结构1. LPU: Legendre Projection Unit2. FEL: Frequency Enhanced Layer3. 多尺度专家机制的混合 二、实验结果长时预测…...

【机器学习】窥数据之序,悟算法之道:机器学习的初心与远方
文章目录 机器学习入门:从零开始学习基础与应用前言第一部分:什么是机器学习?1.1 机器学习的定义1.1.1 举个例子:垃圾邮件分类器 1.2 机器学习的核心思想1.2.1 数据驱动的模式提取1.2.2 为什么机器学习比传统方法更灵活࿱…...

OpenCL介绍
OpenCL(Open Computing Language)详解 OpenCL 是一个开源的框架,用于编写在异构平台(包括中央处理单元(CPU)、图形处理单元(GPU)、数字信号处理器(DSP)和其他…...

「Mac畅玩鸿蒙与硬件42」UI互动应用篇19 - 数字键盘应用
本篇将带你实现一个数字键盘应用,支持用户通过点击数字键输入数字并实时更新显示内容。我们将展示如何使用按钮组件和状态管理来实现一个简洁且实用的数字键盘。 关键词 UI互动应用数字键盘按钮组件状态管理用户交互 一、功能说明 数字键盘应用将实现以下功能&…...

【前端知识】npm命令行详细说明
npm命令行详细说明 概述一、定义与功能二、基本命令三、配置文件与注册表四、应用场景五、高级特性 环境设置1. 设置镜像源2. 配置全局依赖存储路径3. 配置缓存路径4. 查看所有配置5. 清除缓存6. 升级npm版本 npm组件打包1. 初始化项目2. 安装依赖3. 构建脚本4. 打包项目5. 发布…...

Python网络爬虫技术详解与实践案例
Python网络爬虫技术详解与实践案例 在大数据和人工智能盛行的今天,数据的获取与分析成为许多项目和业务的关键。网络爬虫作为一种自动化的数据采集工具,广泛应用于数据挖掘、市场分析、情报收集等领域。本文将详细介绍Python网络爬虫的基本概念、工作流程、进阶技巧,并附上…...

【遥感目标检测综述】【GRSS】遥感目标检测与深度学习的相遇:挑战与进展的元综述
Remote Sensing Object Detection Meets Deep Learning: A Meta-review of Challenges and Advances 遥感目标检测与深度学习的相遇:挑战与进展的元综述 论文链接 0.论文摘要和作者信息 摘要 遥感目标检测(RSOD)是遥感领域最基…...

【大数据技术基础】 课程 第3章 Hadoop的安装和使用 大数据基础编程、实验和案例教程(第2版)
第3章 Hadoop的安装和使用 3.1 Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台,为用户提供了系统底层细节透明的分布式基础架构。Hadoop是基于Java语言开发的,具有很好的跨平台特性,并且可以部署在廉价的计算机集群中。H…...
【机器学习】机器学习的基本分类-监督学习-决策树-C4.5 算法
C4.5 是由 Ross Quinlan 提出的决策树算法,是对 ID3 算法的改进版本。它在 ID3 的基础上,解决了以下问题: 处理连续型数据:支持连续型特征,能够通过划分点将连续特征离散化。处理缺失值:能够在特征值缺失的…...

云计算vsphere 服务器上添加主机配置
这里是esxi 主机 先把主机打开 然后 先开启dns 再开启 vcenter 把每台设备桌面再vmware workstation 上显示 同上也是一样 ,因为在esxi 主机的界面可能有些东西不好操作 我们选择主机和集群 左边显示172.16.100.200...

Linux笔记---进程:进程替换
1. 进程替换的概念 进程替换是指在一个正在运行的进程中,用一个新的程序替换当前进程的代码和数据,使得进程开始执行新的程序,而不是原来的程序。 这种技术通常用于在不创建新进程的情况下,改变进程的行为。 我们之前谈到过for…...

量化交易backtrader实践(五)_策略综合篇(1)_股票软件指标回测
在第三章6到9节,我们学习和实践了大部分股票软件指标,且这些指标是backtrader内置指标实践中没有讲到过的。然后,在进行策略综合之前,我们先热个身,把一些可能比较有参考意义的股票软件内置指标在backtrader里给实现了…...

4.STM32通信接口之SPI通信(含源码)---软件SPI与W25Q64存储模块通信实战《精讲》
经过研究SPI协议和W25Q64,逐步了解了SPI的通信过程,接下来,就要进行战场实战了!跟进Whappy步伐! 目标:主要实现基于软件的SPI的STM32对W25Q64存储写入和读取操作! 开胃介绍(代码基本…...

MINDAGENT:游戏交互中的新兴性设计
一、摘要 1.问题/研究背景 LLM具有在多智能体系统中执行复杂调度的能力,并可以协调这些代理以完成需要广泛合作的复杂任务。 但是,目前还没有一个标准的游戏场景和相关的测试指标来评估 LLM 在游戏中的表现以及与人类玩家的合作能力。 2.研究目标/动…...

【工具变量】上市公司企业所在地城市等级直辖市、副省级城市、省会城市 计划单列市(2005-2022年)
一、包含指标: 股票代码 股票代码 股票简称 年份 所属城市 直辖市:企业所在地是否属于直辖市。1是,0否。 副省级城市:企业所在地是否属于副省级城市。1是,0否。 省会城市&a…...

C# 动态类型 Dynamic
文章目录 前言1. 什么是 Dynamic?2. 声明 Dynamic 变量3. Dynamic 的运行时类型检查4. 动态类型与反射的对比5. 使用 Dynamic 进行动态方法调用6. Dynamic 与 原生类型的兼容性7. 动态与 LINQ 的结合8. 结合 DLR 特性9. 动态类型的性能考虑10. 何时使用 Dynamic&…...

Css动画:旋转相册动画效果实现
🌈个人主页:前端青山 🔥系列专栏:Css篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:Css动画:旋转相册动画效果实现 前言 随着Web技术的发展,网页不再局限于静态展示&#…...

Unity 基于Collider 组件在3D 物体表面放置3D 物体
实现 从鼠标点击的屏幕位置发送射线,以射线监测点击到的物体,根据点击物体的法线向量调整放置物体的位置及朝向。 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 100)) {obj.transform.…...

Hbase整合Mapreduce案例1 hdfs数据上传至hbase中——wordcount
目录 整合结构准备java API 编写pom.xmlMain.javaMap.javaReduce 运行 整合结构 准备 上传hdfs data.txt数据 data.txt I am wunaiieq QAQ 123456 Who I am In todays interconnected world the role of technology cannot be overstated It has revolutionized the way we …...

PyQt 中的无限循环后台任务
在 PyQt 中实现一个后台无限循环任务,需要确保不会阻塞主线程,否则会导致 GUI 无响应。常用的方法是利用 线程(QThread) 或 任务(QRunnable 和 QThreadPool) 来运行后台任务。以下是一些实现方式和关键点&a…...

5G CPE核心器件-基带处理器(三)
5G CPE 核心器件 -5G基带芯片 基带芯片简介基带芯片组成与结构技术特点与发展趋势5G基带芯片是5G CPE中最核心的组件,负责接入5G网络,并进行上下行数据业务传输。移动通信从1G发展到5G,终端形态产生了极大的变化,在集成度、功耗、性能等方面都取得巨大的提升。 基带芯片简…...

鸿蒙next版开发:拍照实现方案(ArkTS)
文章目录 拍照功能开发步骤1. 导入相关接口2. 创建会话3. 配置会话4. 触发拍照5. 监听拍照输出流状态 结语 在HarmonyOS 5.0中,ArkTS提供了一套完整的API来管理相机功能,特别是拍照功能。本文将详细介绍如何在ArkTS中实现拍照功能,并提供代码…...

C++面试突破---C/C++基础
1.C特点 1. C在C语言基础上引入了面对对象的机制,同时也兼容C语言。 2. C有三大特性(1)封装。(2)继承。(3)多态; 3. C语言编写出的程序结构清晰、易于扩充,程序可读性好。…...

项目搭建+修改
一 : 在列表成功回调函数,追加数据中,添加修改的按钮 for (let x of res) {//追加数据$("#table").append(<tr><td><input type"checkbox" class"ck" value"\${x.uid}"></td><td>\${x.uid}</td>…...

每日算法一练:剑指offer——树篇(4)
1.计算二叉树的深度 某公司架构以二叉树形式记录,请返回该公司的层级数。 示例 1: 输入:root [1, 2, 2, 3, null, null, 5, 4, null, null, 4] 输出: 4 解释: 上面示例中的二叉树的最大深度是 4,沿着路径 1 -> 2 -> 3 -&…...

Nginx静态资源配置
基本配置原则 明确资源目录:为不同类型的静态资源指定不同的路径,这样可以避免路径冲突,并且便于管理。正确设置文件权限:确保 Nginx 具有读取静态资源的权限。缓存优化:为静态资源设置缓存头(如 expires&…...

困扰解决:mfc140u.dll丢失的解决方法,多种有效解决方法全解析
当电脑提示“mfc140u.dll丢失”时,这可能会导致某些程序无法正常运行,给用户带来不便。不过,有多种方法可以尝试解决这个问题。这篇文章将以“mfc140u.dll丢失的解决方法”为主题,教大家有效解决mfc140u.dll丢失。 判断是否是“mf…...

D3.js 初探
文章目录 D3.js 简单介绍选择集与方法数据绑定方法选择集添加DOM元素以及删除元素理解update enter 以及 exit关于比例尺layout 布局force layout 坐标轴元素添加动态效果demo1: 绘制简单柱状图 #D3.js 初探 最近在做一个Data Visualization 的项目,由于对最终呈现的…...

linux常用指令 | 适合初学者
linux常用指令 1.ls: 列出当前,目录中的文件和子目录 ls 2.pwd: 显示当前工作目录的路径 pwd3.cd切换工作目录 cd /path/to/director4.mkdir:创建新目录 mkdir directory_name5.rmdir:删除空目录 rmdir directory_name6.rm: 删除文件或目录 rm file_name r…...