嵌入式C语言编程中经验教训总结(五)又爱又恨的指针

33 篇文章 2 订阅
8 篇文章 1 订阅
本文探讨了嵌入式C语言编程中的指针使用经验,包括指针与内存的关系、单片机与标准C指针的异同、如何避免野指针以及指针与数组的运算。通过实例解析,阐述了不同类型的指针变量存储单元长度相同但数据占用空间不同,并提到了在不同环境下指针的管理方式。同时,强调了野指针的危害及避免方法,以及数组名作为指针常量的特点。
摘要由CSDN通过智能技术生成

标题嵌入式C语言编程中经验教训总结(五)又爱又恨的指针

拖了很久,一直不太敢写关于指针的经验教训,实在以往的经历中有太多、太深刻了的教训了,指针,作为C语言中的一个重要特点,也是最灵活、最容易出错的部分。指针即内存中的地址,指针变量是用来存放内存地址的变量,如下图

在这里插入图片描述

指针和内存的关系

计算机中内存的最小存储单位是一字节,相当于char类型的一个字符占用的位置,由8个位 (0/1)组成,一个32位int消耗4个字节 即占据4个连续的内存单元,怎么管理这些内存单元你,就需要每一个内存单元都有一个唯一的编号,这个编号也就是地址 ,32位环境下 所有指针变量的大小都是4字节,64位环境下 所有指针变量的大小都是8字节。也就是说 32位环境下 int* 与 double* 占据的内存单元数量都是4,但是指针的类型不一样 我们不应该混用 尽管物理空间上可以直接赋值相等,其中int类型占据4个字节 double类型占据8个字节,而两者指针变量大小都是4个字节,指针类型的作用就是告诉编译器,该地址开始占据多少连续内存单元,举例如下:
int a=0x12345678;
int *pi=&a;
short *ps=&a;
char *pc=&a;
则:
*pi=12345678
*ps=5678
*pc=78
明白乎?不同类型的指针变量所占用的存储单元长度是相同的,然而而存放数据的变量因数据的类型不同,所占用的存储空间长度却并不相同。指针指向的对象可以是变量、数组、函数等占据存储空间的实体。

单片机指针和标准c语言指针的异同

在pc机应用的标准c语言环境下,用户程序操作的地址并不是真实的地址,是操作系统从内存的某一段虚拟给你的地址,程序运行是动态分配,每次都不一样,不同程序所使用的内存互不干扰。而你的程序退出后,所拥有的空间就被系统全部回收了。也就是说,内存并不是由你管理的,而是操作系统管理的。而在单片机或arm的系统中,不完全是这样的,在不同的嵌入式平台中,cpu架构不同,寻址范围不同,有没有os来管理,都造成实际开发过程中指针使用中的不同,比如在51单片机中,我们可以定义绝对地址的指针,例如:

#define LCD_RW XBYTE[0x8000]
#define LCD_Ctrl XBYTE[0x8001]

指向LCD控制器的数据读写地址0x8000或控制地址0x8001地址
或者使用 _at_关键字直接将数据定义在特定地址空间,例如:
xdata char textData[128] _at_0xE000;指定textData数组从0E000H开始
这在pc平台标准c语言中是很少见的。

避免野指针

野指针是指向不明区域、非法区域的指针,例如:
int *p;
*p=10;

这里的p声明后,没有固定的指向,而p=10 往往会造成系统的崩溃,如果该地址空间是保留给操作系统的,系统会kill相关程序。

指针与数组

c语言中,如果声明数组

int Arr[100];
数组名是一个指针常量 固定地址值,假设为Add,则
Arr[0]*(Add+0)
Arr[0]
(Add+1)
。。。 。。。
Arr[99]==
(Add+99)

注意,没有Arr[100],详见前面的blog。

Add不能作为左值被修改 但是可以赋值给其他指针变量,赋值后 两者共同指向同一块内存区域

sizeof(Arr)可以获得的数组素个数

指针的运算

指针的基本运算包括:

  1. 取地址运算符 &,“&”的功能是取变量的地址。

  2. 指针运算符 ,“”的功能是取指针变量所指向地址中的内容,与取地址运算符“&”的运算是互逆的,运算结果就是地址对应的变量。

  3. 指针变量 +1 或者 ++ 实际上是移动指针指向下一个元素,移动字节数就是对应类型所占用的字节数

  4. -1 或 – 同上

先这么多吧,以后继续!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyjbj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值