【c语言 】数组入门

在这里插入图片描述

🎈个人主页:豌豆射手^
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:C语言
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!

【c语言 】数组入门

  • 一 初识数组
    • 1.1 数组概念
    • 1.2 数组的组成部分
    • 1.3 类比
  • 二 数组的存储方式
    • 2.1 存储方式的特点:
    • 2.3 注意事项:
  • 三 数组的定义
    • 3.1 基本定义格式
    • 3.2 示例
    • 3.3 注意事项:
  • 四 数组元素的访问方式
    • 4.1 数组元素的访问语法:
    • 4.2 示例:
    • 4.3 访问数组元素的原理:
    • 4.4 注意事项:
  • 总结

引言:

在编程的世界里,数组是一个至关重要的数据结构,它允许我们存储一系列相同类型的元素,并以索引的方式访问这些元素。

C语言作为编程的基石,自然也不例外。掌握C语言中的数组,不仅能够帮助我们理解数据结构的基础,还能为后续的编程学习打下坚实的基础。

今天,我们就来一起探索C语言中的数组,从初识数组到数组的存储方式,再到数组的定义和元素的访问方式,逐步揭开数组的神秘面纱。

在这里插入图片描述

一 初识数组

1.1 数组概念

数组,简单来说,就是一系列同类型数据的集合,这些数据在内存中占据连续的存储空间,并通过唯一的索引进行访问。

每个数组元素都可以通过其索引来单独读取或修改,这使得我们可以方便地操作数组中的每一个数据项。

数组的大小在声明时确定,且一旦确定后不可更改,这是数组的一个基本特性。

1.2 数组的组成部分

在这里插入图片描述

数组通常由以下几个主要部分组成:

1 数组名(标识符):

这是用于标识和引用数组的名称。

在编程中,我们可以使用数组名来访问或修改数组的内容。

2 数据类型:

数组用于存储相同类型的数据。数据类型可以是整数、浮点数、字符、结构体等。

数组中的所有元素都必须是相同的数据类型。

3 元素(数据):

这是存储在数组中的实际数据。

数组可以存储多个相同类型的元素,每个元素通过其在数组中的位置(索引)来唯一标识。

4 索引(下标):

索引是用于访问数组元素的数字。在大多数编程语言中,数组索引通常从0开始,这意味着第一个元素的索引是0,第二个元素的索引是1,依此类推。

通过索引,我们可以读取或修改数组中的特定元素。

5 数组长度(元素个数):

这指的是数组中元素的数量。

数组一旦分配了空间,其长度就是固定的。可以通过特定的语法或方法获取数组的长度。

另外,数组属于引用数据类型,且数组在内存中占据连续的空间。这意味着数组中的元素在内存中是顺序排列的,这有助于高效地访问和修改数组元素。

需要注意的是,不同编程语言对数组的实现和语法可能有所不同,但上述组成部分是大多数编程语言中数组的共同特征。

1.3 类比

数组的概念在现实生活中可以类比于多种情境,其中比较直观的一个例子就是图书馆的书架。

假设你正在一个图书馆的书架前,这个书架用于存放相同类型或主题的书籍。
在这里插入图片描述

书架上的每一格空间可以视为数组中的一个元素,而书架上的书籍则相当于数组中的数据。

1 书架名(数组名):

这个书架有一个标识牌,上面写着“历史类书籍”,这就相当于数组的名字,用于标识和引用这个特定的书架。

2 书籍类型(数据类型):

书架上的所有书籍都是关于历史的,这就像是数组的数据类型,它决定了这个数组可以存放什么类型的数据。

3 书籍(元素):

书架上的每一本书都是数组的一个元素。

这些书籍按照某种顺序(比如按作者、按出版日期等)排列在书架上。

4 格位(索引):

每本书在书架上都有固定的位置,比如从左到右的第一格、第二格等。

这些格位就像数组中的索引,通过它们我们可以准确地找到并取出特定的书籍。

5 书架容量(数组长度):

