c语言回顾-数组(全网最详细,哈哈哈)

目录

前言,和小编一起感受数组的魅力!!!

1.数组的概念

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

2.1数组创建

2.2数组的初始化

2.3数组的类型

3.一维数组的使用

3.1数组下标

3.2数组元素的输入输出

小结:

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

5.sizeof的使用,计算数组个数

6.步入二维数组

6.1.二维数组的概念

6.2二维数组的声明和初始化

6.3二维数组元素的输入输出

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

7.C99中的变长数组(补充)

声明变长数组

特点和注意事项

结束语


前言,和小编一起感受数组的魅力!!!

1.数组的概念

数组是一种用于存储相同类型数据元素的数据结构。它是C语言中的一种重要数据类型。数组可以包含多个元素,并通过索引(下标)来访问和操作这些元素。

从概念中发现:

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

补充了解:

在C语言中,标准并没有明确禁止定义大小为0的数组,但实际行为取决于具体的编译器和实现。在某些编译器中,定义大小为0的数组可能会导致编译错误或未定义行为。在标准C(C99及之后的标准)中,声明大小为0的数组并不是合法的。

然而,在某些情况下,特别是结构体中的灵活数组成员(flexible array member),可以使用一种类似于0大小数组的结构。

数组分为一维数组和多维数组,常见的多维数组是二维数组。

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

2.1数组创建

在C语言中,数组的声明由元素类型和数组名组成,可以指定数组的大小(元素个数)。以下是数组声明的一般形式:

type arrayName[size];

其中:

  • type 表示数组中元素的数据类型,可以是基本数据类型(如整数、浮点数、字符等)或自定义类型(如结构体)。
  • arrayName 是数组的名称,用于在程序中引用数组。
  • size 表示数组的大小,即数组中元素的个数。
比如:我们现在想存储某个班级的20人的数学成绩,那我们就可以创建一个数组,如下:
int math[20];
当然我们也可以根据需要创建其他类型和大小的数组:
char ch[8];
double score[10];

2.2数组的初始化

有时候,数组在创建的时候,我们需要给定一些初始值值,这种就称为初始化的。
那数组如何初始化呢?数组的初始化⼀般使用大括号,将数据放在大括号中。
//完全初始化
int arr[5] = {1,2,3,4,5};
//不完全初始化
int arr2[6] = {1};//第⼀个元素初始化为1,剩余的元素默认初始化为0
//错误的初始化 - 初始化项太多,超过了数组大小
int arr3[3] = {1, 2, 3, 4};

2.3数组的类型

数组也是有类型的,数组算是一种自定义类型,去掉数组名留下的就是数组的类型。
例如:
int arr1[10];
int arr2[12];
char ch[5];
arr1数组的类型是 int [10]
arr2数组的类型是 int[12]
ch 数组的类型是 char [5]

3.一维数组的使用

3.1数组下标

C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后一个元素的下标是n-1,下标就相当于数组元素的编号,如下:
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
a7f21dbdbf6149d58a23db5f96d95ee1.png
在C语言中数组的访问提供了⼀个操作符 [ ] ,这个操作符叫:下标引用操作符。
有了下标访问操作符,我们就可以轻松的访问到数组的元素了,比如我们访问下标为7的元素,我们就 可以使用arr[7] ,想要访问下标是3的元素,就可以使用 arr[3] ,如下代码:
#include <stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10}; printf("%d\n", arr[7]);//8printf("%d\n", arr[3]);//4return 0;
}

3.2数组元素的输入输出

输入和输出数组的元素,可以使用循环结构来遍历数组。

让数组下标显示出来再进行索引。

#include <stdio.h>int main() {int numbers[5];// 输入数组元素printf("Enter 5 numbers:\n");for (int i = 0; i < 5; i++) {scanf("%d", &numbers[i]);}// 输出数组元素printf("The numbers are:\n");for (int i = 0; i < 5; i++) {printf("%d ", numbers[i]);}return 0;
}

首先声明了一个包含5个整数的数组 numbers。然后,使用循环结构来输入数组元素。在每次循环中,通过 scanf 函数将输入的值存储到数组的相应位置。接下来,使用循环结构输出数组的元素。在每次循环中,使用 printf 函数打印输出数组元素。请注意,在输入和输出数组元素时,循环的控制变量 i 表示数组的索引,从0递增到4,对应数组的五个元素。

小结:

