C语言第4讲:数组
大家好,今天给大家整理了 C 语言数组从入门到实战的完整知识点,涵盖一维数组、二维数组、内存存储、变长数组、经典练习题,逻辑清晰、代码可直接运行,非常适合新手学习和复习。
📑 文章目录
- 数组核心概念
- 一维数组(基础核心)
- 二维数组(进阶必备)
- C99 变长数组(VLA)
- 数组经典实战练习
- 数组高频易错点总结
- 结语
🔎 一、数组核心概念
数组是 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 语言干货~
