【C语言】数组(一维、二维数组的简单介绍)

数组(Array)

请添加图片描述

数组概念

数组是一组相同数据类型元素的集合,属于一种简单的数据结构,从中可以得到三个有效信息

  • 数组元素是同一数据类型的变量
  • 数组存放一个或者多个数据,但是数组元素个数不能为0
  • 数组中各元素可独立作为一个基本变量使用

注:数组分为一维数组和多维数组,多维数组一般是二维数组作为使用

请添加图片描述

一维数组

语法:

typed(类型说明符)  arr_name(数组名)[size(常量值)]例如:int nums[10];
  • 存放在数组的值被称为数组的元素,创建数组可以指向数组大小和数组的元素类型
  • 其中,[]下标引用操作符中size是用于指定数组的大小,也是数组元素的个数

一维数组的初始化

规定:数据放在大括号中(大括号“ { }”、中括号“ [ ]”、小括号“ ()”以及比较少用的括线“─”)

主要有两种初始化:完全初始化和不完全初始化

//完全初始化
int nums[3]={1,2,3};
//不完全初始化
int nums[6]={1};//第一个元素初始化位1,剩余元素默认初始化为0
//变长数组的初始化
数组的大小可以不填,默认为后边存放元素个数
int nums[]={1,2,3};

一维数组的使用

一维数组可以存放数据,存放数据是为了更好的处理数据

数组下标

规定了数组是有下标,下标是从0开始的,假设数组有n个元素,那么最后一个元素的下标是n-1,下标就相当于数组元素的编号,可用通过下标去访问数组中任意元素

请添加图片描述

问题:那么数组下标为什么是从0开始呢?是老美的习惯吗?

  • 从数组存储的内存模型来看,下标比较确切的定义是“偏移”,如果用a来表示数组的首地址,那么a[0]就表示偏移量为0的位置(这些需要配合指针那一块知识点来理解)。

在上边提及到了个下标操作符[],这个跟解引用操作符*效果是一样的,数组的本质是指针,在使用数组的时候编译器是转换为指针再进行使用的(在后面指针学习当中)

有了这个下标引用操作符,我们可用轻松的访问到数组的元素,主要是通过下标访问下标对应的数字,比如nums[1]==2;

简单数组的运用

数组是一组相同数据类型元素的集合,现在要求循环输入,输出(打印)数组的元素

