C语言数组基础教程
2026/5/25 10:22:01 网站建设 项目流程

C语言数组教程

数组是什么?为什么要学数组?

在C语言中,数组,就是用来存储一组相同类型数据的有序集合。

如果不用数组,存储5个学生成绩需要写5个变量:

ints1,s2,s3,s4,s5;

用数组只需要一行:

intscores[5];

有了数组我们得以批量管理数据,让代码更简洁,更方便循环遍历,能够处理大量的数据。


一、一维数组(最基础)

  1. 一维数组定义
数据类型 数组名[数组长度];
intarr[10];// 存放10个整数floatnum[5];// 存放5个小数charch[20];// 存放20个字符
注意:
  • 数组长度必须是常量
  • 一旦定义,长度不能改变!(想加元素只能新建更大数组)
  • 下标从 0开始
2. 一维数组初始化

(1)完全初始化

intarr[5]={10,20,30,40,50};

(2)部分初始化
没赋值的元素自动为 0

intarr[5]={10,20};// arr[0]=10, arr[1]=20, arr[2]=0, arr[3]=0, arr[4]=0

(3)省略长度初始化

intarr[]={1,2,3,4,5};// 自动识别长度为5
3. 数组元素访问
语法:数组名[下标]
intarr[5]={10,20,30,40,50};printf("%d",arr[0]);// 输出 10printf("%d",arr[4]);// 输出 50/*注意:数组下标越界会导致程序崩溃! 长度为5,下标只能是 0~4。*/

4. 数组遍历

#include<stdio.h>intmain(){intarr[]={10,20,30,40,50};intlen=sizeof(arr)/sizeof(int);//sizeof(arr):整个数组占用的总字节数//sizeof(int):单个 int 类型占用的字节数(通常为 4)//两者相除得到数组的元素个数for(inti=0;i<len;i++){printf("%d ",arr[i]);}return0;}
运行结果: 10 20 30 40 50

数组在内存中是结构化的数据连续的内存空间:

基地址 base = 0x0000 arr[0] arr[1] arr[2] arr[3] arr[4] 10 20 30 40 50 0x0000 0x0004 0x0008 0x000C 0x0010

而arr[]之所以从0开始,是因为其表示从指针arr开始的偏移量

指针偏移:arr → arr+1 → arr+2 → arr+3 ┌───────┬───────┬───────┬───────┐ │ arr[0]│ arr[1]│ arr[2]│ arr[3]│ └───────┴───────┴───────┴───────┘ ↑ ↑ ↑ ↑ arr+0 arr+1 arr+2 arr+3

二、二维数组(表格数据)

  • 二维数组定义
    数据类型 数组名[行数][列数];
    示例:
    int arr[3][4]; // 3行4列
  • 二维数组初始化
intarr[2][3]={{1,2,3},{4,5,6}};
  • 二维数组遍历
#include<stdio.h>intmain(){intarr[2][3];for(inti=0;i<2;i++){for(intj=0;j<3;j++){printf("请输入 arr[%d][%d]:",i,j);scanf("%d",&arr[i][j]);}}// 输出数组printf("\n输出结果:\n");for(inti=0;i<2;i++){for(intj=0;j<3;j++){printf("%d ",arr[i][j]);}printf("\n");}return0;}
运行结果: 1 2 3 4 5 6

三、初学者最常见错误(避坑指南)

  1. 数组下标越界
    下标 < 0 或 下标 ≥ 数组长度 都会直接崩溃或报错。
intarr[5];arr[10]=100;// 崩溃!
  1. C/C++:未初始化数组里是随机垃圾值,不是 0;

  2. 用变量定义数组长度(不规范)

intn=5;intarr[n];// 不推荐

但它能用,是因为编译器开了 “扩展功能”,但它不是标准 C,考试、竞赛、正规项目都算错。 而它真正的坑在哪?变长数组是在栈上开空间(空间较小),n 太大 → 直接栈溢出、程序崩掉,而且不同编译器行为不一样,如若不能初始化 int arr[n] = {0}; 也会报错

  1. 数组越界
for(inti=0;i<=len;i++)//错误

应该是:

for(inti=0;i<len;i++)

多了个等号就越界。

  1. C 语言不能直接用 “=” 给数组赋值
inta[2]={1,2};intb[2];b=a;// ❌ 直接报错!

编译器直接报错:数组不能被赋值。(首地址是“死的”)

赋值的本质是把左边的数值放进右边的容器里
数据类型好比有大小和不同形状从而存储方式不同的容器,而数据就是我们要灌给它的东西,数组无法改变大小,而它的存储方式与 int[]、double[] 等所指的int,double等基础数据类型相同,就可以看作大号的 int、double 的容器(即它也是数据类型),当然也遵循赋值的法则,但(a,b)对于 C 语言来说是一个指针,而且这两个指针是代表数组的首地址,它已经被确定了(是”死的“),不能再用"="进行运算,(数组名 ≠ 指针,但能 “退化” 成指针,即只要一参与运算、赋值,就自动变成指针),所以想要复制数组,只能循环逐个赋值。

  1. 多维数组容易搞反行列
    比如arr[3][4]:前面是行,后面是列,写反会逻辑混乱、越界。

总结

  • 数组是相同类型数据的集合,内存连续
  • 一维数组:类型名[长度],下标从 0 开始
  • 二维数组:表格形式,[行][列]

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询