c语言基础知识帮助理解(详解数组)

news2024/11/13 20:31:54

前面梳理完函数和递归的知识后,来进行数组知识的梳理

对函数有疑惑的同学,可以看我之前的文章:c语言基础知识帮助理解(详解函数)_总之就是非常唔姆的博客-CSDN博客 

c语言基础知识帮助理解(函数递归详解)_总之就是非常唔姆的博客-CSDN博客

想做点游戏的同学可以看:

三子棋小游戏(可改棋盘大小)_总之就是非常唔姆的博客-CSDN博客

探索经典游戏:扫雷小游戏_总之就是非常唔姆的博客-CSDN博客

希望能帮助到大家!

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

1.数组是什么

c语言中数组是一种数据结构,用于存储相同数据类型的一组元素。它提供了一种有序的方式来存储和访问多个数据项  

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

---------------------------------------------------------------------

2.数组的创建

数组的创建形式:type  name  [const_n]

其中:

  • type是数组的元素类型
  • name是数组名
  • const_n是一个常量表达式,用来指定数组的大小 

实例 :

需要注意的是:

C99 之前数组只能是常量指定大小,C99 之后引用了变长数组的概念,数组的大小是可以使用变量指定的,但是VS2022、2019 不支持C99的边长数组的

我自己是用的19,便不再讲解边长数组的相关内容。

int main()
{
	int arr1[10];
	int arr2[2 + 3];//这两种情况均未报错

	int x = 0;
	scanf("%d", &x);
	int arr3[x];//这种情况就是变长数组,因为2019不支持,便会报错
	return 0;
}

---------------------------------------------------------------------

3.数组的初始化 

数组的初始化是指在声明数组时为其赋予初始值 

初始化的方式:

  • 逐个元素初始化: 可以逐个为数组的每个元素赋值,用逗号分隔每个元素的值,并用大括号括起来。例如: 
    int arr[5] = {1, 2, 3, 4, 5};
  •  部分元素初始化: 可以只初始化数组的一部分元素,其余元素将被自动初始化为0。例如:
    int main()
    {
    	int arr[4] = { 1,2 };
    	for (int i = 0; i < 4; i++)
    	{
    		printf("%d ", arr[i]);
    	}
    	return 0;
    }

    结果如下:

  •  未指定大小初始化:没有指定数组的大小,但根据初始化的元素个数,编译器会自动推断数组的大小。例如:
int main()
{
	int arr[] = { 1,2 };
	printf("%d", sizeof(arr) / sizeof(arr[1]));//我们输出arr的大小
	return 0;
}

结果:

  • 字符串初始化: 可以使用字符串字面量来初始化字符数组。例如 
char str[] = "Hello";

需要注意字符串与字符数组的区别: 

1.字符串初始化后会在末尾自动添加一个\0作为字符串结束的标志

2.因为1的原因计算大小使会比看起来相同的字符数组大1,如下

int main()
{
	char arr1 []= "hello";
	char arr2[] = { 'h','e','l','l','o' };
	printf("%d\n", sizeof(arr1) / sizeof(arr1[1]));//我们输出arr1的大小
	printf("%d", sizeof(arr2) / sizeof(arr2[1]));//我们输出arr2的大小
	return 0;
}

 看起来二者均为hello,但是

我们可以清楚地看到多了一个\0在字符串后面,大小也如我所说:

---------------------------------------------------------------------

1.4一维数组的使用

对于数组的使用我们使用这个操作符: [] ,下标引用操作符。它其实就数组访问的操作符 

int main()
{
	//需要注意的是:数组下标是从0开始的
	char arr1 []= "hello";
	char arr2[] = { 'h','e','l','l','o' };
	//对应的下标:   0   1   2   3   4

	printf("%c", arr2[0]);//来输出一个h看看吧

	return 0;
}

 其他经常使用的对数组的处理:

int arr[]={1,2,4};
int sz=sizeof(arr)/sizeof(arr[0])-1;
for (i = 0; i <= sz; i++)//这就是数组的遍历,此为遍历输出,也可以遍历输入
	{
		printf("%d ", arr[i]);
	}

总结:

  • 数组是使用下标来访问的,下标是从0开始
  • 数组的大小可以通过计算得到, 利用此语句:intsz=sizeof(arr)/sizeof(arr[0]); 

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

接下来我们探讨数组在内存中的存储 ,利用%p来打印地址:

int main()
{
	int arr[10] = { 0 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);

	for (i = 0; i < sz; ++i)
	{
		printf("&arr[%d]的地址是: %p\n", i, &arr[i]);
	}
	return 0;
}

 仔细观察后我们发现:随着数组下标的增长,元素的地址,也在有规律的递增

 由此可以得出结论:数组在内存中是连续存放的

 


