学C语言的朋友都知道,数组是绕不开的核心知识点,也是后续学结构体、链表的基础。很多新手刚接触时,被一维、二维、字符数组搞得晕头转向,连冒泡排序、选择排序的逻辑都理不清。
今天这篇文章,把C语言数组的核心知识点全讲透,从基础概念到实际代码,从经典算法到避坑技巧,全程通俗讲解,零基础也能轻松看懂,收藏起来慢慢学!
一、一维数组:基础中的基础,先吃透这几点
数组本质就是存相同类型、有序数据的连续内存容器,一维数组是最基础的形式,所有操作都围绕下标展开,核心知识点就这几个:
- 定义与内存分配
定义格式:数据类型 数组名
数组长度
;,比如int a;就是定义一个能存10个整数的数组。
数组总内存=单个元素字节×长度,比如int型占4字节,int a就占40字节,用sizeof能快速计算,核心公式:数组长度 = sizeof(数组名)/sizeof(数组名),写代码必用!
- 初始化的3个实用技巧
数组定义时赋值就是初始化,未赋值的元素会自动置0,这3个技巧直接记:
全初始化可省长度:int a={1,2,3},系统自动定长度3;
部分初始化超方便:int a={0,1,2},剩余7个元素全为0;
快速置0所有元素:int a={0},开发中常用的小技巧。
- 核心注意:下标从0开始
C语言数组只能逐个引用元素,不能整体操作,下标从0开始,最后一个元素下标是长度-1,比如int a,元素是a到a,越界会出问题!
- C99变长数组:灵活定义长度
C99新增的变长数组,允许用变量定长度,比如int len=5; int a;,但注意创建后长度不能改,且定义时不能初始化,需后续循环赋值。
二、二维数组:数组里套数组,处理表格数据超合适
实际开发中,存学生各科成绩、矩阵这些表格类数据,一维数组就不够用了,二维数组就是**"数组中的数组"**,理解成行和列的矩阵就行,关键知识点就2个核心:
- 定义与存储规则
定义格式:数据类型 数组名;,比如int stu,存10个学生的3科成绩。
别看逻辑上是行和列,物理内存里还是连续的,按行存储,先存第一行所有元素,再存第二行,依次类推。
- 初始化铁律:列长度绝对不能省
二维数组初始化分分行和线性两种,怎么写都可以,但列长度必须指定,行长度可省略,系统会自动计算:
正确写法:int a={1,2,3,4,5,6},系统自动定2行;
错误写法:int a={1,2,3},直接编译报错,新手别踩坑!
引用元素也简单,数组名
行下标
列下标
,比如stu,就是第二个学生的第二科成绩。
三、字符串与字符数组:C语言的特殊存在,核心记牢'\0'
重点提醒:C语言没有专门的字符串类型,所有字符串都靠字符数组存储,这部分的核心,就是记牢字符串结束符'\0',少了它必出问题!
- '\0'的关键作用
字符串常量(比如"hello")在内存中,末尾会自动加'\0'(ASCII码为0),它是C语言识别字符串结束的唯一标志,不计入字符串长度,但占数组位置。
比如存"hello",字符数组长度至少要6,留一个位置给'\0',否则输出时会出现随机的"垃圾值"。
- 初始化与输入输出
字符数组初始化有两种方式,推荐用字符串常量,更简洁,末尾会自动补'\0':
逐个赋值:char ch={'h','e','l','l','o','\0'};
字符串常量:char ch="hello";(推荐)
输入输出不用循环,直接用%s,比如printf("%s", ch);、scanf("%s", ch);,注意scanf输入时,数组名不用加&,遇到空格会停止输入。
如果想输入带空格的字符串,用scanf("%", ch)或fgets(ch, 长度, stdin)就行,后者更安全。
四、数组经典算法:冒泡排序+选择排序,笔试高频考点
学会数组,必然要会排序,冒泡排序和选择排序是C语言最基础、最常考的排序算法,适合小规模数据,核心逻辑简单,代码直接套用就行!
- 冒泡排序:相邻比较,让最值"浮"到末尾
核心思想:重复遍历数组,两两比较相邻元素,顺序错了就交换,每一轮遍历,都会把未排序部分的最大值放到末尾,总共遍历长度-1轮。
简单说,就是让大的数一步步"浮"到数组最后,代码直接复制就能运行,升序排序改个符号就能变降序。
- 选择排序:找最值,放到已排序区末尾
核心思想:把数组分成已排序和未排序区,每一轮从无序列表找最小值,和未排序区第一个元素交换,逐步扩大已排序区,同样遍历长度-1轮。
相比冒泡排序,选择排序的交换次数更少,逻辑也更直观,新手更容易理解。
五、避坑必看!数组使用的7个高频错误,别再踩
C语言对数组不做越界检查,新手稍不注意就会导致程序崩溃,这7个坑点务必记牢,避免踩雷:
下标越界:始终记住下标从0开始,最后一个元素是长度-1;
二维数组省列长度:列长度必须写,行长度可省,别搞反;
字符数组没留'\0'位置:存字符串的数组,长度要比实际字符串大1;
scanf输入字符串加&:数组名本身是地址,不用加取地址符;
未初始化数组直接用:未赋值的数组元素是随机垃圾值,用了会出错误结果;
变长数组定义时初始化:变长数组只能后续赋值,定义时不能初始化;
数组名直接赋值:数组名是常量地址,不能用a=b;给两个数组赋值。
六、课后小练习:学完就练,巩固知识点
光看没用,动手敲代码才是关键,这5个小练习,覆盖数组所有核心知识点,学完直接练:
实现一维数组的逆序输出;
用数组存储斐波那契数列前20项并打印;
输入10个学生成绩,校验0~100范围,计算总成绩和平均分;
用二维数组打印杨辉三角前10行;
定义二维字符数组,统计每个字符出现的次数。
总结
C语言数组其实并不难,核心就是抓住**"相同类型、连续内存、下标操作"**这三个点:
一维数组打基础,记牢初始化和长度计算公式;
二维数组理解"行和列",记住列长度不能省;
字符数组核心是'\0',字符串输入输出用%s;
冒泡和选择排序,吃透核心思想,代码直接套用。
数组是C语言的基础,也是后续学习复杂数据结构的铺垫,建议大家结合代码示例反复敲,把每个知识点吃透,避坑点记牢,以后写代码会轻松很多。
最后,你学C语言数组时,遇到过哪些难题?评论区说说你的经历!