深度解析指针与数组:探索内存管理的艺术

从.map文件到堆栈优化:Keil环境下的内存管理艺术 本文深入探讨了Keil环境下.map文件的分析与堆栈优化技巧,帮助开发者有效预防和解决堆栈溢出问题。通过解析.map文件结构、利用数据断点调试以及优化内存配置,提升嵌入式系统的稳定性和性能。文章特别强调了堆栈溢出的检测方法和优化策略,是嵌入式开发者的实用指南。 阅读详情

目录

1.数组名的理解

sizeof(数组名),sizef中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节

&数组名,这里的数组名表示整个数组,取出的是整个数组的地址 (整个数组的地址和数组首元素的地址是有区别的)

2.使用指针访问数组

arr[i]==>*(arr+i)等价

数组与指针的联系:

3.一维数组传参的本质

4 .冒泡排序

5.二级指针

解引用

6.指针数组

指针数组是数组还是指针?

7.指针数组模拟二维数组


 1.数组名的理解


我们发现数组名和数组首元素的地址打印出的结果一模一样,数组名就是数组首元素(第一个元素)的地址。

 数组名如果是数组首元素的地址,那下面的代码怎么理解呢?

输出的结果是:40,如果arr是数组首元素的地址,那输出应该的应该是4/8才对。

其实数组名就是数组首元素(第一个元素)的地址是对的,但是有两个例外:

sizeof(数组名),sizef中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节

&数组名,这里的数组名表示整个数组,取出的是整个数组的地址 (整个数组的地址和数组首元素的地址是有区别的)

除此之外,任何地方使用数组名,数组名都表示首元素的地址。

 图解:

2.使用指针访问数组

为什么访问数组的时候可以使用指针呢?

1.数组在内存中是连续存放的

2.指针+-整数运算,方便我们获得每一个元素的地址

int main()
{
	int arr[10] = { 0 };
	//使用指针来访问数组
	int sz = sizeof(arr) / sizeof(arr[0]);
	//输入10个值
	int* p = arr;
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		//输入1个值
		scanf("%d", p+i);//p+i == &arr[i]
	}

	//输出10个值
	for (i = 0; i < sz; i++)
	{
		printf("%d ", i[arr]);//p[i]  arr[i]  *(arr+i)
	}

	return 0;
}

 arr[i]==>*(arr+i)等价

1.数组就是数组,是一块连续的空间(数组的大小和数组元素个数和元素类型都有关系)
2.指针(变量)就是指针(变量),是!一个变量(4/8个字节)

数组与指针的联系:

3.数组名是地址,是首元素的地址
4.可是使用指针来访问数组

3.一维数组传参的本质

 打印的值为1,是指针变量的大小,不是数组的大小

数组传参的时候,形参是可以写成数组的形式的
但是本质上还是指针变量

void Print(int arr[10])//int* arr
{
	int sz = sizeof(arr) / sizeof(arr[0]);//得不到元素个数的,算出来的是指针变量的大小
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

void Print(int* p,int sz) //应该是指针
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	Print(arr, sz);//arr 数组名就是数组首元素的地址

	//sizeof(arr)
	//&arr
	return 0;
}

1. 数组传参的本质是传递了数组首元素的地址,所以形参访问的数组和实参的数组是同一个数组的。

2.形参的数组是不会单独再创建数组空间的,所以形参的数组是可以省略掉数组大小的。

总结:一维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

4 .冒泡排序

 冒泡排序的核心思想:就是两两相邻的元素进行比较。

 图示:

代码如下:

升序
void bubble_sort(int arr[], 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])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;
			}
		}
		if (flag == 1)
		{
			break;
		}
	}
}

void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	//排序
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	//打印
	print_arr(arr, sz);
	return 0;
}

 

 避免已经排序结束了,但是还在循环

 

 5.二级指针

int main()
{
	int a = 10;
	int* p = &a;//p就是一级指针

	int * * pp = &p;

	int** * ppp = &pp;
	int**** pppp = &ppp;
	//.....
	return 0;
}

 

 

 解引用

6.指针数组

指针数组是数组还是指针?

是数组!
eg:好孩子,主语是孩子

我们类比一下,整型数组,是存放整型的数组,字符数组是存放字符的数组。
那指针数组呢?是存放指针的数组。

 