二.二维数组的创建和初始化 

1.二维数组的创建 

//二维数组创建
int arr1[1][4];
char arr2[3][5];
double arr3[2][3];

2.二维数组的初始化 

//二维数组初始化
int arr1[3][4] = {1,2,3,4};//这种初始化在一行满了后就换到下一行
int arr2[3][4] = {{1,2},{4,5}};//这种初始化已经规定一行的元素,不够的来填0
int arr3[][4] = {{2,3},{4,5}};//需要注意的是:二维数组如果有初始化,行可以省略,列不能省略

 通过调试来直接观察各个数组的元素情况

 ---------------------------------------------------------------------

3.二维数组的使用 

二维数组的使用也是通过下标的方式 

 二维数组我们完全可以看成矩阵:

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

我们可以看成: 

那样的话:通过对应的行号和列号的下标就能访问到对应的元素了 

那么二维数组的遍历:

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

  ---------------------------------------------------------------------

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

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

 每一个之间的差值是4(一个整形的大小):通过结果我们可以分析到,其实二维数组在内存中也是连续存储的

 三.数组越界

数组的下标是有范围限制的。
数组的下规定是从 0 开始的,如果数组有 n 个元素,最后一个元素的下标就是 n-1
所以数组的下标如果小于 0 ,或者大于 n-1 ,就是数组越界访问了,超出了数组合法空间的访问。
C 语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就 是正确的
所以我们在写代码时,要自己做越界的检查。
int main()
{
	int arr[8] = { 1,2,3,4,5,6,7,8 };
	for (int i = 0; i <= 10; i++)
	{
		printf("arr[%d]=%d\n",i, arr[i]);//当i等于8开始后就已经越界了,但是编译器没有报错
	}
	return 0;
}

可以看出,越界后数组储存的就是随机值了,所以还是要避免数组越界


 四.数组作为函数参数

1.数组名是什么?

数组名是数组首元素的地址。(有两个例外)

1. sizeof( 数组名 ) ,计算整个数组的大小, sizeof 内部单独放一个数组名,数组名表示整个数
组。
2. & 数组名,取出的是数组的地址。 & 数组名,数组名表示整个数组。

 除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。

2.数组传参

当数组传参的时候,实际上只是把数组的首元素的地址传递过去了,有时我们必须要在外面先知道长度后,再传参时把那个长度一起传过去 


希望本文对你理解和使用一维数组有所帮助。通过不断的练习和实践,你将能够熟练地使用一维数组,并将其应用于解决实际问题中。祝大家在C语言的学习和编程实践中取得进步! 

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

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

相关文章

类的6个默认成员函数 构造函数

类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生…

ruoyi-cloud-notes01

1、Maven中的dependencyManagement Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式。在dependencyManagement元素中声明所依赖的jar包的版本号等信息&#xff0c;那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。Maven会沿着父子层级向上寻找…

HCIP MPLS总结

一、MPLS--多协议标签交换 多协议&#xff1a;可以基于多种不同的3层协议来生成2.5层的标签信息&#xff1b; 包交换&#xff1a;包为网络层的PDU&#xff0c;故包交换是基于IP地址进行数据转发&#xff1b;就是路由器的路由行为&#xff1b; 原始的包交换&#xff1a;数据包…

STM32 CubeMX USB_CDC(USB_转串口)

STM32 CubeMX STM32 CubeMX 定时器&#xff08;普通模式和PWM模式&#xff09; STM32 CubeMX一、STM32 CubeMX 设置USB时钟设置USB使能UBS功能选择 二、代码部分添加代码实验效果 ![请添加图片描述](https://img-blog.csdnimg.cn/a7333bba478441ab950a66fc63f204fb.png)printf发…

分库分表概念、原理、拆分策略和实现技术讲解

文章目录 1.什么是分库分表2.分库分表拆分策略2.1 垂直拆分2.2 水平拆分 3.分库分表实现技术简介 1.什么是分库分表 分库分表的中心思想就是将数据分散存储&#xff0c;使得单一数据库/表的数据量变小来缓解单一数据库的性能问题&#xff0c;从而达到提升数据库性能的目的。 …

python中使用yt-dlp模块实现带进程条下载音视频

当代的互联网时代&#xff0c;视频内容的流行无疑是其中的重要组成部分。作为全球最大的视频分享平台&#xff0c;每天吸引着数以亿计的用户观看各种各样的视频内容。有时候&#xff0c;我们可能希望将某些喜欢的视频保存到本地进行观看&#xff0c;或者将它们用于其他用途。在…

406 · 和大于S的最小子数组

链接&#xff1a;LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; 题解&#xff1a;同向双指针 九章算法 - 帮助更多程序员找到好工作&#xff0c;硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 class Solution { public:/*** param nums: an array …