一维数组的使用包括数组的声明和初始化、通过索引访问和操作数组元素,以及使用循环结构输入和输出数组元素。这些基本操作可以让您更灵活地处理一组相关的数据。

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

我们通过打印数组中元素的地址来观察

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

b36c2c49ef414cafab5133a5f3a93248.png

从输出的结果我们分析,数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为⼀个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。

5.sizeof的使用,计算数组个数

sizeof 中C语言是一个关键字,是可以计算类型或者变量大小的,其实 sizeof 也可以计算数组的大小。

#include <stido.h>
int main()
{int arr[10] = {0};printf("%d\n", sizeof(arr));return 0;
}
这里输出的结果是40,计算的是数组所占内存空间的总大小,单位是字节。
我们又知道数组中所有元素的类型都是相同的,那只要计算出一个元素所占字节的个数,数组的元素个数就能算出来。这里我们选择第一个元素算大小就可以。
#include <stido.h>
int main()
{int arr[10] = {0};int sz = sizeof(arr)/sizeof(arr[0]);printf("%d\n", sz);return 0;
}

结果:10

小编提醒:

以后在代码中需要数组元素个数的地方就不用固定写死了,使用上面的计算,不管数组怎么变化,计算出的大小也就随着变化了。

6.步入二维数组

6.1.二维数组的概念

二维数组是C语言中的一种特殊数据类型,用于存储具有两个维度的数据。它可以看作是一个由行和列组成的表格或矩阵,其中每个元素都可以通过行索引和列索引来访问和操作。

6.2二维数组的声明和初始化

dataType arrayName[rowSize][columnSize];

  • dataType 表示数组中元素的数据类型,可以是整数、浮点数、字符或其他自定义类型。
  • arrayName 是数组的名称,用于在程序中引用数组。
  • rowSize 表示数组的行数,即矩阵的行数。
  • columnSize 表示数组的列数,即矩阵的列数。
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

这声明了一个名为 arr 的二维整数数组,它有3行和5列,总共可以存储3x5=15个整数,并进行了初始化。

二维数组的元素可以通过行索引和列索引来访问。行索引和列索引都从0开始计数,依次递增。例如,要访问二维数组 arr 的第2行第3列的元素,可以使用以下方式:

arr[1][2] = 10; // 将第2行第3列的元素赋值为10

int x = arr[0][3]; // 将第1行第4列的元素的值赋给变量x

printf("%d",arr[2][4]);//打印第2行第4列的元素的值

3e3905fbe1284f29a78cb1f6d559b7f3.png

6.3二维数组元素的输入输出

我们只要能够按照一定的规律产生所有的行和列的数字就行;以上一段代码中的arr数组为例,行的选择范围是0~2,列的取值范围是0~4,借助循环实现生成所有的下标。
#include <stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};int i = 0;//遍历⾏//输⼊for(i=0; i<3; i++) //产⽣⾏号{int j = 0;for(j=0; j<5; j++) //产⽣列号{scanf("%d", &arr[i][j]); //输⼊数据}}//输出for(i=0; i<3; i++) //产⽣⾏号{int j = 0;for(j=0; j<5; j++) //产⽣列号{printf("%d ", arr[i][j]); //输出数据}printf("\n");}return 0;
}

7704ccf74fdf4e41b7983c42e5a6f4f9.png

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

像一维数组一样,我们如果想研究二维数组在内存中的存储方式,可以打印出数组所有元素的地址的。
#include <stdio.h>
int main()
{int arr[3][5] = { 0 };int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 5; j++){printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);}}return 0;
}

输出结果:

8ef81e6c51534de78b6170c22a4b80c4.png

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

7.C99中的变长数组(补充)

在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式,或者如果初始化数据的时候,可以省略数组大小。
int arr1[10];
int arr2[3+5];
int arr3[] = {1,2,3};
这样的语法限制,让我们创建数组就不够灵活,有时候数组大了就浪费空间,有时候数组又小了就不够用。
C99中给一个变长数组(variable-length array,简称 VLA)的新特性,允许我们可以使用变量指定
数组大小。
int n = a+b;
int arr[n];

在C语言中,变长数组(Variable Length Arrays,简称VLA)是一种特殊的数组类型,它允许数组的大小在运行时动态确定。这一特性在C99标准中引入,使得程序可以更灵活地处理数组大小不确定的情况。

声明变长数组

变长数组的声明与普通数组相似,但它的大小不是一个常量表达式,而是一个变量或表达式的结果。以下是一个变长数组的声明示例:

#include <stdio.h>int main() {int n;printf("Enter the size of the array: ");scanf("%d", &n);  // 读取数组大小int arr[n];  // 声明变长数组// 输入数组元素printf("Enter %d elements:\n", n);for (int i = 0; i < n; i++) {scanf("%d", &arr[i]);}// 输出数组元素printf("The elements are:\n");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;
}

在这个示例中,数组 arr 的大小由变量 n 的值决定。用户输入数组大小 n 后,程序动态创建一个大小为 n 的数组,并读取和输出 n 个元素。

特点和注意事项

  1. 作用域和生命周期:

    变长数组的作用域和生命周期与其所在的块作用域相同。它在声明的块作用域内有效,块作用域结束时变长数组也随之销毁。
  2. 运行时确定大小:

    变长数组的大小在运行时确定,使得程序可以处理大小不确定的数据结构。
  3. 不支持全局或静态变长数组:

    变长数组不能声明为全局变量或静态变量,只能在函数内使用。
  4. 内存分配:

    变长数组的内存分配在栈上,因此不能使用太大的数组以防止栈溢出。

结束语

本节内容到此结束,内容有点多,感谢友友们到看到最后。

支持小编的点个赞,留个评论吧!!!

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

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

相关文章

pycharm的usages在哪设置?

参考文章&#xff1a;https://blog.51cto.com/save/8961821 在代码编辑器&#xff08;如PyCharm或IntelliJ IDEA&#xff09;中&#xff0c;"1 usage"通常表示当前光标所在的代码元素&#xff08;如变量、函数、类等&#xff09;在其他地方被使用了一次。这个功能可…

什么是自动气象站呢

自动气象站&#xff0c;作为现代气象观测的重要工具&#xff0c;已经深入到我们生活的各个领域&#xff0c;从气象预报到农业生产&#xff0c;再到环境保护&#xff0c;自动气象站都发挥着不可或缺的作用。 自动气象站&#xff0c;顾名思义&#xff0c;是一种能够自动收集、处理…

昇思25天学习打卡营第7天|网络构建

网络构建 神经网络模型由tensor操作和神经网络层构成。 MIndSporezhong&#xff0c;Cell是构建所有网络的基类&#xff0c;也是网络的基本单元。cell也由子cell构成。 定义模型类 # 继承nn.Cell类 class Network(nn.Cell):def __init__(self):super().__init__()self.flatte…

所以,这些AI产品都死了?? 创业就是一场大型狼人杀;独立开发者的营销流量密码;谷歌竟然搞砸过300个项目 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;ShowMeAI官网 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 1. 你可能不知道&#xff1a;Google Graveyard「埋葬」着 300 个被谷歌搞砸的项目 官网链接 → https://killedbygoogle.com Google Graveyard (Killed by Google…

【课程设计】基于python的一款简单的计算器

我们是大二本科生团队&#xff0c;主力两人耗时3天完成了这款计算器的制作。希望大家给我们多多引流&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 欢迎各位优秀的高考学子报考长安大学&#xff0c;报考长安大学电子信息工程专业。 欢迎有志于就…

游戏冻结工具 -- 雪藏HsFreezer v1.78

软件简介 HsFreezer是一款多功能游戏冻结工具&#xff0c;它允许用户随意暂停和继续游戏&#xff0c;同时具备系统优化和进程管理的功能。这款软件特别适合希望在游戏加载时间节省或在游戏与其他任务之间快速切换的用户。其主要特点包括快捷键操作、单锁模式的丝滑切换&#x…

音乐播放器小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;歌曲信息管理&#xff0c;会员优惠管理&#xff0c;用户管理&#xff0c;会员办理管理&#xff0c;歌曲分类管理&#xff0c;会员信息管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;歌曲信…

人工智能--图像语义分割

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a;专业知识 ​ 文章目录 &#x1f349;引言 &#x1f349;介绍 &#x1f348;工作原理 &#x1f34d;数据准备 &#x1f34d;特征提取 &#x1f34d;像素分…

【数智化人物展】法大大黄翔:从他山之石看中国企业数智化升级的机会点

黄翔 本文由法大大创始人兼CEO黄翔投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着AI、云计算、大数据等技术的飞速发展&#xff0c;数智化转型升级已是全球企业的共识…

css flex 子元素溢出时,父元素被撑开解决方案

