C语言数组的dirty corner

LVGL v8.3 图片显示与解码缓存实战:PNG 上屏、C 数组与文件双方案 LVGL v8.3 图片两种存储方式、PNG/JPG 上屏解码器挂载、LV_IMG_CACHE_DEF_SIZE 缓存调优、手动预解码头像有效性判断,及"缓存被动画清空"真实踩坑。 阅读详情

int a[10];
int *p = &a[0];

数组名做右值时自动转换成指向首元素的指针,所以 a[2]和 p[2]本质上是一样的,都是通过指针间接寻址访问元素。E1[E2]这种写法和(*((E1)+(E2)))是等价的,*(p+2)也可以写成 p[2],p就像数组名一样,其实数组名也没有什么特殊的, a[2]之所以能取数组的第 2 个元素,是因为它等价于*(a+2),都是通过指针间接寻址访问元素。

由于(*((E1)+(E2)))显然可以写成(*((E2)+(E1))),所以 E1[E2]也可以写成 E2[E1],这意味着 2[a]、 2[p]这种写法也是对的,但一般不这么写。


另外,由于 a 做右值使用时和&a[0]是一个意思,所以 int *p = &a[0];通常不这么写,而是写成更简洁的形式 int *p = a;


C 语言允许数组下标是负数,如果让p指向a[1],那么表达式 pa[-1]是合法的,它和 a[0]表示同一个元素。


指针相减表示两个指针之间相差的元素个数,同样只有指向同一个数组中元素的指针之间相减才有意义,C 语言也规定两个指针不能相加


在取数组元素时用数组名和用指针的语法一样,但如果把数组名做左值使用,和指针就有区别了。例如 p++是合法的,但 a++就不合法,p = a + 1 是合法的,但 a = p + 1 就不合法。数组名做右值时转换成指向首元素的指针,但做左值仍然表示整个数组的存储空间,而不是首元素的存储空间,数组名做左值还有一点特殊之处,不支持++、赋值这些运算符,但支持取地址运算符&,所以&a 是合法的。

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03 需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。 阅读详情

相关推荐

火星遥感数据的获取与处理工具安装详解

有关火星遥感影像数据的那些事...

FengYingLuo的博客 5573

C语言volatile关键字

1. 具体含义 Volatile关键字在C Language Keywords中的解释 Indicates that a variable can be changed by a background routine. Keyword volatile is an extreme opposite of const.It indicates that a variable may be changed in a way which is absolutely unpredictable by analysi

weixin_37515325的博客 415

直流有刷电机H桥控制实战:从原理图到PWM调速(附DR70x驱动芯片详解)

本文详细解析了直流有刷电机H桥控制的核心技术,从原理图设计到PWM调速实现,特别针对DR70x驱动芯片的应用进行了深入探讨。文章涵盖了H桥电路的电流路径分析、PWM调速的工程细节、DR70x驱动芯片的工作原理及典型应用电路设计,并提供了实测波形分析和故障排查方法,为工程师提供了一套完整的解决方案。

weixin_29215815的博客 149

C语言基本问题

