当前位置: 首页 > news >正文

【C语言】数组概述

🚩纸上得来终觉浅, 绝知此事要躬行。
🌟主页:June-Frost
🚀专栏:C语言

🔥该篇将带你了解 一维数组,二维数组等相关知识。

目录:

  • 📘前言:
  • 🌟一维数组:
    • 创建
    • 初始化
    • 使用
    • 存储表现
  • 🌟二维数组:
    • 创建
    • 初始化
    • 使用
    • 存储表现
  • 🌟数组越界
  • 🌟数组名的含义
  • 🌟冒泡排序
  • ❤️ 结语

📘前言:

 C语言中,如果想存储一个整型,那么我们可以通过创建一个整型变量去存储一个数,如果想要存储一组相同类型的数,如果依次创建变量会显得很繁琐,C语言中提供了数组的概念,可以将一组相同类型的数据一次存储起来。 数组—— 一组相同类型元素的集合。


🌟一维数组:

创建

数组的创建方式:

例如:
int arr[10];
这个声明定义了一个arr数组,其中有10个元素,每个元素都是整型。
📙注意:

针对 const_n 有两种情况:

  • C99 标准中引入了变长数组的概念,使得数组在创建的时候可以使用变量,但是这样的数组不能初始化
    例如: gcc环境下,int n = 0; int arr[n];
  • C99 标准之前,数组的大小只能是常量表达式。例如:VS2022,VS2019等IIDE下,int arr[10];

初始化

初始化:在创建数组的同时给数组的内容一些合理初始值 。
初始化的一些方式:

  • 完全初始化:
    int arr[5] = { 1,2,3,4,5 };
  • 不完全初始化:
    int arr[5] = { 1,2,3 };剩余的元素都默认是 0.
    int arr[5] = { 0 };第一个元素被赋值0,其他元素默认为0,使得全部元素被赋0.
  • 省略数组大小:
    int arr[] = {1,2,3,4,5}; 省略数组的大小后,数组必须初始化,数组的元素个数根据初始化的内容来确定。
    char arr[] = "abc"; 4 个元素。
    char arr[] = { 'a','b','c' }; 3个元素
    char arr[] = { 97,'b','c' };数组内容与第二个一摸一样。

使用

数组下标是用来访问数组里每个元素的唯一标识符,每个数组的元素都有自己的下标,数组下标是从0开始,依次递增。

例如:

 想要访问数组元素,就需要使用操作符 [ ] (下标引用操作符),它其实就是数组访问的操作符。
 [ ] 有两个操作数,一个是数组名称,一个是下标,例如:想要访问第一个元素,只需要 arr[0] 即可。所以,我们很容易就可以拿到数组的每个元素。
例如:

#include<stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

存储表现

int arr[] = { 1,2,3};每个元素的地址打印一下:

可以发现每个元素地址的差为4,而一个地址管理一个字节,这意味着地址之前有4个字节,也就是1个整型。
如图:

通过观察地址,我们可以发现:数组在内存中是连续存放的。并且,随着数组下标的增长,元素的地址,也在有规律的递增。


🌟二维数组:

 二维数组是一种特殊的数组,它由一个或多个行和列组成,可以一次存储多组数据。

创建

基本形式:

例如:int arr[3][4] 创建了一个3行4列的数组,每个元素都是int。


初始化

初始化的一些方式:

  • 完全初始化:
    int arr[2][2] = { 1,2,3,4 };
    int arr[2][2] = { {1,2},{3,4} };
  • 不完全初始化:
    int arr[3][4] = { 1,2,3,4 };
    int arr[3][4] = { {1,2},{3,4} };
  • 省略行:
    int arr[][2] = { {1,2},{3,4} };
    int arr[][4] = {1,2,3,4,5};
    二维数组有初始化,行可以省略,列不可以省略。

使用

二维数组的使用同一维数组一样,通过下标访问元素。
int arr[3][4] = { {1,2,3,4},{3,4,5,6},{5,6,7,8} };


例如,访问整型8 ,arr[2][3] 即可。这样就可以遍历访问每一个元素。

#include<stdio.h>
int main()
{int arr[3][4] = { {1,2,3,4},{3,4,5,6},{5,6,7,8} };int row = 0;for (row = 0; row < 3; row++){int col = 0;for (col = 0; col < 4; col++){printf("%d ", arr[row][col]);}printf("\n");}return 0;
}

存储表现

