数组——初识数据结构

一维数组

数组的创建

数组是一种相同类型元素的集合

数组的创建方式

C99 中引入了变长数组的概念,变长数组支持数组的大小使用变量来指定

明显这里的vs2019不支持变长数组

数组初始化和不完全初始化

第二个数组就是典型的不完全初始化,开辟了10个空间,只有第一个是1,剩下的就用0填充

这里的ch1和ch2看起来似乎一样,但ch1只有 a b c, 后面的0是编译器主动加上的;ch2是abc\0,\0的ASCII码值也是0,所以后面也是6个0,但ch2本身就自带了一个

这样的代码也是有问题的,这里只用了一个空字符串初始化,所以数组的长度是一个元素

一维数组的使用

一个数组初始化好后每个元素都有其下标,下标是从0开始的

一维数组在内存中的存储

这里我们打印一下数组的每个元素的地址看看,%p是打印地址

我们发现每个相邻的地址最后的数字就相差4,因为这是整形数组,而一个整型是4个字节

数组在内存重视连续存放的!

随着数组下标的增长,地址也是由低到高变化的

数组开辟的空间也不宜太大

数组中的数据放在栈区

0和\0

二维数组

二维数组的创建

初始化

第一个参数是行数,第二个是列数

这个数组是怎么存放的呢?

其实是1234先把第一行放满,5放在第二行,其余的位置都是0

还有另一种初始化方式

就是指定初始化位置

以及,对于二维数组,初始化时,可以省略行,不能省略列

二维数组的使用

我们尝试一下一列一列打印

二维数组在内存中的存储

试着打印一下地址看看

能发现他们似乎也是连续存放的

也能将它们理解为一个12元素的整型数组

数组越界

当我们访问的空间超过数组申请的空间时,就造成了越界访问

还有这样

可能有人比较疑惑,为啥5会打印两次呢?

第一次打印了5个,第二次还是从行的下标0位置处开始,5这个位置是数组第二行的第一个元素,所以还会被打印一次。

数组应用

冒泡排序

冒泡排序(Bubble Sort)是一种简单直观的排序算法

冒泡排序的核心思想是:

通过相邻元素两两比较,把较大的元素“冒泡”到序列的一端,像水中的气泡一样逐步上升。

具体过程如下:

  • 从头到尾依次比较相邻两个元素,如果前一个比后一个大,就交换它们;

  • 每完成一轮,最大的元素就被“冒泡”到了当前未排序部分的末尾;

  • 然后对剩下的部分重复这一过程,直到整个序列有序。

比如排序 [5, 2, 4, 3, 1],第一轮结束后变成 [2, 4, 3, 1, 5],最大值 5 被放到了最后。之后对 [2, 4, 3, 1] 再次进行“冒泡”,直到全部排好序。

设有一个长度为 n 的数组,共需进行最多 n-1 轮“冒泡”:

  • 第 1 轮:比较 n-1 次,把最大值移到末尾;

  • 第 2 轮:比较 n-2 次,把次大值移到倒数第二位;

  • n-1 轮:只需比较 1 次。

基本理念就是数组中的元素两两相比较,随后判断是否交换位置,最终的目的是排成一个升序或降序数组

或者函数的形式