int main()
{int arr[5]={1,2,3,4,5};for(int i=0;i<5;i++){scanf("%d",&arr[i]);//数组输入}for(int j=0;j<5;j++){printf("&d ",arr[i]);//数组输出}
}

问题:万一输出大于数组大小会怎么样呢?
1.一般来说会越界访问,但是编译器可能会报错,不是说这个越界问题可以不去管,它就是像一个逃犯一样,只是还没有逮捕到他(在可能越界的地方设置数值,查看数据是否被修改)
2.可能出现死循环,出现这样子的现象跟地址有关系(在指针那一块会涉及)

数组的元素地址

这里简单知道下数组是物理结构连续,逻辑结构连续的一种数据结构,这里的物理结构连续是指地址编号连续,不妨试一试打印数组元素的地址

int main()
{int nums[3]={1,2,3};for(int i=0;i<3;i++){printf("nums[&d]地址==%p\n",&nums[i]);}return 0;
}

请添加图片描述

从结果上来看,数组随着下标的增长,地址是由小到大变化的,并且每两个相邻元素之间相错4(一个整形类型是4个字节)。可以得出数组在内存中连续存放,物理结构连续。

二维数组

语法:

typed(类型说明符)  arr_name(数组名)[常量值1][常量值2]例如:int nums[3][5];
上面反映的信息:
1.数组有三行
2.数组每一行有五个元素
3.int表示数组每个元素的类型,nums是数组的名字

小插入:数组名是数组首元素的地址,二维数组实际是由多个一维数组组成,将多个一维数组看成二维数组的元素,那么二维数组的数组名就是第一个一维数组的地址

二维数组的初始化

跟一维数组初始化一样,需要使用大括号初始化数值

主要有三种初始化:完全初始化和不完全初始,按照执行初始化

//完全初始化
int nums[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
//不完全初始化
int nums[3][5]={0};
//按照执行初始化
int nums[3][5]={{1,2}.{3,4},{5,6}};
那么不完全初始化和按照执行初始化,剩余元素没有被初始化部分默认初始化为0
//初始化时可以省略行,但是不能省略列
int nums[][3]={1,2,3,4};
会根据数组中个数按照一列三个来分行,那么现在就是二行三列,其中第二行还是4 0 0

二维数组输入和输出(跟一维数据大差不差)

int main()
{int nums[2][3]={1,2,3, 4,5,6, 7,8,9};for(int i=0;i<2;i++)//产生行号{for(int j=0;j<3;j++)//产生列号{scanf("%d",&nums[i][j]);//输入数据}}for(int i=0;i<2;i++)//产生行号{for(int j=0;j<3;j++)//产生列号{printf("%d",nums[i][j]);//输出数据}printf("\n");}
}
从这里可以看出外层循环是产生行号,而内层循环是产生列号。一次外层循环可以经行多次内层循环,跟排队一样,第一篇,第二排。

二维数组的元素地址

既然通过打印一维数组地址得出数组在内存中存储方式,那么二维数组也是数组,是否满足这个存储方式呢?

int main()
{int nums[2][3]={0};for(int i=0;i<2;i++){for(int j=0;j<3;j++){printf("nums[%d][%d]地址 = %p\n",i,j,&nums[i][j]);}}return 0;
}

请添加图片描述

结果:从输出的结果来看,每⼀⾏内部的每个元素都是相邻的,地址之间相差4个字节,跨⾏位置处的两个元素(如:arr[0] [4]和arr[1] [0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。

变长数组

前文:在C99标准之前,C语言在创建数组时,数组大小只能指定常量,常量表达式或者初始化数据,可省略数组大小

导致了数组大小是固定,不够灵活去满足日常的需要。

C99中给⼀个变长数组(variable-length array,简称 VLA)的新特性,允许我们可以使用变量指定数组⼤⼩。

语法:

int N=数值;
//scanf("%d",&N);
int nums[N];

变长数组的根本特征,数组长度根据程序中控制变量大小决定数组大小只有在程序运行时才能确定,导致变长数组不能初始化

  • 好处:在创建数组时,不需要为数组大小开辟太大空间,防止空间不足。变长数组可以在程序运行时为数组分配精确的长度
  • 注意:数组的大小一旦确定就不能再改变,所以数组的大小不是可变的,只是用一个变量指向数组的元素个数

遗憾的是在VS2022上,虽然支持大部分C99的语法,没有支持C99中的变⻓数组,没法测试。但是在OJ里面是支持使用

字符串在数组中应用(需要为\0多开辟一字节空间)

如果使用一维字符数组处理字符串,本质上就是以空字符结尾的字符数组

空字符

空字符就是 NULL,即’\0’。一个字符串可看成结尾为’\0’的不定长的一维字符数组

将字符串分解成每一个字符对待
“a”等同于’a’,’\0
“Hello!\n”等同于’H’,’e’,’1’,’1’,’o’,’!’,’\n’,’\0 

字符串的初始化

其中字符串也可经行变长数组初始化处理

字符数组可以由字符一个个存储在数组中,也可以用字符串(字符串常量)的形式储存(其中如果是字符串常量,编译器会自动加入’\0’,这个表示字符串的结尾标记)

char nums1[]={'a','b'};
char nums2[]={"hellow"};-->char nums2[]="hellow";//也可以这样子

字符串的输入–>涉及到scanf的知识点

%s字符串型格式符,可以使用它输入一个字符串

char s1[20];
scanf("%s",s1);

注意:数组名是首元素的地址,同时字符串的打印,如果得到字符串某个位置的地址,屏幕会自动打印后边的数据
因为%s不会包含空格和换行,所以无法用来读取多个单词,除非多个%s⼀起使⽤,导致了scanf不适合读取含有空格的字符串,可以采用单字符输入

单字符的输入

用 scanf输入字符或字符串时,遇到空格或回车结束。这不便于文字处理,一般用 getchar函数输入单字符。

int main()
{char ch;//定义一个字符类型变量ch=getchar();//到后面会分享这个函数
}

存储数据在数组中,总要知道数组存储多大的大小吧,如何下手呢?在指针章节结尾的时候,将配合面试喜欢出的面试题进行统一的学习!!!
请添加图片描述

感谢各位耐心观看!希望这篇关于数组的文章对你在学习C语言的道路上有所帮助!!!

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

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

相关文章

【Web APIs】DOM节点

目录 1.节点操作 1.1DOM节点 1.2查找节点 1.2.1父节点查找 1.2.2子节点查找 1.2.3兄弟节点查找 1.3增加节点 1.4克隆节点 1.5删除节点 2.时间对象 2.1实例化 2.2时间对象方法 2.3时间戳 3.重绘和回流 1.节点操作 1.1DOM节点 DOM节点&#xff1a;DOM树中的每一个…

CHAT~(持续更新)

CHAT&#xff08;持续更新&#xff09; 实现一个ChatGPT创建API设计页面布局业务操作技术架构 编码其他 实现一个ChatGPT 创建API 最简单也最需要信息的一步 继续往下做的前提 此处省略&#xff0c;想要获取接口创建方式联系 设计 页面布局 按照官网布局 业务操作 注册登…

绝地求生:PUBG七周年庆典开启!参与周年话题投稿赢丰厚奖励

为庆祝七周年&#xff0c;闲游盒PUBG官方准备了众多活动与奖励&#xff0c;一起在庆典中创造难忘的回忆吧&#xff01;七周年庆典期间游玩PUBG&#xff0c;参与 #乐在7中鸡味无穷# 周年话题投稿&#xff0c;即有机会赢取魔力甜心萨莉套装 2奖励。 参与方式 在小黑盒PUBG社区中…

贪心算法相关题目

文章目录 1. 什么是贪心&#xff1f;2. 分发饼干3. 摆动序列4. 最大子数组和5. 买卖股票的最佳时机 II6. 跳跃游戏7. 跳跃游戏 II8.K 次取反后最大化的数组和9.加油站10.分发糖果11.柠檬水找零 1. 什么是贪心&#xff1f; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而…

第1篇:Mysql数据库表结构导出字段到Excel(一个sheet中)

package com.xx.util;import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.sql.*; import java.io.*;public class DatabaseToExcel {public static void main(String[] args) throws Exception {// 数据库连接配置String u…

Less-1(sqlmap手工注入攻击)--sqli

第一步&#xff1a;判断他是什么sql注入&#xff1f; 1 报错 1 and 12 -- 错误结果(--表示注释符) 1 and 11 -- 正确结果 第二步&#xff1a;判断返回字段数 ?id1 order by 3-- 正确显示结果 ?id1 order by 4--当列数为4时开始报错&#xff0c;所以只有三列 注&#xf…

github的2FA问题

文章目录 问题描述方式一&#xff1a;chrome浏览器插件 问题描述 方式一&#xff1a;chrome浏览器插件 1、 第一步 安装插件&#xff1a;Authenticator 2、 第二步 打开github验证界面&#xff0c;并点击该插件

蓝桥杯-模拟-航班时间

题目 思路 去时到达外地的时间-去时离开本地的时间 时区差时飞行时间 回时到达本地的时间-回时离开外地的时间 -时区差时飞行时间 故二者加起来即可得到飞行时间 代码 # 去时到达外地的时间-去时离开本地的时间 时区差时飞行时间 # 回时到达本地的时间-回时离开外地的时间 -…

时间对比投资:衡量5天与10天六西格玛绿带培训的价值

六西格玛绿带培训专为希望提高其业务流程改进技能的专业人员设计。绿带培训通常涵盖六西格玛的基础知识、DMAIC(定义、测量、分析、改进、控制)方法论、以及各种质量管理工具和技巧。绿带受训者通常在他们的工作职责中负责领导小型项目或作为黑带项目团队的成员&#xff0c;下面…

小兴教你做平衡小车-蓝牙模块JDY-31介绍

文章目录 1 前言2 模块资料下载3 模块介绍3.1 模块特点3.2 模块相关指令介绍3.3 指令学习3.3.1 查看版本号3.3.2 软复位3.3.3 查看模块的波特率3.3.4 修改模块的波特率3.3.5 蓝牙配对密码查看3.3.6 修改蓝牙配对密码3.3.7 广播名查询3.3.8 广播名修改3.3.7 恢复出厂配置3.3.8 串…

人工智能的春天:改变已然发生

以下文章来源&#xff1a;青岛日报 某种意义上说&#xff0c;这个春天属于人工智能&#xff08;AI&#xff09;。 继一年多前ChatGPT惊艳全球后&#xff0c;OpenAI再次放出“王炸”成果——视频大模型Sora&#xff1b;苹果放弃布局多年的造车计划&#xff0c;将ALL in AI&#…

MySQL数据库的事务

目录 1、事务的概念 2、事务的ACID特点 2.1 原子性 2.2 一致性 2.3 隔离性 2.3.1MySQL事务隔离级别 2.3.2事务隔离级别的作用范围 2.3.3 查询事务的隔离级别 2.3.4 设置事务的隔离级别 ​编辑 2.4 持久性 3、事务控制语句 3.1测试begin和commit&#xff08;开始…

SOC子模块---RTC and watchdog

RTC RTC大致执行过程&#xff1a; 对SOC 中的锁相环或者外部晶振的时钟进行计数&#xff1b;产生时&#xff0c;分&#xff0c;秒的中断&#xff1b;送给中断控制器&#xff1b;中断控制器进行优先权选择后送给cpu&#xff1b;Cpu执行中断服务程序&#xff1b;在中断服务程序…

python程序打包

目录 1. 命令2. 安装2.1 PyInstaller2.2 cx_Freeze(笔者未用过) 3. 打包示例3.1 在 pycharm 中执行3.2 若使用打包命令时报错3.3 路径问题 python打包成可执行文件&#xff0c;用于在没有Python环境的地方运行该程序&#xff0c;与qt打包类似。&#xff08;笔者写的qt打包地址&…

鸿蒙实战开发:【7日天气预报】

先来看一下效果 本项目界面搭建基于ArkUI中TS扩展的声明式开发范式&#xff0c; 数据接口是[和风&#xff08;天气预报&#xff09;]&#xff0c; 使用ArkUI自带的网络请求调用接口。 我想要实现的一个功能是&#xff0c;查询当前城市的实时天气&#xff0c; 目前已实现的功…

聚类算法之高斯混合模型聚类 (Gaussian Mixture Model, GMM)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 高斯混合模型&#xff08;GMM&#xff09;是统计模型中的一颗璀璨之星&#xff0c;它为数据提供了一种复杂而又强大的表示方法。在机器学习的许多…

并查集|1971. 寻找图中是否存在路径、684.冗余连接、685.冗余连接II

目录 并查集基础 1971. 寻找图中是否存在路径 684.冗余连接 685.冗余连接II 并查集基础 并查集主要有三个功能。 寻找根节点&#xff0c;函数&#xff1a;find(int u)&#xff0c;也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合&#xff0c;函数&#xf…

【深度学习】一文搞懂 如何计算图像数据集的RGB均值和方差(超详细的哦~)

计算图像数据集的RGB均值和方差 1、引言2、RGB均值和方差2.1 计算RGB均值和方差原因2.2 计算RGB均值和方差步骤2.3 代码实现2.3.1 TensorFlow计算RGB均值和方差2.3.2 PyTorch计算RGB均值和方差 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;帮个忙呀 小鱼&#xff1a;在…

了解Spring:Java开发的利器

Spring是一款开源的轻量级Java开发框架&#xff0c;旨在提高开发人员的效率和系统的可维护性。本文将介绍Spring的基本概念、使用优势、设计模式以及与Spring MVC和Spring Boot的关联。 什么是Spring&#xff1f; Spring是一款开源的轻量级Java开发框架&#xff0c;它由多个模…

STM32之HAL开发——HAL库框架介绍

HAL库外设设计思想 HAL库借鉴面向对象的设计思想&#xff0c;将外设驱动封装为对象。 HAL库使用主线 HAL使用的主要用在俩个地方&#xff0c;无外乎外设初始化以及外设的使用。想用好这两个功能&#xff0c;我们首先得对外设的封装有一定的了解。 句柄结构体 xx_HandleTypeDef…