当前位置: 首页 > news >正文

【C语言】数组篇

目录

  • 引言
  • 一维数组
    • 数组的定义
    • 数组的初始化
      • 完全初始化
      • 部分初始化
      • 省略数组长度
    • 数组元素的访问
  • 多维数组
    • 二维数组的定义
    • 二维数组的初始化
      • 完全初始化
      • 部分初始化
      • 省略第一维长度
    • 二维数组元素的访问
  • 遍历数组元素
    • 遍历一维数组
    • 遍历二维数组
  • 数组作为函数参数
    • 一维数组作为函数参数
    • 二维数组作为函数参数
  • 注意事项
    • 数组越界
    • 数组名作为指针
  • 总结

引言

在 C 语言的世界里,数组是一种基础且强大的数据结构。它就像一个整齐排列的盒子,每个盒子都可以存放相同类型的数据。通过合理使用数组,我们能够高效地处理大量的数据。本文将从数组的基本概念入手,逐步深入探讨其在实际编程中的应用。

一维数组

数组的定义

在 C 语言中,定义一维数组的语法如下:

类型说明符 数组名[常量表达式];

这里的类型说明符决定了数组中每个元素的类型,比如int表示整数类型,float 表示浮点类型等。数组名是我们给这个数组起的名字,方便后续引用。而常量表达式则规定了数组的长度,也就是数组中元素的个数。
例如:

int scores[5];

这行代码定义了一个名为 scores 的整数数组,它可以存储 5 个整数。需要注意的是,常量表达式必须是一个常量或者常量表达式,不能是变量。

数组的初始化

数组的初始化有多种方式,下面我们来逐一介绍。

完全初始化

当我们知道数组中每个元素的值时,可以进行完全初始化。

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

在这个例子中,数组 numbers 的 5 个元素分别被初始化为 1、2、3、4、5。

部分初始化

如果只知道数组的部分元素值,其余元素会被自动初始化为 0。

int numbers[5] = {1, 2};

此时,numbers[0] 为 1,numbers[1] 为 2,而 numbers[2]、numbers[3] 和 numbers[4] 都为 0。

省略数组长度

当我们在初始化时提供了所有元素的值,可以省略数组的长度,编译器会自动根据初始化的值来确定数组的长度。

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

这里数组 numbers 的长度被编译器确定为 5。

数组元素的访问

数组元素通过下标来访问,下标从 0 开始。例如,对于前面定义的numbers数组,numbers[0]表示数组的第一个元素,numbers[1]表示第二个元素,以此类推。

#include <stdio.h>int main() {int numbers[5] = {1, 2, 3, 4, 5};printf("The first element is: %d\n", numbers[0]);printf("The third element is: %d\n", numbers[2]);return 0;
}

在这段代码中,我们通过下标访问了数组numbers的第一个和第三个元素,并将它们打印输出。

多维数组

二维数组的定义

二维数组可以看作是一个矩阵,它的定义语法如下:

类型说明符 数组名[常量表达式1][常量表达式2];

常量表达式 1 表示数组的行数,常量表达式 2 表示数组的列数。
例如:

int matrix[3][4];

这定义了一个 3 行 4 列的二维数组matrix。

二维数组的初始化

二维数组的初始化也有多种方式。

完全初始化

int matrix[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}
};

这里,我们将二维数组 matrix 的每个元素都进行了初始化。

部分初始化

int matrix[3][4] = {{1, 2},{5},{9, 10, 11}
};

未初始化的元素会被自动初始化为 0。

省略第一维长度

int matrix[][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}
};

编译器会根据初始化的值自动确定第一维的长度。

二维数组元素的访问

二维数组元素通过行下标和列下标来访问,行下标和列下标都从 0 开始。

#include <stdio.h>int main() {int matrix[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};printf("The element at row 1, column 2 is: %d\n", matrix[1][2]);return 0;
}

在这个例子中,我们访问了二维数组 matrix 中第二行第三列的元素。

遍历数组元素

遍历一维数组

for 循环是遍历一维数组最常用的方法,通过控制循环变量作为数组的下标来依次访问数组元素。

#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};int i;// 遍历数组并打印每个元素for (i = 0; i < 5; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

遍历二维数组

对于二维数组,通常使用嵌套的 for 循环来遍历,外层循环控制行,内层循环控制列。

#include <stdio.h>int main() {int arr[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};int i, j;// 外层循环控制行for (i = 0; i < 3; i++) {// 内层循环控制列for (j = 0; j < 4; j++) {printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

数组作为函数参数

数组可以作为函数的参数传递,这在处理大量数据时非常有用。

一维数组作为函数参数

当一维数组作为函数参数时,实际上传递的是数组的首地址。

#include <stdio.h>// 函数声明
void printArray(int arr[], int size);int main() {int numbers[5] = {1, 2, 3, 4, 5};printArray(numbers, 5);return 0;
}// 函数定义
void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}