7.指针数组模拟二维数组

 并不是真的二维数组,只是模拟出来的 

 图解:

parr[]是访问parr数组的元素,parr[i]找到的数组元素指向了整型一维数组,parr[i][j]就是整型一维数组中的素。

上述的代码模拟出二维数组的效果,实际上并非完全是二维数组,因为每一行并非是连续的。

希望对你有帮助!加油各位!!

每一次努力都是不凡的历练,每一点进步都是值得庆祝的胜利。你正在创造属于自己的辉煌,相信自己,一切皆有可能。

从零实现C++ STL核心组件:MyTinySTL项目深度解析与实践指南 C++标准模板库(STL)是泛型编程和软件工程实践的典范,其核心思想是通过容器、迭代器、算法和函数对象的分离,实现代码的高度复用和效率优化。理解STL底层原理,如动态数组的倍增扩容策略、迭代器的类型萃取机制以及RAII资源管理模型,对于编写高性能、可维护的C++代码至关重要。这些基础概念广泛应用于系统编程、游戏引擎和基础设施开发中。本文以教学型项目MyTinySTL为载体,通过剖析其vector容器的内存管理、迭代器失效机制以及sort算法的仿函数设计,帮助开发者深入掌握STL的**核心实现原理**与**工 阅读详情

相关推荐

C#与Halcon图像数据转换实战:Byte数组与HObject互转详解

在工业视觉与机器视觉开发中,图像数据的高效处理与传递是核心环节。图像数据本质上是以特定格式存储在内存中的字节序列,其转换过程涉及内存布局、数据格式与跨语言交互等底层原理。掌握图像数据在托管内存与非托管内存间的转换技术,对于构建高性能、稳定的视觉系统具有重要价值,尤其在C#与Halcon这类非托管库的混合编程场景中。本文聚焦于C#的byte[]数组与Halcon的HObject对象之间的互转,深入剖析了内存管理、数据格式对齐等关键问题,并提供了针对灰度图与彩色图的完整转换方案。通过理解图像参数(如宽度、高度、

weixin_34408717的博客 315

D13—C语言指针深度解析系列(五):sizeof、strlen与指针运算的深层原理

本文深入探讨了C语言中sizeof与strlen的核心区别,以及数组和指针运算的关键概念。主要内容包括: sizeof(编译时确定)与strlen(运行时确定)的本质差异 数组名的三种特殊行为及其在sizeof中的表现 字符数组初始化方式的微妙区别(有无\0) 二维数组的内存模型与行指针/列指针概念 指针运算的步长规则及经典题目解析 文章通过代码示例和详细分析,揭示了指针与数组在内存访问和运算中的核心机制,帮助读者深入理解C语言底层内存管理原理。

一名零基础编程小白的成长历程 667

嵌入式C语言技巧7:内存管理不善?看这篇深度解析如何高效防止内存泄漏

通过今天的深度探索,我们不但对静态内存分配有了更为深入的理解,还掌握了追寻内存泄漏的诸多方法。在未来的软件开发进程中,让我们持续秉持着严谨且细致的态度,不断地优化我们的内存管理实践,为构筑更加高效、稳固的软件系统贡献力量!

weixin_45715405的博客 668

Go语言内存管理深度解析:堆栈分配与逃逸分析的艺术

本文深入探讨了Go语言的内存管理机制,重点分析了堆栈分配原理和逃逸分析技术。文章首先介绍了栈内存和堆内存的特性差异,包括分配速度、生命周期和管理方式。随后详细讲解了Go编译器的内存分配策略和逃逸分析决策流程,通过代码示例展示了不同场景下的内存分配行为。最后,文章提供了性能优化建议和调试工具使用方法,帮助开发者编写更高效的Go代码。全文约1500字,涵盖了从基础概念到实践应用的完整知识体系。

May_as_well的博客 1024

苍穹外卖项目面试总结话术

美食速递这个项目最初是我参与制作的大创项目,是一款为中南学生提供校园外卖送至宿舍服务的软件,包含系统管理后台和小程序端两部分。其中系统管理后台主要提供给食堂内部员工使用,可以对食堂各个窗口、员工、订单、菜品等进行维护管理;小程序端可以在线浏览菜品、添加购物车、下单等,由学生兼职做跑腿送餐上门服务。这是个前后端分离的项目,我主要是负责后端的用户登录、员工管理,菜品管理,订单管理模块的编码实现。