书架的格位数量是有限的,这限制了它能放多少本书。

这就像数组的长度,一旦定义并分配了空间,它的长度就是固定的。

通过这个例子,我们可以更直观地理解数组的概念:数组是一个有序的、固定长度的数据集合,每个元素都可以通过其索引来访问和修改。

就像图书馆的书架一样,数组提供了一种方便、高效的方式来存储和管理大量相同类型的数据。

二 数组的存储方式

在C语言中,数组在内存中的存储方式非常直接且连续。当你声明一个数组时,编译器会根据数组的类型和大小在内存中为其分配一块连续的空间。

这块空间的大小是固定的,由数组的元素类型和元素个数决定。

2.1 存储方式的特点:

1 连续性:

数组中的元素在内存中是连续排列的,没有任何间隔。这意味着数组的第一个元素存储在内存的某个地址上,而第二个元素则紧跟在第一个元素后面,依此类推。

2 固定大小:

数组的大小在声明时就已经确定,并且在程序的整个生命周期内保持不变。这意味着你不能在运行时改变数组的大小。

3 相同类型:

数组中的所有元素都是相同的数据类型。这保证了每个元素都占用相同大小的内存空间。

2.2 示例:

假设我们有一个整数数组 int arr[5],每个整数在32位系统上占用4个字节。

数组声明后,编译器会在内存中为其分配一个连续的20字节空间。

假设数组的第一个元素(arr[0])存储在内存地址 0x1000 上,我们可以根据每个元素的大小来计算出数组中其他元素的内存地址。

下面是数组 arr 在内存中存储的数据示例:

内存地址    存储内容 (十六进制)    存储内容 (十进制)    数组元素  
--------    ------------------    ----------------     -------  
0x1000      (假设的数据)           (对应的十进制值)     arr[0]  
0x1004      (假设的数据)           (对应的十进制值)     arr[1]  
0x1008      (假设的数据)           (对应的十进制值)     arr[2]  
0x100C      (假设的数据)           (对应的十进制值)     arr[3]  
0x1010      (假设的数据)           (对应的十进制值)     arr[4]

请注意,上面的“(假设的数据)”和“(对应的十进制值)”是占位符,实际的存储内容将取决于你如何初始化这个数组。

例如,如果你这样初始化数组:

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

那么内存中存储的数据将会是:

内存地址    存储内容 (十六进制)    存储内容 (十进制)    数组元素  
--------    ------------------    ----------------     -------  
0x1000      0x00000001              1                   arr[0]  
0x1004      0x00000002              2                   arr[1]  
0x1008      0x00000003              3                   arr[2]  
0x100C      0x00000004              4                   arr[3]  
0x1010      0x00000005              5                   arr[4]

每个整数值都被转换为其在内存中的二进制表示(在这个例子中是32位,即4个字节),并按照小端字节序(least significant byte first)或大端字节序(most significant byte first)存储在相应的内存地址中,这取决于你的系统架构。

在大多数现代个人计算机上,使用的是小端字节序。

2.3 注意事项:

1 越界访问:

由于数组的大小是固定的,如果你尝试访问超出数组范围的索引(例如 arr[5] 或更高的索引),这可能会导致未定义的行为,包括访问到相邻的内存区域,从而引发程序错误或安全漏洞。

2 动态内存分配:

虽然静态数组的大小是固定的,但C语言也提供了动态内存分配的功能(如使用 malloc 和 free 函数),允许你在运行时创建和销毁不同大小的数组。

总的来说,数组在C语言中的内存存储方式是直接且高效的,它使得程序能够方便地管理和操作大量相同类型的数据。然而,使用数组时也需要注意避免越界访问等潜在问题。

三 数组的定义

3.1 基本定义格式

基本格式:

type array_name[size];

type:
指定数组中每个元素的数据类型,可以是任何有效的C语言数据类型,如 int、char、float、double 等,也可以是用户自定义的数据类型。

array_name:
给数组取一个名字,这个名字在后续的代码中用来引用这个数组。