在这个例子中,函数 printArray 接受一个一维数组和数组的长度作为参数,并将数组中的元素打印输出。

二维数组作为函数参数

二维数组作为函数参数时,需要指定第二维的长度。

#include <stdio.h>// 函数声明
void printMatrix(int matrix[][4], int rows);int main() {int matrix[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};printMatrix(matrix, 3);return 0;
}// 函数定义
void printMatrix(int matrix[][4], int rows) {for (int i = 0; i < rows; i++) {for (int j = 0; j < 4; j++) {printf("%d ", matrix[i][j]);}printf("\n");}
}

这里,函数 printMatrix 接受一个二维数组和数组的行数作为参数,并将二维数组的元素打印输出。

注意事项

数组越界

在访问数组时,一定要确保下标在合法范围内。如果下标超出了数组的长度,会导致未定义行为,可能会引发程序崩溃或产生不可预期的结果。

数组名作为指针

在大多数情况下,数组名会被隐式转换为指向数组首元素的指针。但在使用sizeof运算符时,数组名表示整个数组。

#include <stdio.h>int main() {int numbers[5] = {1, 2, 3, 4, 5};printf("The size of the array is: %zu\n", sizeof(numbers));return 0;
}

在这个例子中,sizeof(numbers) 返回的是整个数组的大小,而不是指针的大小。

总结

C 语言数组是一种非常重要的数据结构,它可以帮助我们高效地处理大量相同类型的数据。通过掌握一维数组、多维数组的定义、初始化和访问,以及数组作为函数参数的使用方法,我们能够编写出更加高效、灵活的程序。同时,要注意数组越界等问题,避免程序出现错误。希望本文能帮助你更好地理解和使用 C 语言数组。

相关文章:

【C语言】数组篇

目录 引言一维数组数组的定义数组的初始化完全初始化部分初始化省略数组长度 数组元素的访问 多维数组二维数组的定义二维数组的初始化完全初始化部分初始化省略第一维长度 二维数组元素的访问 遍历数组元素遍历一维数组遍历二维数组 数组作为函数参数一维数组作为函数参数二维…...

FreeRTOS概述

文章目录 核心文件头文件内存管理文件入口函数数据类型前缀 核心文件 最核心文件&#xff1a;task.c和list.c 文件作用tasks.c必需&#xff0c;任务操作list.c必须&#xff0c;列表queue.c基本必需&#xff0c;提供队列操作、信号量(semaphore)操作timer.c可选&#xff0c;so…...

C++ 使用红黑树的实现及迭代器完成对set和map的封装

一、红黑树的实现以及迭代器 #pragma once // 要实现完整的迭代器需要对红黑树进行改造&#xff0c;有兴趣可参考侯捷《STL源码剖析》 enum Colour {RED,BLACK };template<class T> struct RBTreeNode {RBTreeNode<T>* _left;RBTreeNode<T>* _right;RBTreeN…...

【Java从入门到起飞】面向对象编程(高级)

文章目录 1. 抽象类1.1 概述1.1.1 抽象类引入 1.2 abstract使用格式1.2.1 抽象方法1.2.2 抽象类1.2.3 抽象类的使用 1.3 抽象类的特征1.4 抽象类的细节1.5 抽象类存在的意义 2. 接口2.1 概述2.2 定义格式2.3 接口成分的特点2.3.1.抽象方法2.3.2 常量2.3.3 案例演示 2.4 基本的实…...

内网安全-横向移动PTH 哈希PTT 票据PTK 密匙Kerberos密码喷射

一.域横向pth&#xff0c;mimkatz&#xff0c;NTLM windwos server 2012 R2之前可能是NTLM和LM&#xff0c;之后为NTLM 1.mimkatz ptk 使用mimkatz进行横向移动 mimikatz sekurlsa::pth /user:administrator&#xff08;目标本地用户名&#xff09; /domain:192.168.3.32&a…...

【VMware安装Ubuntu实战分享】

在当今数字化时代&#xff0c;虚拟机技术已成为许多开发者、系统管理员以及技术爱好者的得力助手。VMware作为一款功能强大且广泛应用的虚拟化软件&#xff0c;为我们提供了便捷的环境来运行各种操作系统&#xff0c;而Ubuntu凭借其开源、稳定和易用性&#xff0c;深受广大用户…...

【推荐项目】 043-停车管理系统

043-停车管理系统 介绍 使用 springboot vuejs mysql 技术搭建框架。 智能停车管理系统描述 后端框架&#xff1a;采用Spring Boot与MySQL的强强联合&#xff0c;为系统提供稳健、高效的服务支撑。 前端框架&#xff1a;前端选用Vue.js&#xff0c;打造流畅、美观的用户交…...

【深入解析 epoll 的底层实现原理】

