【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 语言数组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31107.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot-自定义注解

1.注解的概念 注解是一种能被添加到java代码中的【元数据&#xff0c;类、方法、变量、参数和包】都可以用注解来修饰。用来定义一个类、属性或一些方法&#xff0c;以便程序能被捕译处理。 相当于一个说明文件&#xff0c;告诉应用程序某个被注解的类或属性是什么&#xff0c…

低代码开发直聘管理系统

低代码 DeepSeek 组合的方式开发直聘管理系统&#xff0c;兼职是开挂的存在。整个管理后台系统 小程序端接口的输出&#xff0c;只花了两个星期不到。 一、技术栈 后端&#xff1a;SpringBoot mybatis MySQL Redis 前端&#xff1a;Vue elementui 二、整体效果 三、表结…

【面试】Kafka

Kafka 1、为什么要使用 kafka2、Kafka 的架构是怎么样的3、什么是 Kafka 的重平衡机制4、Kafka 几种选举过程5、Kafka 高水位了解过吗6、Kafka 如何保证消息不丢失7、Kafka 如何保证消息不重复消费8、Kafka 为什么这么快 1、为什么要使用 kafka 1. 解耦&#xff1a;在一个复杂…

文件操作详解(万字长文)

C语言文件操作 一、为什么使用文件&#xff1f;二、文件分类三、文件的打开和关闭四、文件的顺序读写4.1fputc4.2fgetc4.3fputs4.4fgets4.5 fprintf4.6 fscanf4.7 fwrite4.8 fread 五、文件的随机读写5.1 fseek5.2 ftell和rewind六、文件读取结束的判定七、文件缓冲区 一、为什…

突破极限!蓝耘通义万相2.1引爆AI多模态新纪元——性能与应用全方位革新

云边有个稻草人-CSDN博客 目录 一、 引言 二、 蓝耘通义万相2.1版本概述 三、 蓝耘通义万相2.1的核心技术改进 【多模态数据处理】 【语音识别与文本转化】 【自然语言处理&#xff08;NLP&#xff09;改进】 【跨平台兼容性】 四、 蓝耘注册 部署流程—新手也能轻松…

力扣-股票买入问题

dp dp元素代表最大利润 f[j][1] 代表第 j 次交易后持有股票的最大利润。在初始状态&#xff0c;持有股票意味着你花钱买入了股票&#xff0c;此时的利润应该是负数&#xff08;扣除了买入股票的成本&#xff09;&#xff0c;而不是 0。所以&#xff0c;把 f[j][1] 初始化为负…

ubuntu22.04本地部署OpenWebUI

一、简介 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离线运行。它支持各种 LLM 运行器&#xff0c;如 Ollama 和 OpenAI 兼容的 API&#xff0c;并内置了 RAG 推理引擎&#xff0c;使其成为强大的 AI 部署解决方案。 二、安装 方法 …

Unity开发——CanvasGroup组件介绍和应用

CanvasGroup是Unity中用于控制UI的透明度、交互性和渲染顺序的组件。 一、常用属性的解释 1、alpha&#xff1a;控制UI的透明度 类型&#xff1a;float&#xff0c;0.0 ~1.0&#xff0c; 其中 0.0 完全透明&#xff0c;1.0 完全不透明。 通过调整alpha值可以实现UI的淡入淡…

LVGL直接解码png图片的方法

通过把png文件解码为.C文件&#xff0c;再放到工程中的供使用&#xff0c;这种方式随时速度快&#xff08;应为已经解码&#xff0c;代码中只要直接加载图片数据显示出来即可&#xff09;&#xff0c;但是不够灵活&#xff0c;适用于哪些简单又不经常需要更换UI的场景下使用。如…

【算法day5】最长回文子串——马拉车算法

最长回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 https://leetcode.cn/problems/longest-palindromic-substring/description/ 算法思路&#xff1a; class Solution { public:string longestPalindrome(string s) {int s_len s.size();string tmp …