size:
一个整数常量表达式,表示数组中可以存储的元素数量。数组的大小在声明时确定,并且在整个程序的生命周期内保持不变。

3.2 示例

1 整数数组:

int numbers[5]; // 声明一个可以存储5个整数的数组

2 字符数组(字符串):

char greeting[10]; // 声明一个可以存储10个字符的数组,通常用来存储字符串(包括结尾的空字符'\0')

3 浮点数数组:

double scores[100]; // 声明一个可以存储100个双精度浮点数的数组

4 初始化数组:

在声明数组的同时,也可以对其进行初始化。初始化时,可以指定数组中的每个元素的值。

int numbers[5] = {1, 2, 3, 4, 5}; // 初始化一个整数数组  
char greeting[10] = "Hello"; // 初始化一个字符数组,字符串自动包含结尾的空字符'\0'

如果不提供全部元素的初始值,编译器会自动将未初始化的元素设置为0(对于静态存储期的数组)。

int numbers[5] = {1, 2}; // 初始化前两个元素,其余元素自动初始化为0

3.3 注意事项:

数组的大小必须是整数常量表达式,不能是变量或非常量表达式。

数组名在大多数上下文中代表数组首元素的地址,而不是数组本身。

数组越界访问(访问索引超出[0, size-1]范围的元素)是未定义行为,可能导致程序崩溃或其他不可预料的结果。

理解数组的基本定义格式是使用数组进行编程的基础,它允许你有效地管理和操作一组相关的数据元素。

四 数组元素的访问方式

在C语言中,数组元素的访问是通过使用数组名和下标(或索引)来实现的。

数组名代表数组首元素的地址,通过下标可以访问到数组中的特定元素。

下面将详细介绍C语言中数组元素的访问方式:

4.1 数组元素的访问语法:

type array_name[size];  
array_name[index]; // 访问数组中的元素

type: 数组元素的数据类型。

array_name: 数组的名字。

size: 数组的大小。

index: 要访问的元素的索引,范围从0到size - 1。

4.2 示例:

假设有一个整数数组int numbers[5] = {1, 2, 3, 4, 5};,你可以这样访问它的元素:

int first_element = numbers[0]; // 访问第一个元素,值为1  
int second_element = numbers[1]; // 访问第二个元素,值为2  
int last_element = numbers[4]; // 访问最后一个元素,值为5

当然我们也可以通过一个循环访问并打印出数组中的每个元素。

如:

#include <stdio.h>  
  
int main() {  
    // 初始化一个整数数组  
    int numbers[5] = {1, 2, 3, 4, 5};  
  
    // 访问并打印数组中的每个元素  
    printf("数组中的元素为:\n");  
    for (int i = 0; i < 5; i++) {  
        printf("%d ", numbers[i]);  
    }  
    printf("\n"); // 打印换行符,使得输出结果更加整洁  
  
    return 0;  
}

**运行结果: **

数组中的元素为:  
1 2 3 4 5

4.3 访问数组元素的原理:

数组在内存中是连续存储的,数组名(不带下标)表示数组首元素的地址。

通过给数组名加上一个下标,编译器会计算出该下标对应元素的地址,然后访问该地址上的值。

具体来说,数组元素的地址可以通过以下公式计算:

element_address = base_address + (index * sizeof(element_type))

base_address:数组首元素的地址(即数组名本身代表的地址)。

index:要访问的元素的索引。

sizeof(element_type):数组中每个元素的大小(以字节为单位)。

例如,arr[2] 的地址就是基地址(第一个元素的地址)加上 2 * sizeof(int)(因为你要跳过前两个元素)。

4.4 注意事项:

1 数组下标从0开始:

在C语言中,数组的下标是从0开始计数的,所以第一个元素的索引是0,第二个元素的索引是1,依此类推。

2 数组越界:

如果访问的数组下标超出了数组的实际范围(即下标小于0或大于等于数组大小),就会发生数组越界。

