【C语言极简自学笔记】C 语言数组详解:一维数组与二维数组

在 C 语言中,数组是一种非常重要的数据结构,它可以将多个相同类型的元素组织在一起,以便于我们进行批量处理和操作。本文将详细介绍 C 语言中的一维数组和二维数组,包括它们的定义、初始化、元素访问以及内存存储等方面的内容。

一、数组基本概念

数组是一组相同类型元素的集合,这些元素在内存中占据连续的存储空间。数组的元素可以通过下标来访问,下标从 0 开始。C 语言支持一维数组、二维数组以及多维数组,本文主要讨论一维数组和二维数组。

二、一维数组

(一)一维数组的定义

在 C 语言中,定义一维数组的一般形式为:

数据类型 数组名[数组长度];

其中,数据类型可以是 int、float、char 等基本数据类型,也可以是结构体等用户自定义数据类型;数组名是一个标识符,用于标识这个数组;数组长度必须是一个常量表达式,表示数组中元素的个数。 

例如,定义一个包含 5 个整型元素的数组:

int arr[5];

(二)一维数组的初始化

在定义数组的同时,可以对数组进行初始化,一维数组的初始化方式有以下几种:

1.完全初始化:给数组的每个元素都赋初值。

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

 2.不完全初始化:只给数组的前几个元素赋初值,后面未赋值的元素会自动初始化为 0(对于整型数组)或 0.0(对于浮点型数组)。

int arr[5] = {1, 2}; // 等价于{1, 2, 0, 0, 0}

3.省略数组长度初始化:在初始化时不指定数组的长度,编译器会根据初始化列表中的元素个数自动确定数组的长度。

int arr[] = {1, 2, 3, 4, 5}; // 数组长度为5

(三)一维数组元素的访问

数组元素可以通过下标来访问,下标的范围是 0 到数组长度减 1。例如,对于上面定义的数组 arr,它的元素可以表示为 arr [0]、arr [1]、arr [2]、arr [3]、arr [4]。

我们可以通过赋值语句给数组元素赋值,也可以通过输入函数从键盘读取值赋给数组元素。例如:

scanf("%d", &arr[1]);

 (四)一维数组的内存存储

一维数组中的元素在内存中是按照元素的顺序连续存储的,每个元素占据的存储空间大小由数据类型决定。例如,对于 int 类型的数组,每个元素占据 4 个字节(在 32 位系统中)。数组名代表数组在内存中的首地址,即第一个元素的地址。

三、二维数组

(一)二维数组的定义

二维数组可以看作是一维数组的数组,即每个元素又是一个一维数组。在 C 语言中,定义二维数组的一般形式为:

数据类型 数组名[行长度][列长度];

其中,行长度表示二维数组的行数,列长度表示每行的列数,它们都必须是常量表达式。

例如,定义一个 3 行 4 列的整型二维数组:

int arr[3][4];

 (二)初始化二维数组的初始化

二维数组的初始化方式有以下几种:

1.按行初始化:将二维数组的每一行元素用花括号括起来,逐行进行初始化。

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

2.按顺序初始化:将所有元素按行优先的顺序放在一个花括号中进行初始化。

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

3.不完全初始化:只给部分元素赋初值,未赋值的元素会自动初始化为 0。

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

此时,数组第一行前两个元素为1,2,后两个元素为0;第二行前三个元素为2,3,4,第四个元素为0;第三行第一个元素为3,其余元素均为0。

4.省略行长度初始化:在初始化时可以省略行长度,但不能省略列长度,编译器会根据初始化列表中的元素个数和列长度自动确定行长度。

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

(三)访问二维数组元素

二维数组元素的访问需要使用两个下标,第一个下标表示行,第二个下标表示列,下标均从 0 开始。例如,对于上面定义的数组 arr,它的元素可以表示为 arr [i][j],其中 i 的取值范围是 0 到 2,j 的取值范围是 0 到 3。

(四)二维数组的内存存储

