C语言---数组

文章目录

  • [1. 数组的定义与初始化](#1. 数组的定义与初始化)
  • [2. 访问数组元素](#2. 访问数组元素)
  • [3. 数组在内存中的特点](#3. 数组在内存中的特点)
  • [4. 计算数组长度](#4. 计算数组长度)
  • [5. 多维数组](#5. 多维数组)
  • [6. 数组与函数](#6. 数组与函数)
  • [7. 常见注意事项(易错点)](#7. 常见注意事项(易错点))
  • [8. 变长数组 (VLA)](#8. 变长数组 (VLA))

在C语言中,数组(Array)是一种构造数据类型,用于存储一组类型相同且内存连续的数据。

1. 数组的定义与初始化

定义数组时需要指定元素类型和元素个数。

bash 复制代码
// 1. 定义但不初始化(值是随机的)
int arr1[5]; 

// 2. 定义并完全初始化
int arr2[5] = {1, 2, 3, 4, 5};

// 3. 部分初始化(剩余元素自动补 0)
int arr3[5] = {1, 2}; // 结果为 {1, 2, 0, 0, 0}

// 4. 自动推断长度
int arr4[] = {10, 20, 30}; // 编译器自动设长度为 3

2. 访问数组元素

索引(下标):从 0 开始,到 长度-1 结束。

语法:数组名[索引]

bash 复制代码
int a[3] = {10, 20, 30};
printf("%d", a[0]); // 输出 10
a[1] = 50;          // 修改第二个元素的值

3. 数组在内存中的特点

连续性:数组所有元素在内存中是紧挨着存放的。

固定性:数组一旦定义,其大小在运行时不可改变(除非使用动态内存分配)。

数组名:在大多数表达式中,数组名代表数组首元素的地址。

4. 计算数组长度

由于C语言不提供直接获取数组长度的函数,通常使用 sizeof 运算符:

bash 复制代码
int arr[] = {1, 2, 3, 4, 5};
int length = sizeof(arr) / sizeof(arr[0]); // 总字节数 / 单个元素字节数

5. 多维数组

最常用的是二维数组,可以看作是一个表格(行和列)。

bash 复制代码
// 定义一个 2 行 3 列的二维数组
int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};
printf("%d", matrix[1][2]); // 访问第 2 行第 3 列,输出 6

6. 数组与函数

当数组作为参数传递给函数时,它会退化(Decay)为指针。因此,在函数内部无法通过 sizeof 获取原数组长度,通常需要额外传递长度参数。

bash 复制代码
// 示例中在传入数组时需要传入长度,因为函数内部无法得到数组的长度
void printArray(int *ptr, int size) {
    for(int i = 0; i < size; i++) {
        printf("%d ", ptr[i]);
    }
}

7. 常见注意事项(易错点)

越界访问:C语言不检查数组下标是否越界。访问 arr[10](如果长度只有5)会导致未定义行为(程序崩溃或数据损坏)。

不可直接赋值:不能将一个数组直接赋值给另一个数组(例如 arr1 = arr2; 是错误的),必须使用循环逐个元素拷贝或使用 memcpy。

字符数组与字符串:字符串在C中是以 \0 结尾的字符数组。

bash 复制代码
char str[] = "Hello"; // 实际长度为 6(包含末尾的 \0)

8. 变长数组 (VLA)

在 C99 标准中,允许使用变量来定义数组长度(仅限局部变量):

bash 复制代码
int n;
scanf("%d", &n);
int arr[n]; // 长度由变量 n 决定

注意:并非所有编译器或标准(如 C11 之后变为可选)都完全支持 VLA,在嵌入式或高性能开发中通常建议使用动态内存分配 malloc 代替。

推荐文章

https://www.runoob.com/cprogramming/c-arrays.html

相关推荐
DeepFlow 零侵扰全栈可观测21 小时前
民生银行云原生业务的 eBPF 可观测性建设实践
运维·开发语言·分布式·云原生·金融·php
每天回答3个问题21 小时前
Lua 函数教程
开发语言·ue5·ue4·lua
后端小张21 小时前
【JAVA 进阶】Spring Boot 中 AOP 切面编程全解析:从基础到实战进阶
java·开发语言·人工智能·spring boot·后端·spring·spring cloud
小龙报21 小时前
【算法通关指南:数据结构与算法篇 】二叉树相关算法题:1.新二叉树 2.二叉树的遍历
c语言·数据结构·c++·人工智能·物联网·算法·深度优先
天天进步20151 天前
Python全栈项目--基于Django的项目管理系统
开发语言·python·django
h_jQuery1 天前
vue项目中使用canvas实现手写文字(批注)功能
开发语言·前端·javascript
小北方城市网1 天前
第 3 课:微服务架构设计与服务治理|从分布式到微服务的进阶实战
开发语言·人工智能·分布式·python·微服务·架构·geo
superman超哥1 天前
Rust Cell与RefCell的使用场景与区别:内部可变性的精确选择
开发语言·后端·rust·refcell·rust cell·内部可变性·精确选择
搞全栈小苏1 天前
【Python 爬虫实战】一键批量下载 Python 官网 FTP 所有版本全部文件(多线程 + 断点续传 + 禁用系统代理 完整版)
开发语言·爬虫·python
一然明月1 天前
QT基本控件的使用
开发语言·qt