这是未定义行为,可能导致程序崩溃、数据损坏或其他不可预测的后果。因此,在访问数组元素时,必须确保下标在有效范围内。

总结

通过本次的学习,我们深入了解了C语言中的数组这一基础数据结构。我们认识到,数组是一种能够存储多个相同类型元素的连续内存空间,通过索引可以方便地访问数组中的每一个元素。

在定义数组时,我们需要明确数组的类型、大小和名称,而在访问数组元素时,则需要使用正确的索引。

同时,我们也需要注意数组的一些特性,比如数组名代表首元素的地址、数组下标从0开始等。

掌握了这些基础知识后,我们就可以更加灵活地运用数组来解决实际问题,为后续的编程学习奠定坚实的基础。

希望本次学习能够为大家带来收获,也期待大家在后续的编程旅程中能够不断探索、进步。

这篇文章到这里就结束了

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是豌豆射手^,让我们我们下次再见

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redhat Linux(RHEL) - Primavera P6 EPPM 安装及分享

引言 继上一期发布的Oracle Linux版环境发布之后&#xff0c;近日我又制作了基于Redhat Linux 的P6虚拟机环境&#xff0c;同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机&#xff0c;请先与Oracle Primavera销售代表…

什么是农业四情监测设备?

【TH-Q2】智慧农业四情监测设备是一种高科技的农田监测工具&#xff0c;旨在实时监测和管理农田中的土壤墒情、作物生长、病虫害以及气象条件。具体来说&#xff0c;它主要包括以下组成部分&#xff1a; 气象站&#xff1a;用于监测气温、湿度、风速等气象数据&#xff0c;为农…

proxy配置代理

通过代理配置可以实现以下几个作用 跨域请求处理&#xff1a;当前端应用运行在一个域名下&#xff0c;而需要请求的 API 接口位于另一个域名下时&#xff0c;由于浏览器的同源策略限制&#xff0c;会导致跨域请求失败。通过代理配置&#xff0c;可以将前端应用的请求先发送到同…

基于鹦鹉优化算法(Parrot optimizer,PO)的无人机三维路径规划(提供MATLAB代码)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…

2024最新最全【网络安全】学习路线,零基础入门到精通

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

Linux安装Mysql8.0

本案例为linux安装mysql8.0.27 若非新服务器可先查看是否已安装mysql&#xff0c;若已安装先进行卸载。 1、Linux查看glibc版本信息&#xff0c;下载相应的MYSQL ldd --version2、mysql下载 https://downloads.mysql.com/archives/community/ 3、安装 linux打开目录&#xf…

python数据类型 -- 元组Tuple

你好, 我是木木, 目前正在做两件事   1. 沉淀自己的专业知识   2. 探索了解各种副业项目&#xff0c;同时将探索过程进行分享&#xff0c;帮助自己以及更多朋友找到副业, 做好副业 文末有惊喜 在Python中&#xff0c;元组&#xff08;tuple&#xff09;是一种不可变序列类型&…

(二十四)Flask之flask-session组件

目录&#xff1a; 每篇前言&#xff1a;Flask-session 每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于…

qt-C++笔记之使用Cmake来组织和构建QWidget工程项目

qt-C笔记之使用Cmake来组织和构建QWidget工程项目 —— 杭州 2024-03-10 code review! 文章目录 qt-C笔记之使用Cmake来组织和构建QWidget工程项目1.运行2.文件结构3.CMakeLists.txt4.main.cpp5.widget.h6.widget.cpp7.widget.ui 1.运行 2.文件结构 3.CMakeLists.txt 代码 c…

批量文本处理:轻松提取与整理大量文本内容

在数字时代&#xff0c;内容创作已成为企业与个人传递信息、展示品牌形象的重要手段。然而&#xff0c;面对海量的文本信息&#xff0c;如何高效地提取关键内容&#xff0c;并将其转化为引人注目的标题和宣传软文&#xff0c;成为了摆在我们面前的一大挑战。 第一步&#xff0…

电脑桌面图标变大了怎么恢复?5种简单方法帮你恢复正常

