C语言(11)—— 数组(超绝详细总结)

Hi!冒险者😎,欢迎闯入 C 语言的奇幻异世界🌌!

我是 ankleless🧑‍💻,和你一样的闯荡者~ 这是我的冒险笔记打怪升级之路——C语言之路📖,里面有踩过的坑🕳、攒的技能🌟、遇的惊喜🌈,希望能帮你少走弯路✨。

愿我们在代码山峦⛰各自攀登,顶峰碰拳👊,共赏风景呀!🥳

目录

1. 数组的概念

2. 一维数组

2.1 一维数组的创建

2.2 一维数组的初始化

2.3 一维数组的类型

2.4 一维数组下标

2.5 一维数组元素的输入和输出

2.6 一维数组在内存中的存储

2.7 sizeof操作符

3. 二维数组

3.1 二维数组的概念

3.2 二维数组的创建

3.3 二维数组的初始化

3.3.1 不完全初始化

3.3.2 完全初始化

3.3.3 按照行初始化

3.3.4 初始化的省略

3.4 二维数组下标

3.5 二维数组的输入和输出

3.6 二维数组在内存中的存储

1. 数组的概念

数组是一组相同类型元素的集合,他是一种数据结构,用于按顺序存储相同类型的多个数据元素

数组中存放的是一个或者多个数组,但是数组中元素的个数不能为0

数组中存放的多个数据的类型是相同的。

数组分为一维数组多维数组,多维数组一般比较多见的是二维数组

2. 一维数组

2.1 一维数组的创建

我们常常使用下列的代码来创建一个简单的一维数组:

type  arr  [数值常量];
type 为元素类型
arr  为数组名称

存放在数组中的值称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型

type指的是数组中存放数据的类型,可以是:char、short、int、float等,也可以是自定义的类型,如结构体;

arr指的是数组名的名字,这个名字我们可以根据数组在程序中的作用进行命名,增强代码可读性;

[ ]中的常量值用来指定数组的大小,这个数组的大小是根据实际需求指定的,一经创建,他的内存空间就是固定的,这种方法也被称为静态定长数组的创建

比如:我们希望存储10次模拟考试的成绩,我们可以创建如下数组:

int score [10];//score有分数的意思,可以提高代码的可读性

2.2 一维数组的初始化

创建了数组之后,我们还需要对一维数组进行初始化,否则未经初始化得到的内存空间会留有“脏数据”(如下图)

在数组的创建时,我们需要给他一些初始值,这个操作我们称为数组的初始化

//完全初始化
int arr[5] = {1,2,3,4,5};
//不完全初始化
int arr2[6] = {1};//第⼀个元素初始化为1,剩余的元素默认初始化为0
//错误的初始化 - 初始化项太多
int arr3[3] = {1, 2, 3, 4};

2.3 一维数组的类型

数组也是有类型的,数组算是一种自定义类型,去掉数组名留下的就是数组的类型。

int arr1[10];//数组类型为int [10]
int arr2[12];//数组类型为int [12]
char ch[5];//数组类型为char [5]

那我们应该如何使用一维数组呢?

2.4 一维数组下标

C语言中规定数组是有下标的,下标是从0开始的,假设数组有n个元素,那么最后一个元素的下标是n - 1,下标就相当于数组元素的编号,如下:

int arr[10] = {1,2,3,4,5,6,7,8,9,10}

在C语言中数组的访问提供了一个操作符[ ],这个操作符叫:下标引用操作符

有了下标[ ]操作符这两个工具,我们就能快速访问数组中的一个元素,体现了数组的随机访问的特点。

如果我们想输出arr数组中的元素7,就可以使用arr[6];如果我们访问arr[0],得到的元素就是1。

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("%d ", arr[6]);//7printf("%d ", arr[0]);//1return 0;
}

2.5 一维数组元素的输入和输出

那么我们应该如何对一个数组进行数据的输入和打印呢,这里我们可以用到for循环、scanf函数、printf函数相结合的方法,具体实现方式如下:

int main()
{int arr[10] = {0};for (int i = 0; i < 10; i++){scanf("%d", &arr[i]);}for (int i = 0; i < 10; i++){printf("%d", arr[i]);}return 0;
}

2.6 一维数组在内存中的存储

一维数组中的元素在内存中是如何存储的呢?我们可以通过打印他们的地址来进行观察

从输出结果来看,数组随着小标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4,(因为一个整型是4个字节)。所以我们可以知道:数据在内存中是连续存放的

也是因为数组的这个特性,我们可以通过指针的形式来访问它的数据元素,具体讲解见如下文章:C语言(09)——关于指针(逐渐清晰版)_内存指针-CSDN博客

2.7 sizeof操作符

在C和C++中,sizeof是一个操作符,不是函数

sizeof可以用来计算类型或者变量的大小,数组也是一种数据类型,故而使用sizeof我们可以得到数组的大小:

#include <stido.h>
int main()
{int arr[10] = {0};printf("%d\n", sizeof(arr[0]));//计算⼀个元素的⼤⼩,单位是字节return 0;
}

加上接下来的代码,我们也可以求得数组的元素个数:

printf("%d",sizeof(arr)/sizeof(arr[0]));

3. 二维数组

3.1 二维数组的概念

一维数组的元素都是内置类型的,当我们把一维数组作为数组的元素时,就产生了二维数组,二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组

3.2 二维数组的创建

二维数组我们又该如何创建呢?

type arr_name[常量值1][常量值2];例如:
int arr[3][5];
double data[2][8];

在上述的例子int arr[3][5]中:

3表示数组有3行;

5表示每一行有5个元素;

int表示数组的每个元素都是整型类型;

arr是数组名,可以根据自己的需求制定名字。

3.3 二维数组的初始化

二维数组创建时,我们给他们设置一些初始值,这个过程我们称为二维数组的初始化。

3.3.1 不完全初始化
int arr1[3][5] = {1,2};
int arr2[3][5] = {0};

3.3.2 完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

3.3.3 按照行初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};

3.3.4 初始化的省略
int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7};
int arr7[][5] = {{1,2}, {3,4}, {5,6}};

3.4 二维数组下标

类比一维数组,下标在数组中的功能是强大的,那我们应该如何使用下标来确定特定的数组元素呢?二维数组是有行和列的(即下标),只要锁定了行和列就能唯一锁定数组中的一个元素。

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

C语言规定,二维数组的行是从0开始的,列也是从0开始的,如下所示:

图中最右侧绿色的数字表示行号,第一行蓝色的数字表示列号,都是从0开始的,比如,我们说第二行第四列,我们就可以快速定位到数组元素7。

3.5 二维数组的输入和输出

参考一维数组的输入和输出,二维数组的变更就是多了一个下标值的判断,即嵌套一次循环,具体实现方式如下:

#include <stdio.h>
int main()
{int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};int i = 0;//遍历⾏//输⼊for(i=0; i<3; i++) //产⽣⾏号{int j = 0;for(j=0; j<5; j++) //产⽣列号{scanf("%d", &arr[i][j]); //输⼊数据}}//输出for(i=0; i<3; i++) //产⽣⾏号{int j = 0;for(j=0; j<5; j++) //产⽣列号{printf("%d ", arr[i][j]); //输出数据}printf("\n");}return 0;
}

3.6 二维数组在内存中的存储

同样地,我们也可以通过对二维数组元素地址的打印来剖析他在内存中的存储方式:

观察输出的结果,我们可以发现每一个内部的元素都是相邻的,地址之间相差4个字节(int类型的空间大小),跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是相差4个字节,所以在二维数组中的每个元素也是连续存放的,这是数据结构中的顺序存储结构典型表现形式。

附:一些小tips(晚些更新~)

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

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

相关文章

【AI生成+补充】高频 hql的面试问题 以及 具体sql

以下是高频HQL面试题及对应SQL示例&#xff0c;涵盖核心语法、优化技巧和典型场景&#xff0c;可直接用于面试准备&#xff1a; 一、基础操作与DDL 1. 创建分区表 & 动态插入分区 sql -- 创建外部分区表&#xff08;按日期分区&#xff09; CREATE EXTERNAL TABLE logs…

开源 Arkts 鸿蒙应用 开发(十七)通讯--http多文件下载

文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发&#xff0c;公司安排开发app&#xff0c;临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 Arkts …

Cloudflare Tunnel 使用SAAS回源加速配置教程

在使用 Cloudflare Tunnel 时,通过“主域名+加速域名”的联动配置,既能隐藏内网 IP,又能优化访问速度。本文以实际部署场景为例(主域名 zhuyuming.dpdns.org、加速域名 jiasu.dpdns.org),带你一步步完成内网服务穿透(以 192.168.1.6:5555 网页服务为例),实操性强,可直…

C++实战

Ref deepwiki vuecruddllamma.cpp 目标 计划实现一个C项目&#xff0c;前端用vue&#xff0c;后端用C和llama.cpp。实现可以进行逻辑功能和AI推理。

dify 调用本地的 stable diffusion api生成图片的工作流搭建

Dify调用本地Stable Diffusion API的工作流搭建指南 核心架构 #mermaid-svg-ce029i4XFKrDzRgU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ce029i4XFKrDzRgU .error-icon{fill:#552222;}#mermaid-svg-ce029i4XFK…

【Web后端】Django、flask及其场景——以构建系统原型为例

一、Django 和 Flask 简介 Django 是一个高级 Python Web 框架&#xff0c;提供了完整的“开箱即用”功能&#xff0c;包括 ORM、认证、管理后台等&#xff0c;便于快速开发安全且可维护的网站。Flask 是一个轻量级 Python Web 框架&#xff0c;核心功能比较简单&#xff0c;但…

飞算JavaAI:从智能调度到出行服务的全链路技术升级

免责声明&#xff1a;此文章所有内容都是实验测试数据 目录一、智慧交通核心场景的技术突破1.1 交通态势感知与智能预警系统1.2 公共交通智能调度系统1.3 一体化出行服务系统二、智慧交通系统效能升级实践2.1 交通数据中台构建结语&#xff1a;重新定义智慧交通技术边界一、智慧…