当父元素使用flex: 1;自适应填满时&#xff0c;子元素内容溢出&#xff0c;父元素内容撑大&#xff0c;导致页面显示问题&#xff0c;或设置了overflow 为scroll 的元素没出现滚动条等问题 解决方案&#xff1a; 1.如果是横向排列&#xff0c;flex: 1;的元素加上width: 0; 此…

调整分区失败致盘无法访问:深度解析与数据恢复全攻略

调整分区失败盘打不开的困境 在计算机的日常维护与管理中&#xff0c;调整磁盘分区是常见的操作之一&#xff0c;旨在优化存储空间布局、提升系统性能或满足特定应用需求。然而&#xff0c;当这一操作未能如预期般顺利进行&#xff0c;反而导致分区调整失败&#xff0c;进而使…

模拟算法系列|替换所有的问号|提莫攻击|种花问题|Z字形变换|兼具大小写的英文字母|删除字符使频率相同

大家好,我是LvZi,今天带来模拟算法系列|替换所有的问号|提莫攻击|种花问题|Z字形变换|兼具大小写的英文字母|删除字符使频率相同 一.基本概念 模拟算法就是根据题意 模拟出代码的过程,模拟算法的题意往往都很简单,考验的是将思路转化为代码的能力,十分的锻炼代码能力,且能很好…

【日记】在街上跳舞被同事看见了(470 字)

正文 昨晚跳舞&#xff0c;照例在街上表演&#xff0c;被单位里的保洁阿姨撞见了…… 我以为这就完了&#xff0c;结果她还拍了视频发给做饭阿姨。晚上吃饭无意间聊起才知道有这回事。我竟一时间不知该哭还是该笑……. 今天非常非常闲。虽然不是没工作&#xff0c;只是我懒得去…

418天内第6次发布,科大讯飞星火大模型在跟谁赛跑?

常言道“一步慢&#xff0c;步步慢”&#xff0c;大模型市场瞬息万变&#xff0c;快人一步就是竞争的反转。 6月27日&#xff0c;科大讯飞如期公布星火大模型的最新进展&#xff1a;大模型底座七大核心能力得到全面提升&#xff0c;星火大模型V4.0可对标GPT-4 Turbo&#xff0…

软考系统架构师高效备考方法论

软考系统架构师高效备考方法论 本章总结的备考方法论也是希望能帮助更多的小伙伴高效的备考最终通过考试&#xff0c;这种考试个人感觉是尽量一次性考过&#xff0c; 要不然老拖着&#xff0c;虽然每年可以考两次&#xff0c;5月和11月&#xff0c;两次考试间隔5个月时间&#…

ELK日志实时监控

目录 一、ELK/EFK简介 1.1 什么是ELK/EFK? 1.2 常见架构 1、Elasticsearch Logstash Kibana 2、Elasticsearch Logstash Filebeat Kibana 3、Elasticsearch Logstash Filebeat Kibana Redis 4、Elasticsearch Fluentd Filebeat Kibana 1.3 基本流程 二、…

JVM专题之垃圾收集算法

标记清除算法 第一步:标记 (找出内存中需要回收的对象,并且把它们标记出来) 第二步:清除 (清除掉被标记需要回收的对象,释放出对应的内存空间) 缺点: 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需 要分配较大对象时,无法找到…

反射--通俗易懂

一、反射(Reflection) 反射就是:加载类&#xff0c;并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等) 动态语言&#xff0c;是一类在运行时可以改变其结构的语言&#xff1a;例如新的函数、对象、甚至代码可以被引进&#xff0c;已有的函数可以被删除或是其他…

多重奖励拿到手软,OPENAIGC开发者大赛燃爆这个夏天!

你是否渴望在AI领域一展身手&#xff1f; 你是否拥有开创性的技术和创意&#xff1f; 2024 OPENAIGC开发者大赛就是你的最佳舞台&#xff01; 不论你是经验丰富的开发者&#xff0c; 还是技术领域的创新者&#xff0c; 都有机会在这里大放异彩&#xff01; 由联想拯救者、…

每日一题 7月1日

1 设数组data[m]作为循环队列的存储空间,front为队头指针,rear为队尾指针,则执行出队操作后其头指针front值为____ 2 采用滑动窗口机制对两个相邻结点A(发送方)和B(接收方)的通信过程进行流量控制。假定帧的序号长度为3比特,发送窗口与接收窗口的大小均为7,当A发送了…