当前位置: 首页 > 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 环境…...

实验三 Python 数据可视化 Python 聚类-K-means(CQUPT)

一、实验目的 Python 数据可视化&#xff1a; 1、学习使用 jieba、wordcloud 等类库生成词云图。 2、学习使用 Matplotlib 库进行数据可视化。 Python 聚类-K-means&#xff1a; 1、理解聚类非监督学习方法的基本原理。 2、掌握 Python、numpy、pandas、sklearn 实现聚类…...

通义万相2.1:开启视频生成新时代

摘要&#xff1a;文章开篇便点明了通义万相2.1在视频生成领域的重大突破&#xff0c;强调其作为阿里云通义系列AI模型的重要成员&#xff0c;不仅是简单的模型升级&#xff0c;更是视频生成技术迈向更智能、高效、精准的重要里程碑。其核心技术包括自研的高效VAE和DiT架构&…...

爬虫案例十一js逆向数位观察网

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、网站分析二、代码总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 爬虫案例十一js逆向数位观察网 提示&#xff1a;以下是本篇…...

WSL安装及问题

1 概述 Windows Subsystem for Linux&#xff08;简称WSL&#xff09;是一个在Windows 10\11上能够运行原生Linux二进制可执行文件&#xff08;ELF格式&#xff09;的兼容层。它是由微软与Canonical公司合作开发&#xff0c;开发人员可以在 Windows 计算机上同时访问 Windows 和…...

WordPress开发到底是开发什么?

WordPress 开发主要涉及基于 WordPress 平台构建、定制和扩展网站功能的过程。它不仅仅是简单的网站搭建&#xff0c;而是通过代码和技术实现个性化需求。 以下是 WordPress 开发的核心内容&#xff1a; 1. 主题开发&#xff08;Theme Development&#xff09; 功能&#xff…...

元脑服务器的创新应用:浪潮信息引领AI计算新时代

浪潮信息的元脑 R1 服务器现已全面支持开源框架 SGLang&#xff0c;能够在单机环境下实现 DeepSeek 671B 模型的高并发性能&#xff0c;用户并发访问量超过1000。通过对 SGLang 最新版本的深度适配&#xff0c;元脑 R1 推理服务器在运行高性能模型时&#xff0c;展现出卓越的处…...

SQL Server查询计划操作符(7.3)——查询计划相关操作符(9)

7.3. 查询计划相关操作符 78)Repartition Streams:该操作符消费多个输入流并产生多个输出流。期间,记录内容与格式保持不变。如果查询优化器使用一个位图过滤(bitmap filter),则输出流中的数据行数将会减少。一个输入流的每行记录被放入一个输出流。如果该操作符保留顺序…...

单片机项目复刻需要的准备工作

一、前言 复刻单片机的项目的时候&#xff0c;有些模块是需要焊接的。很多同学对焊接没有概念。 这里说一下做项目的基本工具。 比如&#xff1a;像这种模块&#xff0c;都需要自己焊接了排针才可以链接的。 二、基本模块 2.1 单排排针 一些模块买回来是没有焊接的&#x…...

【哇! C++】类和对象(五) - 赋值运算符重载

目录 ​编辑 一、运算符重载 1.1 运算符重载概念 1.2 全局运算符重载 1.3 运算符重载为成员函数 二、赋值运算符重载的特性 2.1 赋值运算符重载需要注意的点 2.2 赋值运算符重载格式 2.2.1 传值返回 2.2.2 传引用返回 2.2.3 检查自己给自己赋值 三、赋值运算符重载的…...

SpringCloud系列教程(十三):Sentinel流量控制

SpringCloud中的注册、发现、网关、服务调用都已经完成了&#xff0c;现在就剩下最后一部分&#xff0c;就是关于网络控制。SpringCloud Alibaba这一套中间件做的非常好&#xff0c;把平时常用的功能都集成进来了&#xff0c;而且非常简单高效。我们下一步就完成最后一块拼图Se…...