二维数组在内存中也是连续存储的,它按照行优先的顺序存储,即先存储第一行的所有元素,然后存储第二行的所有元素,以此类推。例如,对于 3 行 4 列的二维数组 arr,其元素在内存中的存储顺序为 arr [0][0]、arr [0][1]、arr [0][2]、arr [0][3]、arr [1][0]、arr [1][1]、arr [1][2]、arr [1][3]、arr [2][0]、arr [2][1]、arr [2][2]、arr [2][3]。

二维数组名代表数组在内存中的首地址,即第一行第一个元素的地址。arr [i] 表示第 i 行的首地址,arr [i] 就相当于一个一维数组名。

四、数组使用注意事项

1.数组下标不能越界,否则会导致未定义行为,可能会破坏内存中的其他数据,甚至导致程序崩溃。

2.数组名是一个常量指针,不能对其进行赋值操作。例如,arr = arr + 1; 是错误的。

3.在传递数组参数时,通常需要同时传递数组的长度,因为在函数参数中,数组会退化为指针,无法获取数组的长度。

 

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

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

相关文章

04.通过OpenAPI-Swagger规范让Dify玩转Agent

dify安装 cd dify cd docker cp .env.example .env docker compose up -d准备自定义工具 我自建的PowerDNS,它的swagger如下: https://github.com/PowerDNS/pdns/blob/master/docs/http-api/swagger/authoritative-api-swagger.yaml 但需要加上&#x…

汽车产业链主表及类别表设计

(提前设计,备用) 一、汽车产业链类别表(industry_chain_category) 设计要点 1、核心字段:定义产业链分类(如零部件、整车制造、销售服务等) 2、主键约束:自增ID作为唯一标…

‌RISC-V架构的低功耗MCU多电压域优化设计

RISC-V核低功耗MCU的多电压域设计是一种优化电源管理以降低功耗的技术方案。该设计通过电源域划分、电压转换和时序管理等手段,有效降低了系统功耗并提升能效,适用于物联网和嵌入式系统等场景。 多电压域设计的基本原理是将芯片划分为多个独立供电区域&…

基于STM32、HAL库的AD7616BSTZ模数转换器ADC驱动程序设计

一、简介: AD7616BSTZ是Analog Devices公司生产的一款16位、双通道、同步采样SAR型ADC芯片,主要特点包括: 16位分辨率 双通道同步采样 最高采样率:1MSPS/通道 输入范围:10V, 5V或2.5V(软件可编程) 串行(SPI)和并行接口选项 低功耗:典型值100mW 工作温度范围:-40C至+8…

CUDA Stream 回调函数示例代码

文章目录 CUDA Stream 回调函数示例代码基本概念示例代码代码解释回调函数的特点更复杂的示例:多个回调注意事项 CUDA Stream 回调函数中使用 MPI 或 NCCL示例程序注意事项 CUDA Stream 回调函数示例代码 CUDA 中的流回调函数(stream callback)是一种在 CUDA 流中插…

全栈黑暗物质:可观测性之外的非确定性调试

一、量子计算的测不准Bug 1. 经典 vs. 量子系统的错误模式 量子程序崩溃的观测影响: 调试方法崩溃复现率观测干扰度日志打印12%35%断点调试5%78%无侵入跟踪27%9%量子态层析成像63%2% 二、量子调试工具箱 1. 非破坏性观测协议 # 量子程序的无干扰快照 from qiski…

ASP.NET8.0入门与实战

1、项目初始化 创建一个ASP.NET Core Web API的项目,取消Https和身份验证。 API项目实际上是一个控制台程序,这点可以在项目的属性的输出类型中看到。 launchSettings.json,在这里可以配置运行项目的名称,端口号,路…

Synopsys 逻辑综合的整体架构概览

目录 一、DC Shell 逻辑综合的整体架构概览 ⛓️ 逻辑综合的主要阶段(Pipeline) 二、核心架构模块详解 1. Internal Database(设计对象数据库) 2. Scheduler(调度器) 3. Rewriting Engine&#xff08…

低压电工常见知识点

一.工厂用电 1.工厂一般有电源380V和220V。 三相:黄绿红 蓝 双色 助记符:王力宏 分别对应第一相(R),第二相(S),第三相(T),零线(N),地线(PE) 单相:红 黑 对应火线(L) 零线(N) 左零右火 二.人体安全电压是36V 三.变压器的讲解 变压器的符号…