将上述例子的地址打印出来:

可以发现,二维数组在内存中也是连续存储的(从低地址到高地址)。所以我们可以将二维数组看作是一维数组的集合。


🌟数组越界

  • 数组的下标是有范围限制的。

  • 数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。

  • C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的


🌟数组名的含义


观察上图,可以发现数组名是首元素地址。

但是如果是&arr,则是取出了整个数组的地址,+1直接跳过了整个数组。不仅如此,在计算数组大小时sizeof(arr),这里的arr也是整个数组。
所以针对这些情况,有着如下结论:

  • sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组
  • &数组名,取出的是数组的地址。&数组名,数组名表示整个数组
  • 除上述两种情况外,通常数组名是数组首元素的地址。

🌟冒泡排序

要求:将一个整型数组的数据排列为升序。例如:将 9 8 7 6 5 4 3 2 1排列为 1 2 3 4 5 6 7 8 9 。

冒泡排序的核心思想为两两相邻的元素进行比较。每一趟冒泡排序使得一个数字到达最终应该出现的位置。

例如:第一趟冒泡排序,将9放到最大位置处。

 如果按照上面的例子,排列10个数就需要9趟冒泡排序。(排列n个数最差情况需要排列n-1次)。
 第一趟冒泡排序(将9归位)需要对比9次,第二趟冒泡排序(将8归位)需要对比8次,第七趟冒泡排序(将7归位)需要对比7次,依次类推。

代码如下:

