【C语言初阶(五)】数组

❣博主主页: 33的博客❣
▶文章专栏分类: C语言从入门到精通◀
🚚我的代码仓库: 33的代码仓库🚚

目录

  • 1. 前言
  • 2.一维数组的概念
  • 3.一维数组的创建和初始化
    • 3.1数组的创建
    • 3.2数组的初始化
    • 3.3数组的类型
  • 4.一维数组的使用
    • 4.1数组下标
    • 4.2数组元素打印
    • 4.4数组元素输入
  • 5. 一维数组在内存中的存储
  • 6.sizeof求数组个数
  • 7.二维数组
    • 7.1 二维数组的创建
    • 7.2二维数组初始化
  • 8.二维数组的使用
    • 8.1二维数组的下标
    • 8.2 二维数组的打印
    • 8.3 二维数组的输入
    • 8.4二维数组在内存中的存储
  • 9. 总结

1. 前言

前面我们已经学习了分支和循环,这篇文章我们一起来学习新的知识—数组,数组是一个十分常见的知识,接下来就一起进入数组的学习吧!
本章重点

本篇文章主要介绍数组的概念,一维数组的创建的初始化,一维数组的使用,一维数组在内存中的存储,二维数组的创建和初始化,二维数组的使用等等。


2.一维数组的概念

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

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


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

3.1数组的创建

格式如下:

type arr_name[常量值];

type是指数组的类型,可以是:char、short、int等等。
arr_name是数组名,自定义。
[常量值] 常量值是用来定义数组的大小,自定义。

例如

int a[3];//定义了一个数组a长度为3

3.2数组的初始化

数组在创建的时候,我们需要得定义一些初始值,这种就称为数组的初始化。
那么数组该如何初始化呢?数组的初始化一般用大括号,将数据放在大括号内。数组的初始化又可以分为完全初始化和不完全初始化。
例如:

//完全初始化
int a[3]={1,2,3}
//不完全初始化
int a[5]={1}//第一个元素为初始化为1,其余默认初始化为0

3.3数组的类型

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

int a[3]={1}
char b[4]={'1'}

数组a的类型是int [3]
数组b的类型是char [4]


4.一维数组的使用

4.1数组下标

c语言中,数组下标是从0开始,假设数组的长度是n,那么数组的下标最大就是n-1.第1个数组元素可以写为a[0],第2个数组元素可以写为a[1],第3个数组元素可以写为a[2]…那么第n个数组元素就可以写为a[n-1]


4.2数组元素打印

如果要访问整个数组,该如何打印呢?接下来我们通过一段程序来实现

int main()
{
int arr[3]={1,2,3}int i=0;
for(i=0;i<3;i++){printf("%d",arr[i]);}
}

4.4数组元素输入

如果要从键盘中输入一个元素,存入数组中,那么又该如何实现呢?

int main()
{
int arr[3]={0}//默认初始化为0
int i=0;
for(i=0;i<3;i++){scanf("%d",&arr[i]);//从键盘中输入一个元素,存入数组arr中}
}

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

我们如果想要知道数组在内存中是如何存取的,我们可以通过打印数组中每个元素的地址来看看规律。

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

运行结果:
在这里插入图片描述
我们会发现a[0]到a[5]的地址依次增大,并且相邻两个数组元素相差4个字节,为什么是4个字节呢那是因为我们定义的元素类型为int类型,int类型的大小就是4个字节。我们就可以得出结论:数组在内存中是连续存放的,且随着下标的增大,数组地址也增大。


6.sizeof求数组个数

在遍历数组的时候,我们经常想知道数组的个数,就可以sizeof操作符来求。
例如:

int main()
{int arr[8] = {0};printf("%d", sizeof(arr));
}

结果:
在这里插入图片描述
个数应该是8个为什么返回32呢?其实是因为***sizeof计算的是数组所栈内存空间的总大小,单位为字节。***如果要计算数组的个数,只需要用 总内存空间/一个元素的内存

int main()
{int arr[8] = {0};printf("%d", sizeof(arr)/sizeof(arr[0]));
}

结果:
在这里插入图片描述
输出结果为8个


7.二维数组

概率:把一维数组作为数组的元素,那么就是二维数组。


7.1 二维数组的创建

定义二维数组格式如下:

type arr_name[常量值1][常量值2];
//例如
int a[3][5];//定义三行5列的数组

7.2二维数组初始化

例如

int arr1[2][3]={1,2,3,4,5,6};//完全初始化
int arr2[2][3]={1,2,3};//不完全初始化,其他值默认为0
int arr3[2][3]={{1,2,3},{4,5,6}};//按照行初始化
int arr4[][3]={1,2,3,4};//初始化的时候行可以省略,但是列一定不能省!!

8.二维数组的使用

8.1二维数组的下标

一维数组的访问需要下标,其实二维数组的访问也需要下标,二维数组是有行有列的,只要确定了行列就可以访问了。

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

如下图:
在这里插入图片描述
我们可以用arr[1][2]来表示6,我们可以用arr[][1]来表示2


8.2 二维数组的打印

int main()
{
int arr[2][3]={1,2,3,4,5};
int i = 0;
int j = 0;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{printf("%d ",arr[i][j]);
}
printf("\n");
}
return 0;
}

8.3 二维数组的输入