【沉浸式求职学习day27】

沉浸式求职学习 家人们谁懂啊!明天下午又实习笔试了,所以今天大部分时间还是在搞一些行测之类的东西,所以今天没什么分享给大家的,明晚会简单的和大家分享一下关于数据库的一些东西,以及和大家聊聊我笔试的感觉哈哈哈哈…

进入救援模式(物理服务器)

目录 **📌 准备工作****🚀 进入救援模式(物理服务器)****方法 1:直接修改启动参数****适用情况****操作步骤****方法 2:通过GRUB引导菜单进入(系统未完全崩溃时)****适用情况****操作步骤****两者的核心区别****如何选择?****注意事项****总结**当物理服务器无法正常…

基于Pytest接口自动化的requests模块项目实战以及接口关联方法详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、基于pytest单元测试框架的规则 1.1 模块名(即文件名)必须以test_开头或者_test结尾 1.2 类名必须以Test开头且不能有init方法 1.3 用…

汇总 JavaScript 内置对象常用方法详解

汇总 JavaScript 内置对象常用方法详解 JavaScript 提供了许多强大的内置对象,它们带有各种实用的方法,能够帮助我们更高效地编写代码。本文将介绍最常用的内置对象方法,并通过实例展示它们的使用场景。 目录 Array 数组String 字符串Obje…

OceanBase TPCC测试常见报错汇总

OceanBase TPCC测试常见报错汇总 报错1:加载测试数据时创建tablegroup失败报错2:加载测试数据时执行超时报错3:加载测试数据时funcs.sh函数找不到报错4:加载数据时报错超过租户内存上限办法一:增加租户内存办法二:调高转储线程数办法三:调整MemStore内存占比和冻结触发阈…

Flutter 在 Dart 3.8 开始支持 Null-Aware Elements 语法,自动识别集合里的空元素

近日,在 Dart 3.8 的 changelog 里正式提交了 Null-Aware Elements 语法,该语法糖可以用于在 List、Set、Map 等集合中处理可能为 null 的元素或键值对,简化显式检查 null 的场景: /之前 var listWithoutNullAwareElements [if …

SAIL-RK3588协作机器人运动控制器技术方案

一、核心能力与政策适配‌ ‌政策合规性‌ 满足工信部《智能机器人重点技术攻关指南》要求,支持 ‌EtherCAT主站协议(符合IEC 61158标准)‌,助力企业申报工业机器人研发专项补贴(最高300万元/项目)‌核心板…

Eigen几何变换类 (Transform, Quaternion等)

1. Transform 类&#xff1a;仿射/射影变换 模板参数 cpp Transform<Scalar, Dim, Mode, Options> Scalar&#xff1a;数据类型&#xff08;如 float, double&#xff09;。 Dim&#xff1a;维度&#xff08;2 或 3&#xff09;。 Mode&#xff1a;变换类型&#xf…

openGauss手工配置主备

1、初始化 创建一个操作系统用户&#xff0c;例如postgres&#xff0c;为这个用户设置PATH和LD_LIBRARY_PATH环境变量&#xff0c;指向opengauss/bin和opengauss/lib export GAUSSHOME/mnt/disk01/opengauss export PATH$GAUSSHOME/bin:$PATH export LD_LIBRARY_PATH$GAUSS…

CSS预处理器对比:Sass、Less与Stylus如何选择

引言 CSS预处理器已成为现代前端开发的标准工具&#xff0c;它们通过添加编程特性来增强纯CSS的功能&#xff0c;使样式表更加模块化、可维护且高效。在众多预处理器中&#xff0c;Sass、Less和Stylus是三个最流行的选择&#xff0c;它们各自拥有独特的语法和功能特点。本文将深…

基于Docker、Kubernetes和Jenkins的百节点部署架构图及信息流描述

以下是基于Docker、Kubernetes和Jenkins的百节点部署架构图及信息流描述,使用文本和Mermaid语法表示: 架构图(Mermaid语法) #mermaid-svg-WWCAqL1oWjvRywVJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WWCAq…