大家好,今天给大家整理了 C 语言数组从入门到实战的完整知识点,涵盖一维数组、二维数组、内存存储、变长数组、经典练习题,逻辑清晰、代码可直接运行,非常适合新手学习和复习。
📑 文章目录
🔎 一、数组核心概念
数组是 C 语言中一组相同类型元素的有序集合,是编程最常用的数据结构之一。
- 数组中元素类型必须完全相同
- 元素个数不能为 0
- 常见分类:一维数组、二维数组(最常用的多维数组)
📌 二、一维数组(基础核心)
1. 一维数组创建
数据类型 数组名[常量值];
示例:
int math[20]; // 存储20个int类型成绩
char ch[8]; // 存储8个char类型字符
double score[10];// 存储10个double类型数据
2. 一维数组初始化
使用大括号 {} 赋值,分为两种方式:
- 完全初始化:元素个数与数组大小一致
int arr[5] = {1, 2, 3, 4, 5};
- 不完全初始化:未赋值元素自动补 0
int arr[6] = {1}; // 等价 {1,0,0,0,0,0}
❌ 错误写法:初始化项数超过数组
int arr[3] = {1,2,3,4};
3. 数组类型
去掉数组名,剩余部分就是数组类型:
- int arr[10] → 类型:int [10]
- char ch[5] → 类型:char [5]
4. 一维数组使用(下标访问)
- 数组下标从 0 开始
- 最后一个元素下标 = 元素个数 – 1
- 访问格式:数组名[下标]
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\\n", arr[3]); // 输出4
printf("%d\\n", arr[7]); // 输出8
return 0;
}
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++)
{
printf("%d ", arr[i]);
}
return 0;
}
6. 一维数组内存存储
- 一维数组在内存中连续存放
- 相邻元素地址差 = 元素类型所占字节数(int 相差 4 字节)
7. sizeof 计算数组元素个数(必背公式)
int sz = sizeof(arr) / sizeof(arr[0]);
- sizeof(arr):数组总字节数
- sizeof(arr[0]):单个元素字节数
- 结果:数组元素个数
📊 三、二维数组(进阶必备)
1. 二维数组本质
以一维数组作为元素的数组,可以理解为 “表格”。
2. 二维数组创建
数据类型 数组名[行数][列数];
示例:
int arr[3][5]; // 3行5列的二维数组
3. 二维数组初始化
- 不完全初始化
int arr[3][5] = {1, 2};
- 完全初始化
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
- 按行初始化(更清晰)
int arr[3][5] = {{1,2},{3,4},{5,6}};
- 省略行数(不能省略列数)
4. 二维数组使用
行、列下标均从 0 开始,访问格式:数组名[行][列]
printf("%d", arr[2][4]); // 访问第3行第5列元素
5. 二维数组遍历(双层循环)
#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, j;
// 遍历输出
for(i = 0; i < 3; i++)
{
for(j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\\n");
}
return 0;
}
6. 二维数组内存存储
- 二维数组在内存中也是连续存放
- 行内连续、跨行也连续,整体是一段连续内存空间
⚙️ 四、C99 变长数组(VLA)
1. 作用
允许使用变量指定数组大小,运行时确定长度,更灵活。
int n;
scanf("%d", &n);
int arr[n]; // 变长数组
2. 重要特点
- 数组大小运行时确定,不是 “可以变大”
- 不能初始化
- VS 不支持,GCC/Clang 支持
🧪 五、数组经典实战练习(代码可直接运行)
练习 1:字符从两端向中间汇聚
#include <stdio.h>
#include <windows.h>
#include <string.h>
int main()
{
char arr1[] = "welcome to bit…";
char arr2[] = "#################";
int left = 0;
int right = strlen(arr1) – 1;
while(left <= right)
{
Sleep(500);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right–;
printf("%s\\n", arr2);
}
return 0;
}
练习 2:二分查找(折半查找)
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int left = 0;
int right = sizeof(arr)/sizeof(arr[0]) – 1;
int key = 7; // 要查找的数字
int mid, find = 0;
while(left <= right)
{
// 防止溢出写法
mid = left + (right – left) / 2;
if(arr[mid] > key)
right = mid – 1;
else if(arr[mid] < key)
left = mid + 1;
else
{
find = 1;
break;
}
}
if(find)
printf("找到了,下标是:%d\\n", mid);
else
printf("找不到\\n");
return 0;
}
⚠️ 六、数组高频易错点总结
- 数组下标从 0 开始,严禁越界访问
- 初始化项数不能大于数组定义大小
- 二维数组可省略行,不能省略列
- 统一用 sizeof(arr)/sizeof(arr[0]) 计算元素个数
- 二分查找必须是有序数组
- 变长数组不能初始化,VS 环境不支持
✅ 结语
数组是 C 语言的基础中的基础,掌握好数组的创建、访问、内存存储和常见用法,对后续学习指针、函数、数据结构都至关重要。
如果这篇文章对你有帮助,欢迎点赞、收藏、关注,后续会持续更新 C 语言干货~
![打卡信奥刷题(3584)用C++实现信奥题 P11523 [THUPC 2025 初赛] 摊位分配-171主机测评](https://www.171host.com/wp-content/uploads/2026/09/20260922020544-6ab1e2783b78e-220x150.png)
