【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变量的解释:

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


❤️ 结语

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

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

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

相关文章

vue3+ts+vite使用el-breadcrumb实现面包屑组件,实现面包屑过渡动画

简介 使用 element-plus 的 el-breadcrumb 组件&#xff0c;实现根据页面路由动态生成面包屑导航&#xff0c;并实现面包屑导航的切换过渡动画 一、先看效果加粗样式 1.1 静态效果 1.2 动态效果 二、全量代码 <script lang"ts" setup> import { ref, watch…

JVM基础了解

JVM 是java虚拟机。 作用&#xff1a;运行并管理java源码文件锁生成的Class文件&#xff1b;在不同的操作系统上安装不同的JVM&#xff0c;从而实现了跨平台的保证。一般在安装完JDK或者JRE之后&#xff0c;其中就已经内置了JVM&#xff0c;只需要将Class文件交给JVM即可 写好的…

安装pyrender和OSMesa

1&#xff09;安装 pyrender Pyrender是一个基于OpenGL的库&#xff0c;可以加载和渲染三维网格、点云、相机等对象3。 pip install pyrender 2&#xff09;理解PyOpenGL和OSMesa的关系是: PyOpenGL是Python的OpenGL绑定库&#xff08;接口壳子&#xff09;,它提供了在Python中…

day9 STM32 I2C总线通信

I2C总线简介 I2C总线介绍 I2C&#xff08;Inter-Integrated Circuit&#xff09;总线&#xff08;也称IIC或I2C&#xff09;是由PHILIPS公司开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备&#xff0c;是微电子通信控制领域广泛采用的一种总线标准。 它是同步通…

基于ACF,AMDF算法的语音编码matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .......................................................................... plotFlag …

day-25 代码随想录算法训练营(19)回溯part02

216.组合总和||| 思路&#xff1a;和上题一样&#xff0c;差别在于多了总和&#xff0c;但是数字局限在1-9 17.电话号码的字母组合 思路&#xff1a;先纵向遍历第i位电话号码对于的字符串&#xff0c;再横向递归遍历下一位电话号码 93.复原IP地址 画图分析&#xff1a; 思…

微服务中间件--Ribbon负载均衡

Ribbon负载均衡 a.Ribbon负载均衡原理b.Ribbon负载均衡策略 (IRule)c.Ribbon的饥饿加载 a.Ribbon负载均衡原理 1.发起请求http://userservice/user/1&#xff0c;Ribbon拦截该请求 2.Ribbon通过EurekaServer拉取userservice 3.EurekaServer返回服务列表给Ribbon做负载均衡 …

学习笔记230810--get请求的两种传参方式

问题描述 今天写了一个对象方式传参的get请求接口方法&#xff0c;发现没有载荷&#xff0c;ip地址也没有带查询字符串&#xff0c;数据也没有响应。 代码展示 错误分析 实际上这里的query是对象方式带参跳转的参数名&#xff0c;而get方法对象方式传参的参数名是parmas 解…

【Python】解决“Tk_GetPixmap: Error from CreateDIBSection”闪退问题

解决Python使用Tkinter的Notebook切换标签时出现的“Tk_GetPixmap: Error from CreateDIBSection 操作成功完成”闪退问题 零、问题描述 在使用Tkinter的Notebook控件时&#xff0c;对其标签进行切换&#xff0c;发现切换不了&#xff0c;一切换就报如下图错误&#xff1a; …

如何在 Elasticsearch 中将矢量搜索与过滤结合起来 - Python 8.x

大型语言模型&#xff08;LLM&#xff09;每天都在发展&#xff0c;这种情况有助于语义搜索的扩展。 LLM 擅长分析文本和揭示语义相似性。 这种情况也反映在搜索引擎上&#xff0c;因为语义搜索引擎可以为用户提供更满意的结果。 尽管大型语言模型可以捕获语义上接近的结果&am…

解锁Spring AOP的神秘面纱

目录 Spring AOP的组成组成部分与常用注解举例理解 Spring AOP的实现添加 Spring AOP 框架⽀持定义切⾯和切点定义通知切点表达式说明 Spring AOP 实现原理JDK动态代理CGLIB动态代理 Spring AOP作为Spring框架的核心模块&#xff0c;为我们提供了一种优雅的方式来处理横切关注点…

硬编码基础一(经典定长指令,寄存器相关)

硬编码基础一&#xff08;定长指令&#xff09; push/pop 通用寄存器 50~57是push8个32位通用寄存器 58~5f是pop8个32位通用寄存器 inc/dec 通用寄存器 40~47是inc8个32位通用寄存器 47~4f是dec8个32位通用寄存器 八位通用寄存器的立即数赋值 b0~b3 {立即数} 是低八位(…

【福建事业单位-综合基础知识】05民法典

这里写自定义目录标题 一、民法概述概念原则总结 二、自然人概念总结 三、民事法律行为总结 民法考察2-4题&#xff08;重点总则篇&#xff09; 一、民法概述 概念原则 总结 二、自然人 概念 总结 三、民事法律行为 总结

C++进阶 特殊类的设计

本篇博客介绍&#xff1a;介绍几种特殊的类 特殊类的设计 设计一个类不能被拷贝设计一个类 只能在堆上创建对象设计一个类 只能在栈上创造对象设计一个类不能被继承单例模式饿汉模式懒汉模式单例模式对象的释放问题 总结 设计一个类不能被拷贝 我们的拷贝只会发生在两个场景当…

Flink状态和状态管理

1.什么是状态 官方定义&#xff1a;当前计算流程需要依赖到之前计算的结果&#xff0c;那么之前计算的结果就是状态。 这句话还是挺好理解的&#xff0c;状态不只存在于Flink&#xff0c;也存在生活的方方面面&#xff0c;比如看到一个认识的人&#xff0c;如何识别认识呢&am…

CSS中的calc()函数有什么作用?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS中的calc()函数及其作用⭐ 作用⭐ 示例1. 动态计算宽度&#xff1a;2. 响应式布局&#xff1a;3. 自适应字体大小&#xff1a;4. 计算间距&#xff1a; ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点…

Spring之bean的生命周期

目录 1.Bean的初始化过程 1.1代码详解 1.2思考 2.Bean的单例与多例选择 2.1论证单例与多例优缺点 2.2论证初始化时间点 2.3个例演示 Spring Bean的生命周期&#xff1a; 一、通过XML、Java annotation&#xff08;注解&#xff09;以及Java Configuration(配置类),等方式…

【令牌桶算法与漏桶算法】

&#x1f4a7; 令牌桶算法与漏桶算法 \color{#FF1493}{令牌桶算法与漏桶算法} 令牌桶算法与漏桶算法&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专…

每日一题——螺旋矩阵

题目 给定一个m x n大小的矩阵&#xff08;m行&#xff0c;n列&#xff09;&#xff0c;按螺旋的顺序返回矩阵中的所有元素。 数据范围&#xff1a;0≤n,m≤10&#xff0c;矩阵中任意元素都满足 ∣val∣≤100 要求&#xff1a;空间复杂度 O(nm) &#xff0c;时间复杂度 O(nm)…

李沐pytorch学习-卷积网络及其实现

一、卷积概述 1.1 基本定义 卷积计算过程如图1所示&#xff0c;即输入矩阵和核函数&#xff08;filter&#xff09;对应的位置相乘&#xff0c;然后相加得到输出对应位置的数。 图1. 卷积计算过程 该过程可以形象地从图2中展现。 图2. 二维卷积示意图 1.2 实现互相关运算的代…