#include<stdio.h>
void bubble_sort(int arr[10], int sz)
{int i = 0;for (i = 0; i < sz-1; i++){int flag = 1; //标记int j = 0;for (j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){flag = 0;int temp = 0;temp = arr[j + 1];arr[j + 1] = arr[j];arr[j] = temp;}}if (flag == 1)//如果等于1表示数组数据已经有序{break;}}
}
int main()
{int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr,sz);int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

flag变量的解释:

哪怕一开始有序或者过程中有序都不会停止进入循环,所以我们可以在每一趟冒泡循环开始前就定义一个标记,如果在两两比较中不存在交换,那么就证明该数组元素已然有序,这样就可以减少循环次数,优化代码。


❤️ 结语

文章到这里就结束了,如果对你有帮助,你的点赞将会是我的最大动力,如果大家有什么问题或者不同的见解,欢迎大家的留言~

相关文章:

【C语言】数组概述

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将带你了解 一维数组&#xff0c;二维数组等相关知识。 目录&#xff1a; &#x1f4d8;前言&#xff1a;&#x1f…...

8. 实现业务功能--用户注册

目录 1. 顺序图 2. 参数要求 3. 接口规范 4. 创建扩展 Mapper.xml 5. 修改 DAO 6. 创建 Service 接口 7. 实现接口 8. 测试接口 9. 实现 Controller 9.1 密码加密处理 10. 实现前端界面 业务实现过程中主要的包和目录及主要功能&#xff1a; model 包&#xff1a;实体对象 d…...

深入浅出Pytorch函数——torch.nn.init.eye_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

版本控制工具Git集成IDEA的学习笔记(第一篇Gitee)

目录 一、Gitee的使用 1、注册网站会员 2、用户中心 3、创建远程仓库 4、配置SSH免密登录 二、集成IDEA&#xff0c;Git项目搭建 1、本地仓库搭建 1&#xff09;创建一个新项目 2&#xff09;打开终端&#xff0c;在当前目录新建一个Git代码库 3&#xff09;忽略文件 …...

【链表】 61. 旋转链表

61. 旋转链表 解题思路 首先计算出链表长度将链表长度进行取余遍历链表 对链表进行分割 得到两个子链表重新连接两个链表比如1 2 3 4 5 k 2 进行分割得到 1 2 3 和 4 5两个子链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* Lis…...

深入浅出Pytorch函数——torch.nn.init.kaiming_uniform_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

查询Oracle和MySQL数据库中当前所有连接信息

查询Oracle当前所有连接信息&#xff1a; SELECTs.sid AS 会话ID,s.serial# AS 序列号,s.username AS 用户名,s.osuser AS 操作系统用户,s.machine AS 客户端机器,s.program AS 客户端程序,s.status AS 会话状态,s.sql_id AS 正在执行的SQL_ID,t.sql_text AS 正在执行的SQL文本…...

Android glide框架及框架涉及到的设计模式

目录 原文链接Android glide框架 简单使用介绍Glide 框架整体结构设计Glide 框架的优点基本使用&#xff1a;Glide占位符 Android glide框架涉及到的设计模式 原文链接 Android glide框架 简单使用介绍 Glide&#xff1a;快速高效的Android图片加载库&#xff0c;可以自动加载…...

使用yolov5进行安全帽检测填坑指南

参考项目 c​​​​​​​​​​​​​​GitHub - PeterH0323/Smart_Construction: Base on YOLOv5 Head Person Helmet Detection on Construction Sites&#xff0c;基于目标检测工地安全帽和禁入危险区域识别系统&#xff0c;&#x1f680;&#x1f606;附 YOLOv5 训练自己的…...

【BASH】回顾与知识点梳理(三十二)

【BASH】回顾与知识点梳理 三十二 三十二. SELinux 初探32.1 什么是 SELinux当初设计的目标&#xff1a;避免资源的误用传统的文件权限与账号关系&#xff1a;自主式访问控制, DAC以政策规则订定特定进程读取特定文件&#xff1a;委任式访问控制, MAC 32.2 SELinux 的运作模式安…...

vscode远程调试PHP代码

目录 一、准备工作 二、ssh连接和xdebug配置 1.ssh连接 2.xdebug配置 三、xdebug调试&#xff0c;访问 一、准备工作 1.安装vscode里面的两个扩展 2.安装对应PHP版本的xdebug 去xdebug官方&#xff0c;复制自己的phpinfo源码到方框里&#xff0c;再点击Analyse Xdebug: …...

flink1.17 实现 udf scalarFunctoin get_json_object 支持 非标准化json

特色 相比官方的json_value,该函数支持非标准化json,比如v是个object,但是非标准json会外套一层引号,内部有反引号. eg: {"kkkk2": "{\"kkkk1\":\"vvvvvvv\"}" } 支持value为 100L 这种java格式的bigint. {"k":999L…...

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)九:自定义组件封装下

一、本章内容 续上一张,本章实现一些自定义组件的封装,包括文件上传组件封装、级联选择组件封装、富文本组件封装等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 基于VUE3+Layui从头搭建通用后台管...

设计模式详解-装饰器模式

类型&#xff1a;结构型模式 实现原理&#xff1a;装饰器模式通过将对象包装在装饰器类中&#xff0c;并在保持类方法签名完整性的前提下&#xff0c;提供额外功能 作用&#xff1a;动态地给一个对象添加一些额外的职责。增加功能方面&#xff0c;装饰器模式比生成子类更灵活…...

Android5:活动生命周期

创建项目Stopwatch activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayoutxmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_w…...

第2章 数据结构和算法概述

2.3线性结构和非线性结构 数据结构包括: 线性结构和非线性结构 2.3.1线性结构 线性结构作为最常用的数据结构&#xff0c;其特点是数据元素之间存在一对一的线性关系线性结构有两种不同的存储结构&#xff0c;即顺序存储结构(数组)和链式存储结构(链表)。顺序存储的线性表称…...

WPF国际化的实现方法(WpfExtensions.Xaml)

https://blog.csdn.net/eyupaopao/article/details/120090431 resx资源文件实现 resx资源文件&#xff0c;实现的过程比第一种复杂&#xff0c;但resx文件本身编辑比较简单&#xff0c;维护起来比较方便。需要用到的框架&#xff1a;WpfExtensions.Xaml 为每种语言添加.resx资…...

【Linux】—— 进程程序替换

目录 序言 &#xff08;一&#xff09;替换原理 1、进程角度——见见猪跑 1️⃣ 认识 execl 函数 2、程序角度——看图理解 &#xff08;二&#xff09;替换函数 1、命名理解 2、函数理解 1️⃣execlp 2️⃣execv 3️⃣execvp 4️⃣execle 5️⃣execve 6️⃣execve…...

idea创建javaweb项目,jboss下没有web application

看看下图这个地方有没有web application...

广东灯具3D扫描抄数建模服务3D测绘出图纸三维逆向设计-CASAIM

灯具三维逆向建模是一种将实际物体转换为数字模型的过程。通过逆向工程技术&#xff0c;可以将现有的灯具进行3D扫描&#xff0c;然后利用专业的逆向设计软件将其转换为准确的三维模型。 以下是CASAIM实施灯具三维逆向建模的一般步骤图&#xff1a; 1. 扫描&#xff1a;三维扫…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...