qq_45195447的博客 1万+

CSP-J 入门级第一轮认证 2025 详细解析

2025年CSP-J入门级第一轮认证模拟赛提供10套免费试题,含选择题与解析。选择题涉及计算机科学基础,如32位无符号整数最大值计算(约42.9亿,选A)、C++位运算(255&254=254,选B)、递归函数分析(calc(5)=6,选B)、哈夫曼树构造(带权路径长度186,选B)等。其他题目涵盖图论(有向图边数等于入度/出度和,选B)、组合数学(120种选法,选C)、布尔逻辑(选项C不恒等)、模运算周期性(f[2025]=6,选D)、C++字符串特性(支持string+char,选B)及引用传参

lan_in的博客 2942

指针技术深度解析:从内存模型到智能指针与实战应用

在计算机编程中,内存管理是核心基础概念,它直接关系到程序的性能与稳定性。其原理在于程序运行时对内存空间的分配、使用和回收。理解内存地址与数据存储的关系是掌握底层编程的关键,这带来了直接操作内存、实现高效资源利用和灵活数据结构的巨大技术价值。在系统编程、性能优化和底层开发等应用场景中,指针作为访问和操作内存地址的直接工具,扮演着不可或缺的角色。本文聚焦于指针这一核心机制,深入探讨了包括智能指针在内的多种高级技术,并提供了针对内存泄漏等常见问题的工程实践指南,旨在帮助开发者构建更健壮、高效的软件系统。

weixin_26800111的博客 296

Visio 2013 Professional密钥安装激活全攻略:版本匹配与故障排查

产品密钥是软件授权体系中的核心凭证,用于验证用户对软件的使用权限。在微软Office产品线中,Visio 2013 Professional采用25位字符的密钥机制,通过联网或电话方式完成激活。正确使用密钥不仅能确保软件功能完整,还能避免因授权问题导致的工作中断。对于企业IT运维和个人用户而言,掌握密钥类型辨析、安装包匹配规则以及激活失败排查方法,是保障老版本软件稳定运行的关键。本文围绕Visio 2013 Professional,详细讲解密钥输入、激活流程及常见错误代码处理,帮助读者高效完成部署与维护。

weixin_28487433的博客 340

C语言黑科技全解析:指针魔法与性能优化的终极指南

传统malloc内存池高碎片率零碎片慢速分配O(1)分配不可预测确定性强。

2301_78981884的博客 582

手把手教你用UNI-MOL进行分子性质预测:从3D构象到实战结果

本文提供了使用UNI-MOL进行分子性质预测的完整实战指南。通过详细的环境搭建、3D构象生成、模型加载与微调步骤,手把手教你构建端到端的预测流水线。文章重点解析了如何利用UNI-MOL的3D分子表示学习能力,超越传统2D方法,实现对溶解度、活性等性质的更精准预测,并探讨了结果解读与模型分析方法。

weixin_29164091的博客 116

MIMO-OFDM通信系统性能仿真及MATLAB实现

将MIMO和OFDM技术结合起来,可以充分利用两者的优点,进一步提高无线通信系统的性能。在MIMO-OFDM系统中,多个天线同时发射多个子载波,称为多天线多载波(MIMO-OFDM)系统。随着无线通信技术的不断发展,MIMO-OFDM技术因其高效、可靠和适应性等优点已被广泛应用于新一代通信系统中。本篇文章旨在介绍MIMO-OFDM通信系统的基本原理及其性能评估方法,并结合MATLAB提供相关代码实现。本篇文章介绍了MIMO-OFDM通信系统的基本原理和性能评估方法,并结合MATLAB提供了相关的实现代码。

学习使你进步。 2218

C语言内存管理深度解析:从栈堆分区到内存池实战

内存管理是计算机科学的核心基础,它决定了程序如何高效、安全地使用系统资源。其原理涉及操作系统对进程内存空间的划分,通常分为栈、堆、静态区与代码区,每个区域在生命周期、分配方式和访问速度上各有不同。这项技术的价值在于,直接的内存控制能力是系统编程、嵌入式开发和高性能计算等领域实现极致性能与资源掌控的关键。在实际应用场景中,无论是网络服务器的连接管理,还是游戏引擎的对象池,都需要精细的内存管理策略来避免泄漏、溢出和碎片化问题。本文聚焦于C语言中的动态内存管理,深入探讨malloc、free的潜规则,并剖析结构体