前面我们已经学习了一维数组的输入,那么二维数组该怎么输入呢?其实和一维数组很类似。
如下:

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

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

在上述内容中我们已经得出结论:一维数组在内存中是连续存放的,且随着下标的增大,数组地址也增大,那二维数组是否也存在这样的规律呢?
我们来进行验证:

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

结果如下:
在这里插入图片描述

我们发现和一维数组一样,二维数组在内存中是连续存放的,且随着下标的增大,数组地址也增大。


9. 总结

本篇文章主要介绍数组的概念,一维数组的创建的初始化,一维数组的使用,一维数组在内存中的存储,二维数组的创建和初始化,二维数组的使用,有想法的同学可以通过本篇文章的知识来完成二分查找,两边向中间输入等关于c语言的学习博主就先告一段了,接下来将进行java的学习,如果同学们想继续深入学习,可以去看看其他博主的文章。


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

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

相关文章

解决游戏程序一运行就退出的问题

正文&#xff1a; 在游戏开发过程中&#xff0c;我们可能会遇到程序一运行就立即退出的情况。这种情况通常是由于程序中的某些逻辑错误或初始化问题导致的。 下面我们将分析可能的原因&#xff0c;并提供一些解决方案。 目录 正文&#xff1a; 原因分析&#xff1a; 解决方案…

媒体发稿:澳门媒体发稿7个流程

推广平台澳门是一个重要的度假旅游娱乐终点&#xff0c;都是媒体领域热议的话题。对于澳门的媒体发稿营销推广要求&#xff0c;大家提供了一个简单易用的套餐系统软件&#xff0c;帮助大家在澳门媒体上发表推广文章。下面我们就根据7个阶段&#xff0c;详解构建这一套餐推广平台…

Git版本管理--远程仓库

前言&#xff1a; 本文记录学习使用 Git 版本管理工具的学习笔记&#xff0c;通过阅读参考链接中的博文和实际操作&#xff0c;快速的上手使用 Git 工具。 本文参考了引用链接博文里的内容。 引用: 重学Git-Git远程仓库管理_git remote add origin-CSDN博客 Git学习笔记&am…

springboot“财来财往”微信小程序

摘 要 相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低理财公司的运营人员成本&#xff0c;实现了“财来财往”的标准化、制度化、程序化的管理&#xff0c;有效地防止了“财来财往”的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能…

通义灵码(智能编码助手)

文章目录 前言一、介绍二、安装三、使用3.1 快捷键3.2 根据注释生成代码3.3 解释代码3.4 生成单元测试3.5 生成代码注释3.6 生成优化建议 四、异常报错排查五、设置总结 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多…

单片机FLASH深度解析和编程实践(上)

本篇文章主要针对单片机FLASH编程和FLASH基本原理进行学习分享。以STM32单片机作为实例进行编程实训。 关于FLASH操作的相关寄存器及编程&#xff0c;大家可以参考下一篇文章: 单片机FLASH深度解析和编程实践&#xff08;下&#xff09;-CSDN博客 目录 一、STM32编程方式 二、…

MySQL数据导入的方式介绍

MySQL数据库中的数据导入是一个常见操作&#xff0c;它涉及将数据从外部源转移到MySQL数据库表中。在本教程中&#xff0c;我们将探讨几种常见的数据导入方式&#xff0c;包括它们的特点、使用场景以及简单的示例。 1. 命令行导入 使用MySQL命令行工具mysql是导入数据的…

【Stable Diffusion】入门-04:不同模型分类+代表作品+常用下载网站+使用技巧

目录 1 模型简介2 模型文件构成和加载位置2.1 存储位置2.2 加载模型 3 模型下载渠道3.1 HuggingFace3.2 Civitai 4 模型分类4.1 二次元模型4.2 写实模型4.3 2.5D模型 1 模型简介 拿图片给模型训练的这个过程&#xff0c;通常被叫做“喂图”。模型学习的内容不仅包括对具体事物…

微信小程序调试、断点调试

1、wxml 查看对应的页面组件 2、console面板可以用来打印信息 3、sources 用来断点调试 4、network面板用来调试接口 5、storage面板 可以查看每个key对应的value内容&#xff0c;这些数据在用户使用小程序时被持久化保存在本地。

OpenCV4.9.0开源计算机视觉库在 Linux 中安装

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 环境变量参考 下一篇&#xff1a;将OpenCV与gcc和CMake结合使用 引言&#xff1a; OpenCV是一个开源的计算机视觉库&#xff0c;由英特尔公司所赞助。它是一个跨…

Spark-Scala语言实战(2)(在IDEA中安装Scala,超详细配图)

之前的文章中&#xff0c;我们学习了如何在windows下下载及使用Scala&#xff0c;但那对一个真正想深入学习Scala的人来说&#xff0c;是不够的&#xff0c;今天我会给大家带来如何在IDEA中安装Scala。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的…

python基础——字符串的常见操作方法【下标索引,index,count,len,replace,split,strip】

&#x1f4dd;前言&#xff1a; 字符串是一种有序的&#xff0c;允许重复字符串存在的&#xff0c;不可修改的序列 这篇文章主要总结一下python中有关字符串的部分相关知识&#xff0c;以及字符串的常见操作方法&#xff1a; 1&#xff0c;和其他序列极其类似的操作方法 2&…