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

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

对函数有疑惑的同学,可以看我之前的文章: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   4printf("%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.hqwc.cn/news/54213.html

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

相关文章

《向量数据库指南》——腾讯云向量数据库Tencent Cloud VectorDB应用场景

目录 大模型知识库 推荐系统 问答系统 文本/图像检索 大模型知识库 腾讯云向量数据库可以和大语言模型 LLM 配合使用。企业的私域数据在经过文本分割、向量化后,可以存储在腾讯云向量数据库中,构建起企业专属的外部知识库,从而在后续的检索任务中,为大模型提供提示信息…

Java的变量与常量

目录 变量 声明变量 变量的声明类型 变量的声明方式&#xff1a;变量名 变量名的标识符 初始化变量 常量 关键字final 类常量 总结 变量和常量都是用来存储值和数据的基本数据类型存储方式&#xff0c;但二者之间有一些关键差别。 变量 在Java中&#xff0c;每个变…

AlexNet卷积神经网络-笔记

AlexNet卷积神经网络-笔记 AlexNet卷积神经网络2012年提出 测试结果为&#xff1a; 通过运行结果可以发现&#xff0c; 在眼疾筛查数据集iChallenge-PM上使用AlexNet&#xff0c;loss能有效下降&#xff0c; 经过5个epoch的训练&#xff0c;在验证集上的准确率可以达到94%左右…

Linux基本开发工具(一)

文章目录 Linux基本开发工具&#xff08;一&#xff09;Linux安装和卸载软件Linux 软件包管理器 yum关于sudo命令关于yum源的换源问题 vim编辑器的使用vim三种模式&#xff08;常见&#xff09;vim的基本操作vim配置 Linux基本开发工具&#xff08;一&#xff09; Linux安装和…

C语言进阶第一课 -----------深度剖析数据在内存中的存储

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; &#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382;…

【redis】redis的认识和安装

目录 1.redis是什么2.Redis的特点3.安装redis4.设置远程连接4.1 开启隧道4.2 可视化客户端连接4.3 开启防火墙 5.redis常见数据类型5.1 redis的一些全局命令5.2 数据结构 6. redis的典型应用---缓存&#xff08;cache&#xff09;6.1 使用redis做缓存6.2 缓存穿透&#xff0c;缓…

angular-mat-select 多选 实现按选择顺序排序

mat-select 正常情况下,多选后,已选项是按列表顺序进行排序,如果我想实现按照点击项目的顺序进行排序,我该如何做呢? [参考网址](Angular order of selected option in multiple mat-select - Stack Overflow) sortComparator是Angular Material中mat-select组件的一个属…

K8S kubeadm搭建

kubeadm搭建整体步骤 1&#xff09;所有节点进行初始化&#xff0c;安装docker引擎和kubeadm kubelet kubectl 2&#xff09;生成集群初始化配置文件并进行修改 3&#xff09;使用kubeadm init根据初始化配置文件生成K8S的master控制管理节点 4&#xff09;安装CNI网络插件&am…

Flutter(八)事件处理与通知

1.原始指针事件处理 一次完整的事件分为三个阶段&#xff1a;手指按下、手指移动、和手指抬起&#xff0c;而更高级别的手势&#xff08;如点击、双击、拖动等&#xff09;都是基于这些原始事件的。 Listener 组件 Flutter中可以使用Listener来监听原始触摸事件 Listener({…

Linux从安装到实战 常用命令 Bash常用功能 用户和组管理

1.0初识Linux 1.1虚拟机介绍 1.2VMware Workstation虚拟化软件 下载CentOS; 1.3远程链接Linux系统 &FinalShell 链接finalshell半天没连接进去 他说ip adress 看IP地址是在虚拟机上 win11主机是 终端输入&#xff1a; ifconfig VMware虚拟机的设置 & ssh连接_snge…

Spring Cloud +UniApp 智慧工地云平台源码,智能监控和AI分析系统,危大工程管理、视频监控管理、项目人员管理、绿色施工管理

一套智慧工地云平台源码&#xff0c;PC管理端APP端平板端可视化数据大屏端源码 智慧工地可视化系统利用物联网、人工智能、云计算、大数据、移动互联网等新一代信息技术&#xff0c;通过工地中台、三维建模服务、视频AI分析服务等技术支撑&#xff0c;实现智慧工地高精度动态仿…

31 对集合中的字符串,按照长度降序排列

思路&#xff1a;使用集合的sort方法&#xff0c;新建一个Comparator接口&#xff0c;泛型是<String>&#xff0c;重写里面的compare方法。 package jiang.com; import java.util.Arrays; import java.util.Comparator; import java.util.List;public class Practice4 {…