初步了解指针二

本次博客来带大家了解指针±整数

文字抽象直接上图:

 由上图可知,指针的相加减和指针类型有所关联,int*类型加减变化了四个字节,char*类型加减变化了一个字节,double*类型加减变化了八个字节。

结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)。

void*指针:

关于void*指针,可以把它理解为一个万能垃圾桶,什么类型的指针都可以往里存放,但是void*类型指针不能相加减,使用void*指针之前,最好把它强制类型转换(强转符号为()),不然·编译器报错或加减没有意义:

没强转会报错:

const修饰指针:

我们知道,一些变量被const修饰之后,会变得无法被更改,指针也是如此,但是,修饰的方法会有两种情况,直接上图:

一个是修饰int*类型,一个是修饰指针变量p,这两种修饰方法产生的结果会有不同

最直接的,看到报错信息我们可以知道,testp1函数指针进去的结果会让int*p修饰的n无法被修改,但也可以直接改n这不会有影响,对指针变量加减也没有影响

testp2函数指针进去会发现,const修饰的是p这个指针变量,所以导致p这个指针变量无法被改变,但是不会影响对指针p解引用之后对它修饰的值做改变。

希望我的文章会对读者有帮助,我以为会努力提高文章质量让文章更加通俗易懂。

IAR Embedded Workbench 是一款广泛应用于嵌入式系统开发的集成开发环境(IDE),支持多种微控制器架构,如 ARM Cortex-M 系列、STM8、AVR、MSP430 等。它提供了一整套开发工具链,包括编辑器、编译器、链接器、调试器以及静态代码分析工具,适用于从项目创建到调试、优化的全流程开发需求[^1]。 ### IAR Embedded Workbench 的主要功能模块包括: - **编辑器**:支持语法高亮、代码折叠、自动补全等功能,提升代码编写效率。 - **编译器**:基于 C/C++ 标准,支持 ANSI C、C99 和 C++11 等标准,具备高效的优化能力。 - **链接器(ILINK)**:用于将多个目标文件和库文件链接为可执行文件,支持分散加载(scatter loading)功能,适用于复杂内存布局的嵌入式系统[^1]。 - **调试器(C-SPY)**:支持硬件仿真器和软件仿真,提供断点、单步执行、变量观察、寄存器查看等功能。 - **静态分析工具(C-RUN)**:在运行时检测运行时错误,如数组越界、空指针解引用等。 - **插件支持**:例如 AStyle 插件可用于代码格式化,支持多种风格配置,如 Allman 缩进风格、操作符填充、最大代码行长度限制等。 ### IAR 的启动流程与初始化 在基于 Cortex-M3 的项目中,IAR 会在 `main()` 函数执行之前完成一系列初始化操作。这些操作通常包括: - **设置堆栈指针**:从复位向量开始,初始化主堆栈指针(MSP)。 - **执行复位处理函数**:进入 `Reset_Handler`,该函数通常由启动文件(startup 文件)定义。 - **初始化 .data 和 .bss 段**:将初始化数据从 Flash 拷贝到 RAM,并将未初始化数据清零。 - **调用系统初始化函数**:例如 `SystemInit()`,用于配置系统时钟。 - **跳转到 `main()` 函数**:完成上述初始化后,进入用户主函数 `main()`。 ### 工程结构与文件组织 在 IAR 中组织工程时,通常会创建多个文件组(Group),用于分类管理源代码文件。例如: - **User Group**:存放用户自定义的 `.c` 和 `.h` 文件。 - **Lib Group**:存放第三方库文件或官方提供的驱动库。 - **Startup Group**:存放启动文件(如 `startup_stm32f10x_md.s`),用于定义中断向量表和复位处理程序[^2]。 通过合理组织文件结构,可以提升工程的可维护性和可读性。 ### 分散加载(Scatter Loading) 分散加载是一种将代码和数据分配到不同内存区域的技术。在 IAR 中,通过链接器脚本(`.icf` 文件)定义内存布局和段分配规则。例如: ```c /* Linker script example for IAR */ define memory with size = 4G; define region ROM = mem:[from 0x08000000 to 0x0807FFFF]; define region RAM = mem:[from 0x20000000 to 0x2000FFFF]; place at address mem: 0x08000000 { readonly section .intvec }; place in ROM { readonly }; place in RAM { readwrite }; ``` 该脚本定义了 Flash(ROM)和 RAM 的地址范围,并指定 `.intvec` 段位于 Flash 起始地址,其余只读段也放在 ROM,而可读写段则放在 RAM 中[^1]。 ### 入门指南 1. **安装与配置**:下载并安装 IAR Embedded Workbench,选择对应的目标芯片型号。 2. **创建新工程**:选择“File > New > Project”,选择目标设备,创建空白工程或模板工程。 3. **添加文件组与文件**:右键点击工程,选择“Add Group”,并为不同类型的文件建立组。 4. **配置编译选项**:包括优化等级、调试信息、预处理器宏定义等。 5. **配置链接器脚本**:根据硬件内存布局修改 `.icf` 文件。 6. **编译与下载**:点击“Project > Rebuild All”进行编译,使用调试器将程序下载到目标设备。 7. **调试与优化**:使用 C-SPY 调试器进行单步调试、变量观察等操作。 ---
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值