weixin_29574585的博客 292

九天揽月带你玩转Ardupilot 的EKF2纸老虎(1)

目录 目录 摘要 1.kalman基础知识储备 摘要 本文主要记录自己学习ardupilot的ekf2代码的过程,相信很多人想移植或者学习ekf2,看到眼花缭乱的代码无从下手。九天揽月将带你玩转Ardupilot 的EKF2纸老虎 1.kalman基础知识储备 (1)先来看下最基础也是最重要的线性kalman 总结:不要害怕kalman,只要你可以懂得线性kal...

陌城烟雨 1万+

C++进阶核心:内存管理、对象模型与并发编程深度解析

C++作为一门系统级编程语言,其核心价值在于对性能与资源的精确控制。理解其底层原理,如内存模型、对象生命周期和编译器行为,是编写高效、健壮程序的基础。内存管理从古典的new/delete演进到以RAII和智能指针为核心的现代范式,这不仅解决了资源泄漏问题,更通过明确所有权语义提升了代码安全性。对象模型中的移动语义、拷贝控制与完美转发,使得资源转移高效且安全,是高性能编程的关键。并发编程则通过标准库提供的线程、原子操作及同步原语,帮助开发者充分利用多核硬件,同时规避数据竞争与死锁陷阱。这些技术共同支撑起从基础

weixin_30647065的博客 386

【HAL库】STM32CubeMX开发----STM32F407----SPI实验

【HAL库】STM32CubeMX开发----STM32F407----SPI实验

MQ0522的博客 3019

NEU-DET 冷轧钢缺陷检测:基于 YOLOv8 的目标检测与可视化 UI 实现

冷轧钢的生产过程中,由于设备故障、工艺问题或者人为因素,钢板表面可能会出现多种缺陷,如划痕、裂纹、孔洞等,这些缺陷会严重影响钢材的质量。它比之前的版本(如 YOLOv5、YOLOv4)在速度和精度上都有显著提升,并且对硬件要求较低,适合进行工业界面和嵌入式系统的应用。这些版本相较于更大型的模型(如 YOLOv8x)具有更快的推理速度和较低的资源占用,适合工业生产线中的实时应用。通过将训练好的模型部署到工业生产线摄像头中,我们可以实现实时的缺陷检测,极大地提升生产效率和产品质量。

YOLO 737

ChatGPT 作为你的 Python 编码导师:prompts.md 提示词工程实战指南

