news 2026/7/19 16:15:48

C语言--数组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言--数组

1.数组的概念

数组是一组相同类型元素的集合;即数组中存放的是一个或多个元素,且元素的数据类型都是相同的。数组分为一维数组和多维数组。二维数组为常见的多维数组。

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

2.1数组创建

type arr_name[常量值]; //type 为数组元素的类型。可以是int、char等基本数据类型。也可以是自定义类型(这个以后会介绍) //arr_name为数组的名字,最好起名有意义,直观明了。 //[]中的常量值通常用来指明数组大小的,根据实际需求指定即可。

比如我们想定义一个数组存储某个班级20人的数学成绩(为整数),如下:

int math_grade[20];

2.2数组初始化和数组类型

在数组创建时,有时需要给定一些初始值,我们称之为初始化。数组初始化一般使用大括号,将数据存放在大括号中。

//完全初始化 int arr[5] = {1,2,3,4,5}; //不完全初始化 int arr2[6] = {1};//第⼀个元素初始化为1,剩余的元素默认初始化为0 //错误的初始化 - 初始化项太多 int arr3[3] = {1, 2, 3, 4};

数组也是有类型的,其本身算是一种自定义类型。去掉数组名后留下的就是数组的类型。本小节上述代码的数据类型如下:

//完全初始化语句的数组类型 int [5] ; //不完全初始化的数组类型 int [6];

2.3一维数组的使用

学完一维数组的基本语法,一维数组可以存放数据,存放数据的目的是对数据的操作,那么怎么使用一维数组?C语言规定数组是有下标的,下表从0开始 ,假设数组有n个元素,最后⼀个元素的下标是n-1,下标就相当于数组元素的编号,如下:

int arr[10] = {1,2,3,4,5,6,7,8,9,10};//对应的下标依次为0~9

在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]);//8 printf("%d\n", arr[3]);//4 return 0; }

2.4 数组元素的打印

接下来,如果想要访问整个数组的内容,那怎么办呢?只要我们产⽣数组所有元素的下标就可以了,那我们使用for循环产生0~9的下标,接下来使用下标访问就行了。

#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("%d ", arr[i]); } return 0; }

2.5 数组的输入

明白了数组的访问,当然我们也根据需求,自己给数组输⼊想要的数据。

#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++) { //循环输入数据 scanf("%d", &arr[i]); } for(i=0; i<10; i++) { //循环打印数据 printf("%d ", arr[i]); } return 0; }

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

有了前面的知识,我们其实使用数组基本没有什么障碍了,如果我们要深入了解数组,我们最好能了解⼀下数组在内存中的存储。

//依次打印数组元素的地址 #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]);//%p为取地址占位符 } return 0; }

读者可以复制上述代码自行运行打印,从输出的结果我们分析,数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为⼀个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。这就为后期我们使用指针访问数组奠定了基础(在后续指针系列的时候我们再讲,这里暂且记住就行)。

2.7 sizeof计算数组元素的个数

在遍历数组的时候,我们经常想知道数组的元素个数,那C语⾔中有办法使用程序计算数组元素个数吗?有的,那就是sizeof,sizeof是C语言中的一个关键字,是可以计算类型或者变量大小的,其实sizeof也可以计算数组的总体大小。

#include <stido.h> int main() { int arr[10] = {0};//数组初始化 printf("%d\n", sizeof(arr));//输出的结果是40,计算的是整个数组所占内存空间的总⼤⼩,单位是字节。 return 0; }

数组的总体大小知道了,我们又知道数组中所有元素的数据类型都是相同的,那只要计算出⼀个元素所占字节的个数(一个元素的大小),数组的元素个数就能算出来。这里我们选择第⼀个元素算大小就可以。

#include <stido.h> int main() { int arr[10] = {0}; printf("%d\n", sizeof(arr[0]));//计算⼀个元素的⼤⼩,单位是字节 return 0; }

接下来就能计算出数组的元素个数:

#include <stido.h> int main() { int arr[10] = {0}; int sz = sizeof(arr)/sizeof(arr[0]);//数组元素个数,这⾥的结果是:10,表⽰数组有10个元素。 printf("%d\n", sz); return 0; }

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

3.二维数组的创建、初始化和使用

3.1二维数组的创建

//定义⼆维数组 type arr_name[常量值1][常量值2]; //例如: int arr[3][5]; double data[2][8]; /* 3表⽰数组有3⾏ 5表⽰每⼀⾏有5个元素 int 表⽰数组的每个元素是整型类型 arr 是数组名,可以根据⾃⼰的需要指定名字 data数组意思基本⼀致。 */