IO多路复用的简介select的工作原理和缺点epoll的引入和底层实现&#xff08;数据结构、系统调用&#xff09;epoll的优势和改进epoll的工作模式&#xff08;LT和ET&#xff09;在Java中的应用或相关API 需要确保每个部分逻辑清晰&#xff0c;逐步深入&#xff0c;帮助用户建立…...

Ubuntu 22.04 官方下载安装 Gradle 记录

Ubuntu 22.04 官方下载安装 Gradle 记录 Gradle 是一个强大的自动化构建工具&#xff0c;广泛用于 Java、Android 等项目的构建中。下面详细介绍如何在 Ubuntu 22.04 中使用官网下载安装 Gradle。 一、准备工作 首先&#xff0c;确保你的系统已安装 Java JDK&#xff08;推荐…...

HTTPS加密原理详解

目录 HTTPS是什么 加密是什么 HTTPS的工作流程 1.使用对称加密 2.引入非对称加密 3.引入证书机制 客户端验证证书真伪的过程 签名的加密流程 整体工作流程 总结 HTTPS是什么 HTTPS协议也是一个应用程协议&#xff0c;是在HTTP的基础上加入了一个加密层&#xff0c;由…...

无公网IP也能远程控制Windows:Linux rdesktop内网穿透实战

文章目录 前言1. Windows 开启远程桌面2. Linux安装rdesktop工具3. Win安装Cpolar工具4. 配置远程桌面地址5. 远程桌面连接测试6. 设置固定远程地址7. 固定地址连接测试 前言 如今远程办公已经从一种选择变成了许多企业和个人的必修课&#xff0c;而如何在Linux系统上高效地访…...

Unity入门学习笔记(Day01)

一.认识unity工作面板 1.1.project window&#xff08;项目面板&#xff09; 显示当前项目中的所有文件和目录&#xff0c;包含了项目里面所有的资源文件 1.2.console window&#xff08;输出面板&#xff09; 显示当前游戏开发中生成的警告错误 1.3.hierarchy window&…...

HTML中的块元素与行内元素

1.块级标签 块级元素会独占一行&#xff0c;通常用于构建页面的结构。常见的块级元素包括&#xff1a; <div>&#xff1a;通用的块级容器。没有任何语意。可以创建网页的不同部分&#xff0c;导航栏侧边栏等。 <body><div class"nav"><a hre…...

postgreSQL window function高级用法

正常使用&#xff1a;相当于对每个row做一次子查询 SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;order by 区别window frame and partition 没有order by&#xff0c; window function是对整个partition起作用&#xff0c; part…...

当中国“智算心跳”与全球共振:九章云极DataCanvas首秀MWC 2025

3月3日&#xff0c;西班牙巴塞罗那&#xff0c;全球通信与科技领域的盛会“2025世界移动通信大会&#xff08;MWC 2025&#xff09;”正式拉开帷幕。中国人工智能基础设施领军企业九章云极DataCanvas公司以全球化战略视野与硬核技术实力&#xff0c;全方位、多维度地展示了在智…...

机器视觉检测显卡与工控机选型指南

在机器视觉检测项目中,深度学习显卡和工控机的选择直接影响算法性能、系统稳定性和长期维护成本。以下是关键注意事项及建议: 一、深度学习显卡选择 核心需求分析 任务类型:检测任务复杂度(如YOLO、ResNet等模型的参数量)决定显存需求。 高分辨率图像(如4K以上)需大显存…...

配置安全网站

配置网站 确定是Debian系统 更新索引&#xff1a;apt update 安装包&#xff1a;apt upgrade -y 查看nginx状态&#xff1a;systemctl status nginx 安装&#xff1a;nginx&#xff1a;apt install nginx 启动&#xff1a;systemctl start nginx 在/var/www/里面创建一个…...

ds回答 什么是数据召回

数据召回&#xff08;Data Recall&#xff09;在不同领域有不同的具体含义&#xff0c;但核心都指向“从大量信息中筛选出相关数据”的过程。以下是其在不同场景下的定义和关键要点&#xff1a; 一、技术领域的定义&#xff08;信息检索与推荐系统&#xff09; 1. 基本概念 数…...

复现无人机的项目,项目名称为Evidential Detection and Tracking Collaboration

项目名称为Evidential Detection and Tracking Collaboration&#xff0c;主要用于强大的反无人机系统&#xff0c;涉及新问题、基准和算法研究。下面介绍项目的复现步骤&#xff1a; 安装环境&#xff1a;使用Anaconda创建并激活名为edtc的虚拟环境&#xff0c;Python版本为3…...

mac本地部署Qwq-32b记录

导语 昨天看到阿里开源了Qwq-32b&#xff0c;号称性能可以媲美Deepseek-R1。今天晚上有空就在Mac上折腾了一下&#xff0c;使用ollma进行了部署&#xff0c;效果感觉还不错&#xff0c;特此记录。 环境 硬件 型号&#xff1a;Macbook M1 Pro 14寸内存&#xff1a;512G 环境…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...