JavaWeb-HttpServletRequest请求域接口

文章目录 HttpServletRequest请求域接口HttpServletRequest请求域接口简介关于请求域和应用域的区别 请求域接口中的相关方法获取前端请求参数(getParameter系列方法)存储请求域名参数(Attribute系列方法)获取客户端的相关地址信息获取项目的根路径 关于转发和重定向的细致剖析…

Dify 本地部署教程

目录 一、下载安装包 二、修改配置 三、启动容器 四、访问 Dify 五、总结 本篇文章主要记录 Dify 本地部署过程,有问题欢迎交流~ 一、下载安装包 从 Github 仓库下载最新稳定版软件包,点击下载~,当然也可以克隆仓库或者从仓库里直接下载zip源码包。 目前最新版本是V…

css错峰布局/瀑布流样式(类似于快手样式)

当样式一侧比较高的时候会自动换行&#xff0c;尽量保持高度大概一致&#xff0c; 例&#xff1a; 一侧元素为5&#xff0c;另一侧元素为6 当为5的一侧过于高的时候&#xff0c;可能会变为4/7分部dom节点 如果不需要这样的话删除样式 flex-flow:column wrap; 设置父级dom样…

Docker入门篇1:搜索镜像、拉取镜像、查看本地镜像列表、删除本地镜像

大家好我是木木&#xff0c;在当今快速发展的云计算与云原生时代&#xff0c;容器化技术蓬勃兴起&#xff0c;Docker 作为实现容器化的主流工具之一&#xff0c;为开发者和运维人员带来了极大的便捷 。下面我们一起开始入门第一篇&#xff1a;搜索镜像、拉取镜像、查看本地镜像…

利用pdf.js+百度翻译实现PDF翻译,创建中文PDF

基于JavaScript的PDF文档解析与智能翻译系统开发实践 一、功能预览 1.1 PDF加载 1.2 PDF翻译 二、系统架构设计 2.1 PDF智能翻译系统架构设计 层级模块名称功能描述技术实现呈现层Canvas渲染器PDF文档可视化渲染PDF.js + 动态视口计算 + 矩阵变换

虚函数和虚表的原理是什么?

虚函数是一个使用virtual关键字声明的成员函数&#xff0c;在基类中声明虚函数&#xff0c;在子类中可以使用override重写该函数。虚函数根据指针或引用指向的实际对象调用&#xff0c;实现运行时的多态。 虚函数表&#xff08;虚表&#xff09;是一个用于存储虚函数地址的数组…

运行OpenManus项目(使用Conda)

部署本项目需要具备一定的基础&#xff1a;Linux基础、需要安装好Anaconda/Miniforge&#xff08;Python可以不装好&#xff0c;直接新建虚拟环境的时候装好即可&#xff09;&#xff0c;如果不装Anaconda或者Miniforge&#xff0c;只装过Python&#xff0c;需要确保Python是3.…

vulnhub靶场之【digitalworld.local系列】的vengeance靶机

前言 靶机&#xff1a;digitalworld.local-vengeance&#xff0c;IP地址为192.168.10.10 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 kali采用VMware虚拟机&#xff0c;靶机选择使用VMware打开文件&#xff0c;都选择桥接网络 这里官方给的有两种方式&#xff…

纯html文件实现目录和文档关联

目录结构 效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>项目结题报告</title><style lang"scss">::-webkit-scrollbar {width: 6px;height: 6px;}::-webkit-scro…

计算机网络——交换机

一、什么是交换机&#xff1f; 交换机&#xff08;Switch&#xff09;是局域网&#xff08;LAN&#xff09;中的核心设备&#xff0c;负责在 数据链路层&#xff08;OSI第二层&#xff09;高效转发数据帧。它像一位“智能交通警察”&#xff0c;根据设备的 MAC地址 精准引导数…