C 数组详解

简介: 在C语言中,数组是一种用于存储多个同类型数据的集合。本文介绍了数组的基本特性与使用方法,包括定义与初始化、索引访问、多维数组、指针操作、大小计算及函数传递等内容。数组名可视为指向首元素的指针,支持遍历、排序与查找等常见操作。数组大小固定,访问越界会导致未定义行为。此外,还可以将数组嵌套在结构体中以增加数据复杂性。

在C语言中,数组是一种用于存储多个同类型数据的集合,其基本特性和使用方法如下:

1. 数组的定义和初始化

数组由一系列相同类型的元素构成,可以通过如下方式定义和初始化:

// 定义数组
int arr[5]; // 创建一个可以存储5个整数的数组

可以在定义时初始化数组:

int arr[5] = {
   1, 2, 3, 4, 5}; // 定义并初始化数组

如果省略数组大小,编译器会根据初始化列表的元素数量自动确定大小:

int arr[] = {
   1, 2, 3, 4, 5}; // 自动确定大小,大小为5

2. 数组索引

数组的索引从0开始,可以通过下标访问各个元素:

int first = arr[0]; // 访问第一个元素
arr[2] = 10; // 修改第三个元素的值为10

3. 多维数组

C语言支持多维数组,一般使用二维数组较为常见:

int matrix[3][4]; // 创建一个3行4列的二维数组

初始化二维数组的方式:

int matrix[2][3] = {
   
    {
   1, 2, 3},
    {
   4, 5, 6}
};

4. 数组与指针

数组名在表达式中通常被视为指向第一个元素的指针:

int *p = arr; // p指向数组的第一个元素

可以通过指针实现数组的遍历:

for (int i = 0; i < 5; i++) {
   
    printf("%d ", *(p + i)); // 通过指针访问数组元素
}

5. 数组的大小

可以使用sizeof运算符计算数组的大小(以字节为单位):

size_t size = sizeof(arr); // 数组的总字节数
size_t length = sizeof(arr) / sizeof(arr[0]); // 数组中元素的个数

6. 数组的传递

在C语言中,数组不能直接作为函数参数传递,实际上传递的是指向数组第一个元素的指针:

void function(int arr[], int size) {
   
    for (int i = 0; i < size; i++) {
   
        printf("%d ", arr[i]);
    }
}

int main() {
   
    int arr[] = {
   1, 2, 3, 4, 5};
    function(arr, 5); // 传递数组
}

7. 数组的限制

  • 数组的大小在定义时必须是常量(不可变量),不能在运行时动态改变。
  • 数组元素之外的访问会导致未定义行为(如越界)。
  • C语言不提供数组的内置边界检查,因此访问边界外的元素可能导致程序崩溃或数据错误。

8. 常见操作

  • 遍历:使用循环结构访问和修改数组元素。
  • 排序:可以使用冒泡排序、选择排序等经典算法对数组进行排序。
  • 查找:可以实现线性查找或二分查找等算法来查找数组中的元素。

9. 嵌套数组和结构体

可以将数组嵌套在结构体中,增加数据的复杂性:

typedef struct {
   
    char name[30];
    int scores[5];
} Student;
相关文章
|
JSON 编译器 开发工具
VS Code阅读Android源码
VS Code阅读Android源码
1364 1
|
6月前
|
Java 应用服务中间件 API
Servlet开发流程 (里面有Idea项目添加Tomcat依赖详细教程)
本文详细介绍了Servlet的开发流程,包括在IntelliJ IDEA中添加Tomcat依赖的详细教程。通过上述步骤,开发者可以快速搭建并运行一个基本的Servlet应用,理解并掌握Servlet的开发流程对于Java Web开发至关重要。希望本文能够帮助开发者顺利进行Servlet开发,提高工作效率。
486 78
|
9月前
|
域名解析 UED SEO
如何选择网站模板建设网站?
本文主要介绍了网站模板的相关知识,包括什么是网站模板、选择模板的标准、使用网站模板建设网站的方法和部署步骤等。同时,文章强调了选择高品质模板的重要性,并提供了丰富的模板界面和搜索引擎优化元素,帮助用户快速搭建网站并提升用户体验。
373 8
|
Java 数据库连接 数据库
java系列之~如何给sqlite数据库添加表
这篇文章介绍了如何在Java中使用SQLite JDBC驱动来连接SQLite数据库,并提供了示例代码来演示如何创建一个新的数据库表。
|
8月前
|
人工智能 算法 搜索推荐
算法备案全流程攻略:保姆级教程
在AI热潮下,算法成为互联网服务的核心驱动力,但也带来了大数据杀熟、算法歧视等问题。为规范行业发展,算法备案制度应运而生。该制度涵盖网站、APP等多种产品形式,要求企业在2个月内完成备案,依据《互联网信息服务算法推荐管理规定》等法规。未备案企业可能面临无法上线、罚款甚至刑罚的后果。备案流程包括注册、主体备案、信息填报及审核,确保算法合规运营。通过悬挂备案号、标识AI生成内容和定期自查,企业需持续维护算法安全与合规。
|
边缘计算 运维 5G
|
12月前
|
消息中间件 Python
深入理解操作系统的进程间通信(IPC)机制
本文将探讨操作系统中的核心概念——进程间通信(IPC),揭示其在系统运作中的重要性及实现方式。通过分析不同类型的IPC手段,如管道、信号、共享内存等,帮助读者更好地理解操作系统的内部工作原理及其在实际应用中的表现。
560 1
|
机器学习/深度学习 运维 算法
Python基于局部离群因子LOF算法(LocalOutlierFactor)实现信用卡数据异常值检测项目实战
Python基于局部离群因子LOF算法(LocalOutlierFactor)实现信用卡数据异常值检测项目实战
|
Web App开发 编解码 JavaScript
【Vue篇】Vue 项目下载、介绍(详细版)
【Vue篇】Vue 项目下载、介绍(详细版)
192 3
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
474 1