#include<stdio.h>
void bubble_sort(int arr[10])
{//求数组的元素个数int sz = sizeof(arr) / sizeof(arr[10]);//冒泡排序的趟数int i = 0;for (i = 0; i < sz - 1; i++){//一趟冒泡排序int j = 0;for (j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}int main()
{int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);//0 1 2 3 4 5 6 7 8 9//要对数组升序排序//冒泡排序bubble_sort(arr);//打印for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

但结果好像不对诶~

原来上面数组名传参的时候传递的只是数组首元素的地址,形参就是指针变量来接收,并没有把整个数组传上去。(这叫做数组名的降级)

上面sz就是1了,所以数组才会没变化

这时我们只需要在main函数里先把sz计算好,然后传给排序函数就行

#include<stdio.h>
void bubble_sort(int arr[10],int sz)
{//冒泡排序的趟数int i = 0;for (i = 0; i < sz - 1; i++){//一趟冒泡排序int j = 0;for (j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}int main()
{int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);//0 1 2 3 4 5 6 7 8 9//要对数组升序排序//冒泡排序bubble_sort(arr,sizeof(arr)/sizeof(arr[0]));//打印for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

看一下这段代码

运行结果是两边都相等!

这里刚好也得出了

当p指向数组的第一个元素时,p+i就指向数组第i个元素

p里存放着数组首元素的地址,所以p和arr可以相互替换,下面这些效果也相等

还有加法交换律能得出的结论

前面讲了数组名是数组首元素地址,但存在两个例外

sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节

&数组名,数组名表示整个数组,取出的是整个数组的地址

看看这个,前面两个+1后跳过了一个整型元素,地址都是+4,而第三个+1后跳过了整个数组,地址变化了40个字节

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

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

相关文章

技术速递|使用 Semantic Kernel 与 A2A 协议构建多智能体解决方案

作者&#xff1a;卢建晖 - 微软高级云技术布道师 翻译/排版&#xff1a;Alan Wang 在快速发展的 AI 应用开发领域&#xff0c;能够协调多个智能体已成为构建复杂企业级解决方案的关键。虽然单个 AI 智能体擅长特定任务&#xff0c;但复杂的业务场景往往需要跨平台、跨框架甚至跨…

前端跨域请求原理及实践

在前端开发中&#xff0c;"跨域"是一个绕不开的话题。当我们的页面尝试从一个域名请求另一个域名的资源时&#xff0c;浏览器往往会抛出类似Access to fetch at xxx from origin xxx has been blocked by CORS policy的错误。下面将深入探讨跨域请求的底层原理&#…

SpringBoot07-数据层的解决方案:SQL

一、内置数据源 1-1、【回顾】Druid数据源的配置 druid的两种导入格式 1-2、springboot提供的3种内置数据源的配置 若是不配置Druid&#xff0c; springboot提供了3中默认的数据源配置&#xff0c;它们分别是&#xff1a; 1. HikariCP&#xff08;默认&#xff09; 从 Spring…

前端自动化埋点:页面模块级行为跟踪与问题定位系统​​的技术设计方案

一、核心设计目标​​精细化监控​​&#xff1a;定位到页面中​​单个模块​​的曝光、点击等行为。​​低侵入性​​&#xff1a;业务代码与埋点逻辑解耦&#xff0c;降低开发维护成本。​​链路可追踪​​&#xff1a;串联用户从曝光到操作的完整行为路径。​​实时性​​&a…

Node.js 与 Java 性能对比

一、核心架构与任务模型对比Node.js 单线程事件循环 非阻塞I/O 通过V8引擎执行JavaScript&#xff0c;采用事件驱动模型&#xff0c;所有I/O操作&#xff08;如网络请求、文件读写&#xff09;均为非阻塞。单线程处理所有请求&#xff0c;但通过事件循环&#xff08;Event Loo…

Python3常见接口函数

Python3常见接口函数一、基础内置函数 输入输出 print()&#xff1a;输出内容input()&#xff1a;读取用户输入 类型转换 int()、float()、str()、bool()&#xff1a;基础类型转换list()、tuple()、set()、dict()&#xff1a;容器类型转换bin()、hex()、oct()&#xff1a;进制转…

《P4092 [HEOI2016/TJOI2016] 树》

题目描述在 2016 年&#xff0c;佳媛姐姐刚刚学习了树&#xff0c;非常开心。现在他想解决这样一个问题&#xff1a;给定一颗有根树&#xff0c;根为 1 &#xff0c;有以下两种操作&#xff1a;标记操作&#xff1a;对某个结点打上标记。&#xff08;在最开始&#xff0c;只有结…

TCP头部

TCP头部字段详解1. 源端口和目的端口&#xff08;各16位&#xff09;功能&#xff1a;标识发送和接收应用程序范围&#xff1a;0-65535&#xff08;0-1023为知名端口&#xff09;技术细节&#xff1a;客户端通常使用临时端口&#xff08;1024-65535&#xff09;服务端使用固定端…

LinkedList与链表(单向)(Java实现)

引入链表结构&#xff1a;在ArrayList任意位置插入或者删除元素时&#xff0c;就需要将后序元素整体往前或者往后 搬移&#xff0c;时间复杂度为O(n)&#xff0c;效率比较低&#xff0c;因此ArrayList不适合做任意位置插入和删除比较多的场景。因此&#xff1a;java集合中又引入…

网络--VLAN技术

目录 VLAN实验报告 一、实验拓扑 二、实验要求 三、实验思路 1、实验准备 2. VLAN 3. DHCP 自动分配 4、 全网可达验证 四、实验步骤 &#xff08;一&#xff09;交换机配置- VLAN 创建与接口划分 &#xff08;二&#xff09;路由器配置&#xff08;R1&#xff0c…

网络基础17--设备虚拟化

一、传统MSTPVRRP的不足传统MSTPVRRP设计&#xff1a;规划复杂&#xff1a;需要详细规划VRRP多实例的Master归属、MSTP的VLAN和生成树实例归属&#xff0c;以及IP网段。收敛速度慢&#xff1a;故障恢复速度一般在秒级&#xff0c;VRRP收敛时间至少需要3秒&#xff0c;故障恢复速…

深入解析Hadoop资源隔离机制:Cgroups、容器限制与OOM Killer防御策略

Hadoop资源隔离机制概述在分布式计算环境中&#xff0c;资源隔离是保障多任务并行执行稳定性的关键技术。Hadoop作为主流的大数据处理框架&#xff0c;其资源管理能力直接影响集群的吞吐量和任务成功率。随着YARN架构的引入&#xff0c;Hadoop实现了计算资源与存储资源的解耦&a…

static 关键字的 特殊性

static 关键字的 “特殊性” 主要体现在其与类、对象的绑定关系&#xff0c;以及由此带来的一些反常规规则&#xff0c;具体如下&#xff1a;生命周期与内存位置特殊静态成员&#xff08;变量 / 方法&#xff09;随类加载而创建&#xff0c;随类卸载而销毁&#xff0c;生命周期…

win10系统Apache以 FastCGI方式运行PHP

文件下载及官方网站 VC运行库Latest下载页:Latest supported Visual C Redistributable downloads | Microsoft Learnapache httpd官网:Welcome! - The Apache HTTP Server Project下载页:Apache VS17 binaries and modules downloadphp官网:PHP: Hypertext Preprocessor下载页…

MCP与企业数据集成:ERP、CRM、数据仓库的统一接入

MCP与企业数据集成&#xff1a;ERP、CRM、数据仓库的统一接入 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff0c;每一个特性都是我…

【milvus检索】milvus检索召回率

Milvus中两种核心查询方式&#xff1a;暴力搜索&#xff08;Brute-force Search&#xff09; 和 近似最近邻搜索&#xff08;Approximate Nearest Neighbor, ANN&#xff09;。 逐一计算相似度&#xff1a;这是暴力搜索&#xff0c;能保证100%找到最相似的向量&#xff0c;但速…

docker Neo4j

Day 1 &#xff1a;Docker Desktop 基础熟悉 运行官方 hello-world 测试&#xff1a; docker -run hello-world 运行 Nginx 体验容器暴露端口&#xff1a; docker run -d -p 8080:80 nginx -d --detach 以 分离模式 运行容器 -p --publish 设置 宿主机与容器的端口映射。…

Win10_Qt6_C++_YOLO推理 -(1)MingW-opencv编译

先上效果图&#xff1a; 因为是一个为了尝试跑通的demo&#xff0c;美观、功能都先忽略哈。 一、环境 库版本下载链接备注cmakecmake-4.1.0-rc2-windows-x86_64.msihttps://cmake.org/download/make x86_64-15.1.0-release-posix-seh-ucrt-rt_v12-rev0.7zhttps://github.com/…

day060-zabbix监控各种客户端

文章目录0. 老男孩思想-一个人的背书1. zabbix各种客户端1.1 Windows Server监控1.2 网络设备监控1.3 java应用监控1.4 前端监控java程序故障2. 相关项监控3. 思维导图0. 老男孩思想-一个人的背书 学历、能力、态度、特长、人品、口碑&#xff08;身边的人、领导&#xff09; …

OpenCV 官翻 2 - 图像处理

文章目录色彩空间转换目标色彩空间转换目标追踪如何确定要追踪的HSV值&#xff1f;练习图像的几何变换目标变换缩放翻译旋转仿射变换透视变换其他资源图像阈值处理目标简单阈值化自适应阈值化大津二值化法Otsu二值化算法原理其他资源练习图像平滑处理目标二维卷积&#xff08;图…