gcc的编译过程 源代码 – 预处理 – 编译 – 汇编 – 链接 – 可执行文件 以下面几个文件为例 ├── test.c └── inc ├── mymath.h └── mymath.c 预处理(Pre-processing) :进行伪指令(伪指令是以#开头的指令,包括头文件包含,宏替换,条件编译 如# ifdef,# ifndef,# else,# elif,# endif等)和特殊符号处理,得到文本文件,文件中只有常量、变量的定义,以及C语言的关键字(如main, if , else , for.

siomouc的博客 267

COMSOL新手必看:锂电池仿真从入门到精通的5个实战案例(附模型文件)

本文为COMSOL新手提供锂电池仿真的5个实战案例,涵盖锂枝晶生长模拟、电池热失控预警、SOC估计等效电路模型、电池组液冷系统热管理及SOH衰退模型构建。通过详细步骤和参数设置,帮助用户快速掌握锂电池仿真技术,提升新能源研发效率。附模型文件可直接应用。

wdx01234567的博客 260

SWMM建模与案例应用

4、排水系统控制规则通过控制功能,可以在模拟进行过程中,通过条件判断,对闸门、水泵、管道、孔口、堰进行控制,实现排水系统实时控制。5、SWMM与其他模型对比分析分析:STORM、MOUSE、Info Works、SUSTAIN、SWC。1、模型初始设置主要参数:雨量计、汇水区、节点、出水口、管渠、分流器、蓄水池等参数前缀的设置。2、气象数据设置温度、蒸发、风速、融雪、面积亏损、气候调整、雨量计。1、多软件数据交互:CAD、Arcgis、SWMM。(1)节点、管段、水泵、孔口、堰、雨水口和街道。

m0_74575633的博客 3417

小师妹学JVM之:Dirty cards和PLAB

文章目录简介分代收集器中的空间划分Write barrier和Dirty cardsPLABold space分配对象总结 简介 分代垃圾回收器在进行minor GC的时候会发生什么操作呢?有没有什么提高效率的手段呢?今天我们和小师妹一起来了解一下垃圾回收中的Dirty cards和PLAB 分代收集器中的空间划分 小师妹:F师兄,能再讲讲分代垃圾收集器中的空间划分吗? 分代垃圾回收器中的Eden,Old和Survivor space几个大家应该都很熟悉的分代技术。 Young Gen被划分为1个Eden

程序那些事 1万+

Allegro Design Entry CIS 与 OrCAD Capture CIS:PCB设计工具链中的双雄对决

本文深入对比了Cadence旗下两大原理图设计工具Allegro Design Entry CIS与OrCAD Capture CIS。Allegro Design Entry CIS源自Concept HDL,定位高端,强调自顶向下的层次化设计和与Allegro PCB Editor的无缝约束管理,适合大型复杂系统及团队协作。OrCAD Capture CIS则以其出色的易用性、广泛的兼容性和强大的CIS数据库功能著称,是中小型项目及跨工具链协作的通用选择。文章从历史渊源、核心功能、适用场景等多维度剖析,

bush的博客 487

基于MP2642GR-Z与ATmega1284P的储能电池均衡方案设计与实现

电池管理系统(BMS)中,串联电池组的均衡是保障储能系统寿命与安全的关键技术。其原理是通过监测电芯电压差异,控制均衡回路对高压电芯放电或能量转移,以维持电池组一致性。在备用电源与储能场景中,均衡能有效防止过充过放,提升系统可靠性。本文以MP2642GR-Z专用均衡芯片与ATmega1284P MCU为例,详解两串电池均衡的硬件设计、采样时序、保护逻辑及低功耗策略,并分享实操避坑经验,为储能电池均衡提供可落地的工程参考。

weixin_34037515的博客 406

SGP4/SDP4详解

**SGP4** (Simplified General Perturbations Version 4) 和 **SDP4** (Simplified Deep-space Perturbations Version 4) 是一组**解析轨道预报模型**,用于预测地球轨道卫星的位置和速度。它们是北美防空司令部(NORAD)维护的**TLE**数据格式的标准配套算法。 简单来说:**TLE是卫星轨道的"身份证",而SGP4/SDP4是解读这张身份证的"说明书"**。

ScilogyHunter的博客 589

Go语言全面解析:从入门到精通

Go语言是由Google开发的一种静态类型、编译型编程语言,具有简洁、高效、安全的特点。它特别适合高并发服务、云原生应用和网络编程等场景。Go采用Goroutine和Channel实现轻量级并发,性能接近C/C++。与其他语言相比,Go语法更简洁但类型更严格,编译速度快且跨平台支持好。虽然Go支持多种设计模式和编程范式,但其面向对象实现方式与传统语言不同。标准库丰富且拥有Gin、GORM等企业级框架。核心语法包括包管理、变量声明、函数定义、流程控制等,适合构建高性能后端服务和系统工具。

博哥哥的博客 4925

Manim使用指南:从安装到生成数学动画(四)

本文介绍“Manim智能演示视频工作坊V4.5.6”,一款面向中学数学教师的可视化微课生成工具。它通过16大数学原语模板、AI智能出题(支持文本与拍照识图)、一键配音字幕、单镜头秒级试播及PPT动图导出等功能,将复杂的数学动态演示流程简化为“输入题目→调参→生成视频”的三步操作。

cnds123的专栏 681

【Agent实战】Anthropic Skills、MCP与LangGraph的工程实践

随着大语言模型(LLM)应用从简单的Chatbot向自主智能体(Autonomous Agents)演进,如何管理复杂的任务上下文、标准化的工具调用以及确定性的业务流程,成为了系统设计的核心挑战。Anthropic 推出的 Skills 规范,结合 Model Context Protocol (MCP) 与 Function Calling,为构建模块化、可扩展的 Agent 提供了全新的范式。

kakaZhui的博客 584

# HarmonyOS NEXT 原生 ArkTS 布局实战:Clip + RoundRect 圆角裁剪深度解析

本文深入解析了HarmonyOS NEXT中ArkTS布局的圆角裁剪技术,重点介绍了三种实现方案:borderRadius+clip(true)、clipShape+Rect和Path自定义路径。通过底层渲染原理分析和技术对比,文章指出borderRadius+clip(true)是最灵活推荐的方案,支持四角独立半径和子元素溢出裁剪。实战部分包含完整项目架构、路由配置和核心代码解析,并提供了入口页面的实现示例,帮助开发者掌握鸿蒙原生UI的圆角裁剪技术要点。

woshi_xiaoa的博客 477

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

巧妙设置编辑为dirty

一。XXX extends DiagramDocumentEditor private boolean dirty = false; //是否被修改 public boolean isDirty() { return super.isDirty() || dirty; } /** * @generated NOT */ publi...

iteye_12456的博客 407

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

比goto跳转的更远的函数

本来以为goto就是“任意”的跳转了,今天才知道还有比它更能跳的。 goto是本地的:它只能跳到所在函数内部的标号上,而不能将控制权转移到所在程序的任意地点(当然,除非你的所有代码都在main体中)。 为了解决这个限制,C函数库提供了setjmp()和longjmp()函数,它们分别承担非局部标号和goto作用。头文件申明了这些函数及同时所需的jmp_buf数据类型。这种跳转功能主要用

ThinkHeart的博客 2504

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

sizeof的作用

int main() { int i = 3; int j; j = sizeof(++i + ++i); printf("i=%d j=%d", i, j); } 答案令我有点意外,是i=3 j=4。 根据这个结果,i++就没有进行运算,这算是对sizeof特性的一个认识吧。

ThinkHeart的博客 1339

C类型转换

int main(void) { signed short A = -10; printf("~A = %u\n", ~A); char c = 128; printf("c=%d\n",c); return 0; }     通过这个简单的测试,发现自己对类型转换的规则的细节需要做一个分析,以明确转化时的规则。    1.char转为为int类型,即有符号signed char转换

ThinkHeart的博客 918

C语言的平台相关性,编译器相关性

C 标准的 Rationale 之一: 优先考虑效率,而可移植性尚在其次。      这就要求程序员非常清楚这些规则,如果你要写可移植的代码,就必须清楚哪些写法是不可移植的,应该避免使用。      另一方面,写不可移植的代码有时候也是必要的,比如 Linux 内核代码使用了很多只有 gcc 支持的语法特性以得到最佳的执行效率,在写这些代码的时候就没打算用别的编译器 编译,也就没考虑可移植性

ThinkHeart的博客 884

得到一个field在结构体(struct type)中的偏移量

宏定义:得到一个field在结构体(struct type)中的偏移量 #define OFFSETOF(type, field) ((size_t)&(((type *)0)->field)) (type *)0:把0地址当成type类型的指针。 ((type *)0)->field:对应域的变量。 &((type *)0)->fiel

ThinkHeart的博客 760

一些C语言的dark corner

1、这两个不是关键字,所以可以这样: int include; void define(void); 2、数组不能直接互相赋值,而结构体可以的原因下面这个解释感觉合理: dmr 在 1970s 初发明 C 语言是为了替换汇编语言,以便他和 ken 写操作系统。为了可见性(visibility),当初 C 语言里每个 operation (包括 operator、function c

ThinkHeart的博客 577

读书计划之第二本《C专家编程》

读完了上一本的《C和指针》,自然不会错过《C专家编程》,这是一本编程大牛写的经验型的小册子,从第一章“C Through the Mists of Time”开始,就感到这是我需要的书,从一个历史见证人的角度阐述了令我困惑的C语言的种种问题和缺陷,相信这一章是国内的作者很少能写出来的。         这本书最精华和最实用的的部分是第三章“Unscrambling Declarations in

ThinkHeart的博客 480

新年读书计划--第一本--C和指针

看朋友圈受到启发,这一年要尽可能的多读书。 目前,已经用大约一周的时间完成了一本书的阅读,C和指针。总体感觉这是一部很有经验的程序员写的书,但是年代有些久远,总是拿K&R C和ASCI C做比较,印象比较深的有 指针那一章,列出了不少怪异的指针用法,而又没有给出这些用法的语法词法原理和分析过程,是个败笔。最后两章更是草草了事,有种虎头蛇尾的感觉。 翻译的也比较生硬,在指针那一章尤其明显,原作

ThinkHeart的博客 468
上一篇: 编译内核时的一些概念
下一篇: 得到一个field在结构体(struct type)中的偏移量
芯片之美
博客等级 码龄10年 33粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值