在使用电脑的过程中&#xff0c;有时候我们可能会遇到桌面图标变得异常大的情况。这种问题不仅影响了桌面的整洁度&#xff0c;也可能会影响我们的操作体验。电脑桌面图标变大了怎么恢复&#xff1f;如果你也遇到了这种情况&#xff0c;不用担心&#xff0c;本文将为你介绍五种…

【C++从0到王者】第五十二站:跳表

文章目录 一、什么是跳表二、skiplist的效率三、skiplist的实现 一、什么是跳表 skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价值是一样的&#xff0c;可以作为key或者key/value的查找模型。 skiplist&#xff0c;…

c++的STL(3)-- deque容器

目录 deque概述 deque的内存模型 注意: 1. deque的默认构造(和vector类似) 代码: 2. deque的有参构造(和vector类似) 代码: 3. deque容器在首部和尾部添加或者元素 代码: 相关知识点: 4. deque容器的元素个数 (和vector类似) 代码: 5. deque在指定位置插入元素(和…

Linux搭建ftp服务

使用yum 进行安装 # 在线安装FTP yum install -y vsftpd 安装完成后查看ftp状态 # 查看ftp状态 systemctl status vsftpd.service # 启动ftp状态 重启&#xff1a;restart&#xff0c;停止&#xff1a;stop&#xff0c;开机自启&#xff1a;enable&#xff0c;关闭开机自启&…

【小黑送书—第十二期】>>一本书讲透Elasticsearch:原理、进阶与工程实践(文末送书)

Elasticsearch 是一种强大的搜索和分析引擎&#xff0c;被广泛用于各种应用中&#xff0c;以其强大的全文搜索能力而著称。 不过&#xff0c;在日常管理 Elasticsearch 时&#xff0c;我们经常需要对索引进行保护&#xff0c;以防止数据被意外修改或删除&#xff0c;特别是在进…

图片二维码能长期扫码展示吗?在线图片快速生码的文字教学

很多人在制作图片二维码的时候&#xff0c;比较关注的问题一个是扫码次数&#xff0c;另一个是二维码有效期&#xff0c;那么满足这两个需求的图片二维码该如何制作呢&#xff1f;想要制作不限制扫码次数并且长期有效的图片二维码&#xff0c;大家可以通过图片二维码生成器的功…

分库分表浅析原理

数据库存放数据大了&#xff0c;查询等操作就会存在瓶颈&#xff0c;怎么办&#xff1f; 1. 如果是单张表数据大了&#xff0c;可以在原有库上新建几张表table_0、table_1、table_2、.....table_n 写程序对数据进行分表&#xff1a; --这里提供一种一种分表策略,这里只需维护…

动态规划-背包问题 分析+代码

这里写自定义目录标题 介绍背包问题过程分析例题题目说明代码输出结果 介绍背包问题 背景&#xff1a;在现实生活中&#xff0c;我们常常会面临需要在有限空间内做出最优选择的情况&#xff0c;比如旅行时需要选择携带哪些物品&#xff0c;或者在资源有限的情况下选择最有利可图…

EASY-LASER激光对中仪维修E710镭射仪联轴器维修

Easy-Laser激光对中仪维修常见故障&#xff1a;触摸屏损坏&#xff08;屏碎&#xff0c;不显示&#xff0c;黑屏&#xff0c;蓝屏&#xff0c;无背光等&#xff09;&#xff0c;对中仪电路板损坏&#xff0c;对中仪接收装置电路板维修&#xff0c;对中仪发射控制装置电路板等均…

CubeMX使用教程(2)——如何点亮LED

在上一章&#xff0c;我们完成了CubeMX的环境配置&#xff0c;这一章我们通过CubeMX来完成点亮LED的工作。 通过LED原理图可知&#xff0c;如果我们要点亮LD1&#xff08;第一个灯&#xff09;&#xff0c;它对应开发板的PC8端口&#xff0c;因此我们应该在CubeMX中将PC8配置为…