vscode的wsl环境,ESP32驱动0.96寸oled屏幕

注意大小写&#xff0c;wsl&#xff08;也就是linux环境&#xff09;严格区分大小写。有帮助记得订阅专栏点赞&#xff0c;当前不定期持续更新。 一、文件夹格式&#xff1a; project/ # 项目根目录 ├─ main/ # 主程序文件夹 │ ├─ mai…

CodeBuddy AI Coding 企业场景落地实践与思考

&#x1f449;目录1 引言2 诊断团队研发流程3 选择合适的 AI CODING 工具4 团队 AI 研发流程落地实践5 全面 CodeBuddy &#xff0c;深入 CodeBuddy6 诚邀共建在 AI 浪潮席卷全球的今天&#xff0c;AI CODING 已经不是企业研发团队的可选项&#xff0c;而是必选项。如果你是企业…

windows下hashcat使用gpu破解execl打开密码

需要的软件 1.hashcat &#xff1a;https://hashcat.net 2.john the ripper &#xff1a;https://www.openwall.com 获取execl加密文件的Hash PS G:\dl\john-1.9.0-jumbo-1-win64\john-1.9.0-jumbo-1-win64\run> python .\office2john.py .\test6.xlsx test6.xlsx:$office$*…

SpringCloud -- Nacos详细介绍

5. Nacos 5.1 Nacos介绍 Nacos 可以理解为微服务的“电话簿 遥控器”。它是阿里巴巴开源的一个核心工具&#xff0c;主要解决微服务架构中的两大问题&#xff1a; 5.1.1 服务注册与发现&#xff08;电话簿&#xff09; 服务注册&#xff1a;当某个微服务&#xff08;比如“订单…

【狂热算法篇】探寻图论幽径之SPFA算法:图论迷宫里的闪电寻径者(通俗易懂版)

​​​​​本篇带大家探究的是SPFA算法&#xff1b;从基本理解&#xff0c;画图分析展示&#xff0c;再到最后的代码实现&#xff0c;以及为何要这样实现代码&#xff0c;等一些细节问题做解释&#xff0c;相关题型应用&#xff0c;非常值得哟&#xff0c;尤其是刚入门的小白学…

webrtc网页一对一通话

基于flutter-webrtc-server做的更改&#xff0c;只使用网页实现语音和视频一对一通话&#xff0c;不支持多对多。 项目地址: https://github.com/chging/rtc-server

Java调用bat执行python脚本

1、问题概述&#xff1f;在windows环境中可以通过Java调用bat执行文件&#xff0c;从而调用python脚本&#xff0c;使用起来方便。2、实现方式&#xff1f;2.1、核心代码bat文件可以在任意位置//获取文件在项目中的文职 String batFilePathSystem.getProperty("user.dir&q…

JavaWeb 欢迎页设置详解

JavaWeb 欢迎页设置详解 欢迎页&#xff08;Welcome Page&#xff09;是用户访问 Web 应用根目录时自动展示的默认页面。在 JavaWeb 中有多种配置方式&#xff1a;一、配置方式 1. 通过 web.xml 配置&#xff08;传统方式&#xff09; <web-app><!-- 配置欢迎页列表 -…

反射和类加载机制

一 类加载机制 1.1 加载机制简介 Java程序从编写到运行这个过程大致可以分为两个阶段&#xff1a;编译阶段和运行阶段。 编译阶段指的是&#xff0c;java源代码文件**(*.java)被java编译器&#xff08;javac&#xff09;编译成字节码文件(*.class)**的过程。这个过程不需要直接…

在CentOS 7 上安装 MySQL 数据库

文章目录前言一、使用官方 MySQL 仓库安装 MySQL1.1 下载并安装 MySQL 官方 YUM 仓库1.2 安装 MySQL YUM 仓库1.3 安装 MySQL1.3.1 补充&#xff1a;1.4 启动 MySQL 服务1.5 设置 MySQL 服务开机启动1.6 获取临时 root 密码1.7 配置 MySQL1.7.1 注意事项1.8 完成安装二、使用默…

Linux:套接字

从进程的视角来看&#xff0c;网络通信就是一个主机上的进程和另外一个主机上的进程进行信息传递&#xff0c;因此对于操作系统而言&#xff0c;网络通信就是一种进程间通信的方式。不过这种进程间通信有特殊之处&#xff1a;同一台主机下可以通过进程ID来标识一个唯一的进程&a…

Android init.rc详解3

关于Android Init的详解&#xff0c;关于Action&#xff0c;Service&#xff0c;Trigger的请参考Android init.rc详解1&#xff0c;关于Options的请参考Android init.rc详解2&#xff0c;本章将介绍常见的Commands。 1 Commands bootchart [start|stop] 启动或停止bootcharti…

Sentinel原理之规则管理

文章目录1. 基础知识2. 数据源使用2.1 RedisDatasource2.2 ZookeeperDatasource1. 基础知识 流量控制规则&#xff08;FlowRule&#xff09;&#xff1a; 阈值类型grade&#xff1a; 0&#xff08;并发线程数&#xff09;&#xff1a;限制同时处理请求的线程1&#xff08;QPS…