C语言基础之——数组

前言:本篇文章,我们将对一维数组,和二维数组进行展开式的讲解,并进行实际应用。

目录

一.一维数组

1.一维数组的创建和初始化

(1)数组的创建

(2)数组的初始化

 2.一维数组的使用

3.一维数组在内存中的存储

二.二维数组

1.二维数组的创建与初始化

(1)数组的创建

(2)数组的初始化

 2.二维数组的使用

 3.二维数组在内存中的存储

三.总结


一.一维数组

1.一维数组的创建和初始化

数组是一组相同类型元素的集合。

(1)数组的创建

创建方式:

type_t        arr_name[const_n];

type_t         是数组的元素类型

[const_n]         是一个常量或常量表达式,用来指定数组的大小

例如我们创建int类型和char类型的数组: 

int arr1[5];

int arr2[2+3];

char arr3[10];

[ ]内一定要是一个常量或者常量表达式。那么我们再来看一个数组创建:

int a = 5;

int arr[a];

上述数组的创建可以被允许吗???事实上这牵扯到C语言的版本问题。

C99之前,数组的大小只能用常量指定,但是在C99之后引用了变长数组的概念,数组的大小便可以用变量来指定了。

但是博主现在所使用的VS2019,以及VS2022都是不支持变长数组的

(2)数组的初始化

初始化是指,在数组创建的同时给数组输入一些合理的初始值。 

int arr[5];//已知数组大小时,可以只创建而不初始化

int arr1[10] = {1,2,3};//不完全初始化,剩余元素默认初始化为0

int arr2[] = {1,2,3,4};//创建大小未知的数组时,必须初始化,默认大小为元素个数

int arr3[5] = {1,2,3,4,5};//规范初始化,元素个数与数组大小一致

char arr4[3] = {'a',98,'c'};//字符初始化要用单引号,如果给的是数字,则存在数组里的实际是数字所对应的ASCII码值所对应的字符,例如98对应字符'b',所以实际存进数组的是字符'b'

char arr5[] = {'a','b','c'};//常规字符初始化,不满同样补0

char arr6[] = "abcdef";//直接输入字符串时,用双引号

如上,数组的初始化化有很多种方法,其中值得注意的是,arr5和arr6两种字符数组的初始化,其中arr5是单个字符的输入,arr6是字符串整体的输入,这样arr6便会比arr5多输入一个'\0'。

 2.一维数组的使用

对数组的操作,则是通过下标引用操作符 '[ ]' 来实现。

如上图我们可以看到,数组中元素的实际顺序是从0开始的,也就是说,假如我们要操作数组的第5个元素,那就要用arr[4],而这个'4'我们则称为是数组元素的下标

这里我们定义了一个char型的数组,char型数组也可以接收数字,只不过是想要打印出数字就必须用到'%d'

 如果我们想把数组的全部元素打印出来,只需要用到for循环

循环打印数组元素时,这里有一个陷阱,那就是我们的循环变量'i'是数字元素的下标,而数组元素的下标是元素的实际顺序减1,所以这里的'i'要从0开始,并且到9结束,所以限制条件是i < 10,而不是i <= 10否则就会打印出多余的错误的结果,造成数组越界

 同时我们也可以通过数组元素下标来对其值进行修改:

 如上,我们将'5'改成'1'

3.一维数组在内存中的存储

#include<stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int i = 0;arr[4] = 1;for (i = 0; i < 10; i++){printf("&arr[%d] = %p\n",i,&arr[i]);}return 0;
}

这里给大家补充一个小知识点,当我们要打印一个数据所存放的地址时,要用到'%p'。

 由此我们可以看出,随着数组下标的增长,元素的地址也在有规律的增长,每个地址直接相差4个字节,而这正是一个int型数据所占用的字节数。因此我们可以得出结论:

数组在内存中是连续存放的

二.二维数组

二维数组与一维数组的区别并不大,下面我们就来具体介绍一下二维数组。

1.二维数组的创建与初始化

(1)数组的创建

int arr[3][4];

char arr[4][5];

double arr[5][6];

如果一维数组只是一条直线,那么二维数组就是一个矩形,第一个[]代表行,第二个[]代表列

(2)数组的初始化

int arr[3][4] = {1,2,3,4,5,6,7};//不完全初始化,会根据行数列数依次填充,不满补0