任务12、Quality指令加持,Midjourney生成电影级数码作品

12.1 任务概述 本次实验任务旨在帮助你掌握Midjourney AI绘画中的Quality指令。通过深入介绍Quality指令的概念和作用,我们将解释为什么它在绘画中至关重要。通过测试不同的Quality参数对绘画效果的影响,并提供实战演示,你将学会如何在Midjourney中设置Quality参数以达到更…

Spring 事务详解(注解方式)

目 录 序言 1、编程式事务 2、配置声明式事务 2.1 基于TransactionProxyFactoryBean的方式&#xff08;不常用&#xff0c;因为要为每一个类配置TransactionProxyFactoryBean&#xff09; 2.2 基于AspectJ的XML方式&#xff08;常用&#xff0c;可配置在某些类下的所有子…

⛳ StringBuffer and StringBuilder 处理字符串

目录 ⛳ StringBuffer and StringBuilder 处理字符串&#x1f3a8; 一&#xff0c;简介&#x1f3ed; 二&#xff0c;常用方法&#x1f69c; 三 &#xff0c;StringBugger&#x1f43e; 四&#xff0c;StringBuilder⭐ 五&#xff0c;StringBuffer和StringBuilder面试 ⛳ Strin…

【李宏毅机器学习·学习笔记】Tips for Training: Adaptive Learning Rate

本节课主要介绍了Adaptive Learning Rate的基本思想和方法。通过使用Adaptive Learning Rate的策略&#xff0c;在训练深度神经网络时程序能实现在不同参数、不同iteration中&#xff0c;学习率不同。 本节课涉及到的算法或策略有&#xff1a;Adgrad、RMSProp、Adam、Learning …

Qt应用开发(基础篇)——时间微调输入框QDateTimeEdit、QDateEdit、QTimeEdit

一、前言 QAbstractSpinBox是全部微调输入框的父类&#xff0c;这是一种允许用户通过点击上下箭头按钮或输入数字来调整数值的图形用户界面控件&#xff0c;父类提供了当前值text、对齐方式align、只读readOnly等通用属性和方法。在上一篇数值微调输入框中有详细介绍。 QDateTi…

【雕爷学编程】Arduino动手做(186)---WeMos ESP32开发板4

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

PyTorch深度学习实战(9)——学习率优化

PyTorch深度学习实战&#xff08;9&#xff09;——学习率优化 0. 前言1. 学习率简介2. 梯度值、学习率和权重之间的相互作用3. 学习率优化实战3.1 学习率对缩放后的数据集的影响3.2 学习率对未缩放数据集的影响 小结系列链接 0. 前言 学习率( learning rate )是神经网络训练中…

(十二)大数据实战——hadoop集群之HDFS高可用自动故障转移

前言 本节内容主要介绍一下hadoop集群下实现HDFS高可用的自动故障转移&#xff0c;HDFS高可用的自动故障转移主要通过zookeeper实现故障的监控和主节点的切换。自动故障转移为 HDFS 部署增加了两个新组件&#xff1a;ZooKeeper 和 ZKFailoverController &#xff08;ZKFC&…

【笔记】湖仓一体架构演进与发展

https://www.bilibili.com/video/BV1oF411F7rQ/?spm_id_from333.788.recommend_more_video.0&vd_sourcefa36a95b3c3fa4f32dd400f8cabddeaf

Linux中的firewall-cmd

2023年8月4日&#xff0c;周五上午 目录 打开端口关闭端口查看某个端口是否打开查看当前防火墙设置firewall-cmd中的服务在防火墙中什么是服务&#xff1f;为什么会有服务&#xff1f;打开或关闭服务查看某个服务是否打开firewall-cmd中的 zones查看所有可用的zones&#xff0…

elementui Cascader 级联选择使用心得

相信大家对于elementui并不陌生&#xff0c;作为适配Vue的优秀UI框架之一&#xff0c;一直被所有的开发者痛并快乐着。今天要记录的就是里边的主角之一Cascader。 首先先介绍一下Cascader ---> 当一个数据集合有清晰的层级结构时&#xff0c;可通过级联选择器逐级查看并选择…

OBS视频视频人物实时扣图方法(四种方式)

图片擦除一些杂乱图像 参考&#xff1a;https://www.bilibili.com/video/BV1va411G7be https://github.com/Sanster/lama-cleaner第一种&#xff1a;色度键选项 第二种&#xff1a;浏览器建立窗口选项 参考视频&#xff1a;https://www.bilibili.com/video/BV1WS4y1C7QY http…

Java8 list多属性去重

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 在 Java 开发中&#xff0c;我们经常会面临对 List 中的对象属性去重的需求。然而&#xff0c;当需要根据多个属性来进行去重时&#xff0c;情况会稍微复杂一些。本篇…