本篇技术指南以本仓库 `chatgpt-mentor` 目录下的 [prompts.md](https://link.gitcode.com/i/614658d3288edf099d3b47749a4d70d0) 为核心骨架,系统讲解如何借助 ChatGPT 扮演 Python 编码导师,覆盖语法速查表生成、代码调试、结对编程重构、替代实现对比与编程问题答疑五大典型场景。读者读完本文,将掌握一套可

gitblog_00206的博客 1024

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

8086寄存器组的编程艺术:从汇编视角理解数据流与控制流

本文深入探讨8086寄存器组的编程艺术,从汇编视角解析数据流与控制流的协同机制。重点分析8086 CPU结构中BIU和EU的协同工作原理,通过实际代码示例展示通用寄存器、段寄存器及指针变址寄存器的高效使用方法,帮助开发者深入理解底层硬件执行机制并优化代码性能。

motor的博客 653

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深入STL源码:从vector内存管理到map红黑树实现

标准模板库(STL)是C++编程的核心组件,其设计融合了数据结构、算法和泛型编程的精髓。理解STL的内部工作原理,不仅能帮助开发者编写更高效的代码,还能深入掌握内存管理、迭代器失效等底层机制。通过分析vector的动态数组实现,可以了解其容量增长策略和内存重分配过程;而map基于红黑树的结构,则展示了自平衡二叉搜索树如何保证O(log n)的操作复杂度。这些知识对于优化程序性能、调试复杂问题至关重要。在实际开发中,掌握STL源码有助于更好地使用容器和算法,例如通过reserve预分配vector内存,或根据

ainixi7099的博客 383

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

侯捷 C++ 课程学习笔记:Vector 的深度探索

struct A {constructdestructdestruct第一次构造是临时对象;第二次是push_back中复制构造进容器;第三个是析构临时对象;最后析构 vector 中的对象;vector 是“性能优先”与“内存友好性”的完美结合理解其内存策略、迭代器机制、异常安全,是成为优秀 C++ 工程师的基础深入 STL 的关键是“抽象思维 + 实证测试”并行。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1048

Java编程艺术探索创新与高效开发的无限可能

这种创新通过JVM原生镜像技术和编译时依赖解析实现,其核心在于将传统运行时依赖前移到编译阶段,如Micronaut通过AOT编译预热技术。每个技术点均包含:原理说明+实现路径+量化效果的三元论证结构,并通过代码示例保持Java技术特性的一致性,同时引入前沿实践案例提升文章的技术前瞻性。在基准测试中,该系统对二维数组遍历的优化建议,使矩阵乘法计算速度提升41%在超导量子比特测控系统开发中,我们重构了Qiskit Java SDK,通过重构门操作序列生成算法,将量子电路编译效率提升300%。

cphfjxBG的博客 783

【C++深度解析现代编程实践与性能优化的高效路径】

本文从智能指针、模板元编程、并发编程三个核心方向切入,结合零拷贝技术、编译器优化策略,剖析如何通过现代C++(C++11/14/17/20)特性实现可靠与高效的代码设计。NO_INLINE void start() { / 禁止内联 / }

UMqIGSoo的博客 339

ArtCraft:把 62 个图像、视频与 3D 模型塞进一个窗口的 AI 创作桌面应用

在聚合站的输入框里反复丢同一个 prompt,每次出来的画面都对不上——角色姿态、机位、光线全凭模型心情。ArtCraft 是一个 Rust + Tauri 桌面应用:图像、视频、音频、3D 网格、世界模型共 62 个可选,先搭好场景,再生成。它面向想要可重复出片效果的艺术家和独立影视人。 ## ArtCraft 能做什么:五类产出,全在一个窗口里 - **文生图与改图**:Prompt 框里

gitblog_01159的博客 390

C++标准库函数深度解析:从容器操作到现代C++实战指南

C++标准库是C++编程的核心组成部分,它通过提供一系列经过高度优化的容器、算法和工具函数,极大地提升了开发效率和代码质量。其设计基于泛型编程思想,实现了数据结构和算法的解耦,使得开发者能够以统一的方式处理不同类型的数据。理解标准库的原理和正确使用方式,对于编写高效、安全的C++代码至关重要。在实际工程中,容器操作(如vector的push_back/emplace_back、map的查找与插入)、迭代器失效、智能指针的内存管理以及算法库(如sort、find、transform)的灵活运用,是提升代码性能

weixin_34185512的博客 376

Rust-by-example-cn标准库深度探索:Vector、HashMap和String的高级用法

想要掌握Rust编程语言的核心数据结构和字符串处理技巧吗?在Rust-by-example-cn项目中,我们提供了全面的标准库学习指南,特别针对Vector动态数组、HashMap散列表和String字符串这三个最常用的数据结构进行深度解析。本文将带你快速了解这些数据结构的**高级用法**和**最佳实践**,帮助你在实际开发中更高效地处理数据。 ## 📚 为什么选择Rust-by-exampl

gitblog_01005的博客 624

CODESYS中Any类型深度解析:原理、应用与安全实践

在工业自动化编程中,数据类型是构建程序逻辑的基础,从基础的布尔、整数到复杂的结构体,它们确保了代码的类型安全与可预测性。然而,当需要设计高度通用、可复用的功能块或库时,如何让单一接口处理多种数据类型成为关键挑战。CODESYS平台提供的Any类型,作为一种扩展数据类型,通过其指针机制实现了运行时动态类型处理,为编写灵活、通用的代码提供了可能。这项技术的核心价值在于提升代码的复用性与模块化程度,尤其适用于通用数据记录、多态算法封装及与外部系统接口等场景。本文聚焦于Any类型的内存模型、类型检查机制及安全使用规

weixin_34234829的博客 375
上一篇: 深入探究C语言中的常量指针与野指针概念及其应用
下一篇: 基于C++的面向对象程序设计:类与对象的深入剖析
Srlua小谢
Srlua小谢 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄4年 8963粉丝 332原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值