【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概述
文章目录 核心文件头文件内存管理文件入口函数数据类型前缀 核心文件 最核心文件:task.c和list.c 文件作用tasks.c必需,任务操作list.c必须,列表queue.c基本必需,提供队列操作、信号量(semaphore)操作timer.c可选,so…...
C++ 使用红黑树的实现及迭代器完成对set和map的封装
一、红黑树的实现以及迭代器 #pragma once // 要实现完整的迭代器需要对红黑树进行改造,有兴趣可参考侯捷《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,mimkatz,NTLM windwos server 2012 R2之前可能是NTLM和LM,之后为NTLM 1.mimkatz ptk 使用mimkatz进行横向移动 mimikatz sekurlsa::pth /user:administrator(目标本地用户名) /domain:192.168.3.32&a…...

【VMware安装Ubuntu实战分享】
在当今数字化时代,虚拟机技术已成为许多开发者、系统管理员以及技术爱好者的得力助手。VMware作为一款功能强大且广泛应用的虚拟化软件,为我们提供了便捷的环境来运行各种操作系统,而Ubuntu凭借其开源、稳定和易用性,深受广大用户…...
【推荐项目】 043-停车管理系统
043-停车管理系统 介绍 使用 springboot vuejs mysql 技术搭建框架。 智能停车管理系统描述 后端框架:采用Spring Boot与MySQL的强强联合,为系统提供稳健、高效的服务支撑。 前端框架:前端选用Vue.js,打造流畅、美观的用户交…...
【深入解析 epoll 的底层实现原理】
IO多路复用的简介select的工作原理和缺点epoll的引入和底层实现(数据结构、系统调用)epoll的优势和改进epoll的工作模式(LT和ET)在Java中的应用或相关API 需要确保每个部分逻辑清晰,逐步深入,帮助用户建立…...

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

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

无公网IP也能远程控制Windows:Linux rdesktop内网穿透实战
文章目录 前言1. Windows 开启远程桌面2. Linux安装rdesktop工具3. Win安装Cpolar工具4. 配置远程桌面地址5. 远程桌面连接测试6. 设置固定远程地址7. 固定地址连接测试 前言 如今远程办公已经从一种选择变成了许多企业和个人的必修课,而如何在Linux系统上高效地访…...
Unity入门学习笔记(Day01)
一.认识unity工作面板 1.1.project window(项目面板) 显示当前项目中的所有文件和目录,包含了项目里面所有的资源文件 1.2.console window(输出面板) 显示当前游戏开发中生成的警告错误 1.3.hierarchy window&…...
HTML中的块元素与行内元素
1.块级标签 块级元素会独占一行,通常用于构建页面的结构。常见的块级元素包括: <div>:通用的块级容器。没有任何语意。可以创建网页的不同部分,导航栏侧边栏等。 <body><div class"nav"><a hre…...
postgreSQL window function高级用法
正常使用:相当于对每个row做一次子查询 SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;order by 区别window frame and partition 没有order by, window function是对整个partition起作用, part…...

当中国“智算心跳”与全球共振:九章云极DataCanvas首秀MWC 2025
3月3日,西班牙巴塞罗那,全球通信与科技领域的盛会“2025世界移动通信大会(MWC 2025)”正式拉开帷幕。中国人工智能基础设施领军企业九章云极DataCanvas公司以全球化战略视野与硬核技术实力,全方位、多维度地展示了在智…...
机器视觉检测显卡与工控机选型指南
在机器视觉检测项目中,深度学习显卡和工控机的选择直接影响算法性能、系统稳定性和长期维护成本。以下是关键注意事项及建议: 一、深度学习显卡选择 核心需求分析 任务类型:检测任务复杂度(如YOLO、ResNet等模型的参数量)决定显存需求。 高分辨率图像(如4K以上)需大显存…...
配置安全网站
配置网站 确定是Debian系统 更新索引:apt update 安装包:apt upgrade -y 查看nginx状态:systemctl status nginx 安装:nginx:apt install nginx 启动:systemctl start nginx 在/var/www/里面创建一个…...
ds回答 什么是数据召回
数据召回(Data Recall)在不同领域有不同的具体含义,但核心都指向“从大量信息中筛选出相关数据”的过程。以下是其在不同场景下的定义和关键要点: 一、技术领域的定义(信息检索与推荐系统) 1. 基本概念 数…...
复现无人机的项目,项目名称为Evidential Detection and Tracking Collaboration
项目名称为Evidential Detection and Tracking Collaboration,主要用于强大的反无人机系统,涉及新问题、基准和算法研究。下面介绍项目的复现步骤: 安装环境:使用Anaconda创建并激活名为edtc的虚拟环境,Python版本为3…...

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

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...