int arr1[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//不规范初始化

int arr2[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//规范初始化,每一行用一个大括号

int arr3[3][4] = {{1},{2,3},{4,5,6}};//不完全初始化,每一行空缺的位置补0

int arr4[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//省略行数初始化,会根据{}数来默认行数

int arr5[3][] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//省略列数初始化,不允许,会报错

 2.二维数组的使用

二维数组的使用同样是通过下标。

#include<stdio.h>
int main()
{int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };printf("%d", arr[2][3]);return 0;
}

假如我们要打印这个二维数组的元素12,那么我们就要找到它所在的位置,如下图所示为2行3列 

 那么如果我们要遍历整个数组又该怎么办呢???

很简单,只需要用到嵌套循环便可:

#include<stdio.h>
int main()
{int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 4; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

外层循环来控制行数内层循环来控制列数,这样便可以轻松实现二维数组的遍历,如果我们希望打印出来的格式为3行,那么我们就要在内层循环结束时输出一个'\n'来换行

 3.二维数组在内存中的存储

#include<stdio.h>
int main()
{int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 4; j++){printf("&arr[%d][%d] = %p\n",i,j, &arr[i][j]);}}return 0;
}

我们同一维数组一样来看看二维数组是怎么在内存中存储的:

 我们能够看出,二维数组的元素存储在内存中也是连续的,每一行的末尾与下一行的开头相连

事实确实如此,小伙伴们可不要理所当然的以为二维数组在内存中就是分行存放的,分行只是我们想象中的二维数组的具象化,但其实在内存中并不是。

二维数组的元素同样也是随着下标的增长,内存不断增加

三.总结

数组的讲解到这里就要结束啦,喜欢博主文章的小伙伴们不要忘记一键三连哦!

我们下期再见!

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

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

相关文章

什么是负载均衡

前提概述 关于负载均衡&#xff0c;我会从四个方面去说 1. 负载均衡产生的背景 2. 负载均衡的实现技术 3. 负载均衡的作用范围 4. 负载均衡的常用算法 负载均衡的诞生背景 在互联网发展早期&#xff0c;由于用户量较少、业务需求也比较简单。对于软件应用&#xff0c;我们只需要…

Django(3)-创建第一个数据模型-ORM映射

数据库配置 根目录下settings.py 。这是个包含了 Django 项目设置的 Python 模块。 通常&#xff0c;这个配置文件使用 SQLite 作为默认数据库。如果你不熟悉数据库&#xff0c;或者只是想尝试下 Django&#xff0c;这是最简单的选择。Python 内置 SQLite&#xff0c;所以你无…

JavaScript函数调用其他函数

在JavaScript中&#xff0c;函数可以调用其他函数。这通常被称为函数组合&#xff0c;它允许你通过将较简单的函数组合在一起来创建更复杂的功能。 例如&#xff1a;还是以之前的水果加工举例&#xff0c;但是现在我们需要输出&#xff0c;这个苹果有几块&#xff0c;橘子有几块…

【Qt学习】02:信号和槽机制

信号和槽机制 OVERVIEW 信号和槽机制一、系统自带信号与槽二、自定义信号与槽1.基本使用student.cppteacher.cppwidget.cppmain.cpp 2.信号与槽重载student.cppteacher.cppwidget.cppmain.cpp 3.信号连接信号4.Lambda表达式5.信号与槽总结 信号槽机制是 Qt 框架引以为豪的机制之…

vue3+ts+uniapp小程序端自定义日期选择器基于内置组件picker-view + 扩展组件 Popup 实现自定义日期选择及其他选择

vue3ts 基于内置组件picker-view 扩展组件 Popup 实现自定义日期选择及其他选择 vue3tsuniapp小程序端自定义日期选择器 1.先上效果图2.代码展示2.1 组件2.2 公共方法处理日期2.3 使用组件 3.注意事项3.1refSelectDialog3.1 backgroundColor"#fff" 圆角问题 自我记…

软考A计划-系统集成项目管理工程师-项目风险管理-尾

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

windows系统服务器在不解锁屏幕不输入密码的前提下,电脑通电开机启动程序。

在控制面板中找到“管理工具”中的 “任务计划程序”&#xff0c;打开“任务计划程序”窗口。如图&#xff1a; 双击打开任务计划程序&#xff0c;空白出右键创建基本任务&#xff0c;或者点击最右侧的创建基本任务。 输入名称&#xff0c;点击下一步。 先选择计算机启动时&a…

2023年高教社杯 国赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

Android进阶之路 - EditText输入字体自适应

遇到这么一个需求&#xff1a;“控件宽度有限&#xff0c;随着输入内容&#xff0c;动态修改字体大小”&#xff0c;如果是你&#xff0c;只如何来实现&#xff1f;又有几种方式&#xff1f; 嗯&#xff0c;就是这么一个简单的需求&#xff0c;让我记录了俩篇blog Android进阶…

用docker-compose搭建LNMP

docker-compose搭建LNMP 一、compose 的部署1.Docker Compose 环境安装 二、编写Docker Compose1.准备依赖文件,配置nginx2.配置mysql3.配置php4.编写docker-compose.yml5.执行6.查看 一、compose 的部署 &#xff08;1&#xff09;公司在实际的生产环境中&#xff0c;需要使用…

商品搜索网:连接您与各类商品的桥梁

导语&#xff1a;在如今信息爆炸的时代&#xff0c;购物已经不再是传统的实体店购买&#xff0c;而是通过互联网实现的线上购物方式。而要实现高效的线上购物&#xff0c;商品搜索引擎则成为我们的得力助手。作为国内垂直的商品搜索之一&#xff0c;为中国用户提供全面的数码电…

【Qt专栏】实现单例程序,禁止程序多开的几种方式

目录 一&#xff0c;简要介绍 二&#xff0c;实现示例&#xff08;Windows&#xff09; 1.使用系统级别的互斥机制 2.通过共享内存&#xff08;进程间通信-IPC&#xff09; 3.使用命名互斥锁&#xff08;不推荐&#xff09; 4.使用文件锁 5.通过网络端口检测 一&#xf…

Linux 下 Mysql 的使用(Ubuntu20.04)

文章目录 一、安装二、使用2.1 登录2.2 数据库操作2.2.1 创建数据库2.2.2 删除数据库2.2.3 创建数据表 参考文档 一、安装 Linux 下 Mysql 的安装非常简单&#xff0c;一个命令即可&#xff1a; sudo apt install mysql-server检查安装是否成功&#xff0c;输入&#xff1a; …

使用kubeadm方式快速部署一个K8S集群

目录 一、环境准备 二、环境初始化 三、在所有主机上安装相关软件 1、安装docker 2、配置k8s的yum源 3、安装kubelet、kubeadm、kubectl 四、部署Kubernetes Master 五、加入Kubernets Node 六、部署CNI网络插件 七、测试k8s集群 一、环境准备 我的是CentOS7系统&am…

iOS App签名与重签名:从开发者证书到重新安装运行

前文回顾&#xff1a; iOS脱壳技术&#xff08;二&#xff09;&#xff1a;深入探讨dumpdecrypted工具的高级使用方法 iOS逆向&#xff1a;越狱及相关概念的介绍 在本文中&#xff0c;我们将详细介绍iOS应用的签名过程&#xff0c;包括开发者证书的种类、证书与App ID、Provisi…

利用 Apifox 的 Mock 功能模拟常见业务数据的最佳方法

Apifox 拥有强大的 Mock 功能&#xff0c;兼容 Mock.js 语法的同时还提供 Nunjucks 和自定义脚本支持&#xff0c;能够满足不同场景需求。 今天给大家分享一些常见业务场景的 Mock 使用技巧&#xff0c;当然&#xff0c;实现的方法不唯一。在开始之前&#xff0c;你需要将 Api…

【C++】list

list 1. 简单了解list2. list的常见接口3. 简单实现list4. vector和list比较 1. 简单了解list list的底层是带头双向循环列表。因此list支持任意位置的插入和删除&#xff0c;且效率较高。但其缺陷也很明显&#xff0c;由于各节点在物理空间是不连续的&#xff0c;所以不支持对…

Python项目开发案例————学生信息管理系统(附源码)

一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统&#xff0c;该系统可以帮助教师快速录入学生的信息&#xff0c;并且对学生的信息进行基本的增、删、改、查操作&#xff1b;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…

软件测试及数据分析处理实训室建设方案

一 、系统概述 软件测试及数据分析处理是软件开发过程中的一项重要测试活动&#xff0c;旨在验证不同软件模块或组件之间的集成与交互是否正常。综合测试确保各个模块按照设计要求正确地协同工作&#xff0c;以实现整个软件系统的功能和性能。以下是软件测试及数据分析处理的一…

SpringMVC程序开发

前言&#xff1a; &#x1f4d5;作者简介&#xff1a;热爱编程的小七&#xff0c;致力于C、Java、Python等多编程语言&#xff0c;热爱编程和长板的运动少年&#xff01; &#x1f4d8;相关专栏Java基础语法&#xff0c;JavaEE初阶&#xff0c;数据库&#xff0c;数据结构和算法…