3.2 二位数组的初始化

在创建变量或者数组的时候,给定⼀些初始值,被称为初始化。那⼆维数组如何初始化呢?像⼀维数组⼀样,也是使用⼤括号初始化的。

//不完全初始化 int arr1[3][5] = {1,2}; int arr2[3][5] = {0}; //完全初始化 int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};//3行5列全都初始化 //按照⾏初始化 int arr4[3][5] = {{1,2},{3,4},{5,6}}; //初始化时省略⾏,但是不能省略列 int arr5[][5] = {1,2,3}; int arr6[][5] = {1,2,3,4,5,6,7}; int arr7[][5] = {{1,2}, {3,4}, {5,6}};

3.3 二维数组的使用

当我们掌握了⼆维数组的创建和初始化,那我们怎么使用⼆维数组呢?其实⼆维数组访问也是使用下标的形式的,⼆维数组是有行和列的,只要锁定了行和列就能唯⼀锁定数组中的⼀个元素。C语言规定,⼆维数组的行是从0开始的,列也是从0开始的(和线性代数中的矩阵差不多,可以辅助记忆)。

#include <stdio.h> int main() { int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7}; printf("%d\n", arr[2][4]);//下标为2的第3行和下标为4的第5列,结果为7 return 0; }

3.4 二维数组的输入和输出

访问⼆维数组的单个元素我们知道了,那如何访问整个⼆维数组呢?其实我们只要能够按照⼀定的规律产生所有的行和列的数字就行;以上⼀段代码中的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; }

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

像⼀维数组⼀样,我们如果想研究⼆维数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址的。代码如下:

#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; }

每⼀行内部的每个元素都是相邻的,地址之间相差4个字节(一个整型元素占4字节),跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。了解清楚⼆维数组在内存中的布局,有利于我们后续使用指针来访问数组的学习。

4. 数组相关练习

//练习1:多个字符从两端移动,向中间汇聚 #include <stdio.h> int main() { char arr1[] = "welcome to bit..."; char arr2[] = "#################"; int left = 0; int right = strlen(arr1)-1; printf("%s\n", arr2); while(left<=right) { Sleep(1000); arr2[left] = arr1[left]; arr2[right] = arr1[right]; left++; right--; printf("%s\n", arr2); } retutn 0; }

到这里就结束了,如果读者有疑问可以评论区留言,我会第一时间解答。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 16:14:45

【助力国自然】20个高阶AI喂饭指令

撰写指令: 指令:请基于研究领域关键词,分析近五年国家自然科学基金在该领域资助的重点方向和热点问题,并结合国家战略需求和学科发展趋势,提炼出3-5个亟待解决的关键科学问题,每个问题需简述其科学意义和潜在影响。(目标: 问题导向,符合国自然资助趋势,突出科学意义)…

作者头像 李华
网站建设 2026/7/19 16:13:58

【Game】Powerful——Punch and Kick(12.1)【2026】

文章目录160届&#xff08;2026.01.18&#xff0c;风云再起&#xff0c;阿城多多&#xff09;161届&#xff08;2026.02.15&#xff0c;今年勇&#xff0c;宇子&#xff09;162 届&#xff08;2026.03.15&#xff0c;七窍玲珑&#xff0c;逍遥&#xff09;163 届&#xff08;20…

作者头像 李华
网站建设 2026/7/19 16:12:00

Vim-wordy高级配置:自定义字典环和工作流优化

Vim-wordy高级配置&#xff1a;自定义字典环和工作流优化 【免费下载链接】vim-wordy Uncover usage problems in your writing 项目地址: https://gitcode.com/gh_mirrors/vi/vim-wordy Vim-wordy是一款强大的写作辅助插件&#xff0c;能够帮助用户发现写作中的问题用词…

作者头像 李华
网站建设 2026/7/19 16:09:43

KARIPAP: Quantum-Inspired Tensor Network Compression of Large Language Models Using Infinite Proj...

一、文章主要内容总结 该研究针对大型语言模型(LLMs)训练推理成本高、能耗大、难以终端部署的核心问题,提出了量子启发的张量网络压缩框架KARIPAP。其核心是结合无限投影纠缠对态(iPEPS)与张量重整化群(TRG)优化,通过结构化张量分解而非单纯减少神经元数量或降低权重精…

作者头像 李华