C语言---------数组

                                                                                                                       我们终会闪耀的像VVS

摘要:数组是C语言中最基础却最重要的数据结构之一。本文将从零开始讲解数组的概念、用法及常见问题,助你快速掌握这一核心知识点!

 什么是数组?

1.数组的定义:

数组是一组相同数据类型元素的集合,这些元素在内存中连续存储,并通过下标(索引)访问。

例如:存储全班50人的成绩时,无需定义50个变量,只需一个数组即可轻松管理

2.关键特性:


1.元素类型相同

数组内的所有元素必须为同一数据类型

例如:

// ✅ 正确:所有元素均为int类型
int numbers[5] = {10, 20, 30, 40, 50}; 

// ❌ 错误:混合类型(int和char)
int mixedArr[3] = {1, 'A', 3}; 
// 实际会编译通过('A'被转为ASCII码65),但逻辑混乱,不建议!

// ❌ 错误:类型不匹配(int vs float)
float temperatures[3] = {25.5, 30, 18.0}; 
// 30是int,会被隐式转为float,合法但不规范


 

2.长度固定(编译时确定)

数组长度必须在编译时确定,无法在运行时动态改变

例如:

// ✅ 正确:编译时已知长度(5)
int arr1[5]; 

// ❌ 错误:使用变量作为长度(C89标准不支持)
int size = 10;
int arr2[size]; // C99允许(变长数组),但非所有编译器支持

// ❌ 错误:尝试扩展数组长度
int arr3[3] = {1,2,3};
arr3[3] = 4; // 越界访问!可能覆盖其他内存区域


3.下标从0开始

数组下标从0开始,最大有效下标为长度-1

例如:

int scores[5] = {90, 85, 77, 95, 80};

// ✅ 正确访问
printf("第一个元素: %d\n", scores[0]); // 输出90
printf("最后一个元素: %d\n", scores[4]); // 输出80

// ❌ 常见错误:从1开始循环
for (int i = 1; i <= 5; i++) {
    printf("%d ", scores[i]); // 当i=5时越界访问scores[5]
}

// ✅ 正确遍历方式
for (int i = 0; i < 5; i++) {
    printf("%d ", scores[i]);
}

3.小结:

通过具体例子可以看出:

  1. 类型相同:避免混合数据类型,确保逻辑清晰。
  2. 长度固定:编译时确定大小,越界访问危险极高。
  3. 下标从0:循环时务必注意边界条件(i < length)。

牢记这三个特性,能有效避免数组使用中的大部分错误 ! ! !

一维数组详解  声明与初始化  访问与遍历

1. 声明与初始化

基本格式:

//伪代码
int         arr         []          =    {0}     
数据类型   数组名称  数组内元素个数      所存的元素

例如:声明一个长度为5的整型数组(注意只声明未初始化)


int numbers[5]; 

声明并初始化:

//(方式一)
int scores[5] = {90, 85, 77, 95, 80}; 

// 自动推断长度(方式二)
float temperatures[] = {22.5, 23.0, 24.3}; // 长度为3


 

 2. 访问与遍历


通过下标访问元素(下标范围:0 到 数组长度-1):
 

int scores[5] = {90, 85, 77, 95, 80};//声明并初始化
scores[0] = 90; // 修改第一个元素
printf("第三位成绩:%d", scores[2]); // 输出第三个元素

// 使用for循环遍历数组
for(int i = 0; i < 5; i++) {
    printf("第%d个元素:%d\n", i+1, scores[i]);
}

运行结果:(符合以上预期)

 二维数组:表格化的数据存储

二维数组可视为“数组的数组”,常用于表示矩阵、表格等结构化数据。

1. 声明与初始化

 声明3行4列的二维数组(未初始化)

// 声明3行4列的二维数组
int matrix[3][4]; 

声明并初始化

// 声明并初始化
int matrix2[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

2. 遍历二维数组

for(int row = 0; row < 2; row++) {
    for(int col = 0; col < 3; col++) {
        printf("%d ", matrix2[row][col]);
    }
    printf("\n");
}//第一个循环代表行 第二个循环代表列

运行结果:(符合以上预期):

3.注意点

二维数组在声明时如: 

int matrix[3][4]; 

其中[3]可以省略但是[4]一定不能省略!!!!!!!!

因为不仅一维数组在内存中连续存储,多维数组(如二维数组、三维数组等)也是连续存储的,通常按行优先或列优先的顺序存储,但元素在内存中仍然是连续排列的。

上图为理解中的二维数组

下图为实际储存的二维数组

数组的常见问题与避坑指南

1. 数组越界访问

例如:

int arr[5] = {1,2,3,4,5};
printf("%d", arr[5]); // 错误!合法下标为0-4

**后果**:可能导致程序崩溃或输出不可预知的值。


 

2. 初始化值不足

例如:

int arr[5] = {1,2}; // 后三个元素自动初始化为0

3. 数组长度计算

例如:

int arr[5] = {1,2}; // 后三个元素自动初始化为0


实战练习:数组应用案例

案例1:求数组最大值

int findMax(int arr[], int size) {
    int max = arr[0];
    for(int i=1; i<size; i++) {
        if(arr[i] > max) max = arr[i];
    }
    return max;
}

案例2:矩阵转置

void transpose(int mat[][3], int rows) {
    int temp;
    for(int i=0; i<rows; i++) {
        for(int j=i+1; j<3; j++) {
            temp = mat[i][j];
            mat[i][j] = mat[j][i];
            mat[j][i] = temp;
        }
    }
}

总结

数组是组织数据的强大工具,熟练掌握后可为后续学习字符串、结构体等打下基础。**动手实践**是掌握数组的关键,建议尝试自己编写排序、查找等算法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值