首页 理论教育 Arduino单片机实战开发技术:指针标量简介

Arduino单片机实战开发技术:指针标量简介

时间:2023-10-23 理论教育 版权反馈
【摘要】:所有指针变量都持有完全相同的数据类型——内存地址。换句话说,所有指针变量都被设计为保存左值,而不是右值。图8-3指针标量示意图在图8-3中,请注意char指针是如何使用1字节的标量的,使其能够“查看”char数据类型。这意味着int指针有一个2字节的标量,因此它可以正确地“查看”int数据类型。如果使用长整型类型说明符定义指针,其标量将为4字节。因此,你可以得出结论:特定指针的标量值等于在内存中存储该数据类型所需的字节数。

Arduino单片机实战开发技术:指针标量简介

看看以下两个指针定义:

char*ptrLetter;

int*ptrNumber;

这两条语句都定义了指针变量,但每个指针的类型说明符告诉你,它们将与不同的数据类型一起使用。当编译器看到这两个定义时,它将符号表中添加这两个定义,并为每个定义分配内存。当编译器完成时,内存可能是图8-2所示的效果。如果仔细查看图8-2,则可以看到每个指针使用2字节的存储空间显示。真奇怪,前面讲过的定义数据类型时,char数据类型是1个字节,int型使用2个字节。然而,指针定义显示每个指针需要相同的存储量:2字节。为什么?

图8-2 指针类型示意图

接下来看一下Arduino内存类型:

Arduino系列开发板有三种类型的内存。第一种是程序(或闪存)内存,你的程序就是在这部分内存中加载的。这个内存是非易失性的。也就是说,当电路板断电后,程序仍然在内存中保留完整。第二种是存储器型,就是静态随机存取存储器(SRAM)。你在应用程序中使用的数据就存储在SRAM内存中。SRAM存储器是易失性存储器,这意味着一旦断电数据就会丢失。第三种类型的内存是电可擦除可编程只读存储器(EEPROM)。EEPROM存储器也是非易失性的,这意味着即使断电,它也可以保留数据。然而,访问EEPROM内存比闪存慢得多,而且它能循环利用大约100000次。因为在这些限制中,EEPROM通常用于存储程序配置数据(即不经常变化的数据)。例如,如果你的程序有一个初始化步骤,该步骤必须使用一些数据初始化一组传感器或其他对象,EEPROM将是存储这些数据的好地方。

正如你在第7章中所了解到的,当你的程序运行时,变量进入作用域或者离开作用域时需要程序代码做什么。这些变量存储的数据在SRAM中,你可以将其视为像我们在第7章讨论的堆栈一样。因为SRAM的数量小于65K(即2字节无符号整数的最大值),只需2字节即可存储程序的数据。与PC不同,PC可能有千兆字节的内存,因此必须使用4字节内存地址,你的开发板可以使用2字节指针,因为SRAM的数量相对较少(有一些芯片可以处理更大的内存大小,因此可以使用4字节指针)。(www.xing528.com)

这就是为什么不管指针的类型说明符如何,每个指针变量都需要相同的存储量。所有指针变量都持有完全相同的数据类型——内存地址。换句话说,所有指针变量都被设计为保存左值,而不是右值。事实上,如果正确使用指针,则有效指针只能包含以下两种之一:

(1)存储器地址。

(2)该值为空。如果指针的值为null((void*)0),则指针不会指向有效数据。

到目前为止,你知道所有指针变量都分配了足够的存储空间来保存内存地址,并且所有(正确使用的)指针只能有两种类型的值:内存地址或Null;如果指针的右值为null,则指针不指向有效数据。好吧,但是这个标量的东西从哪里来?如图8-3所示。

图8-3 指针标量示意图

在图8-3中,请注意char指针是如何使用1字节的标量的,使其能够“查看”char数据类型。正是指针的类型说明符允许指针正确使用其指定的数据类型。你知道int数据类型需要2字节的存储空间。这意味着int指针有一个2字节的标量,因此它可以正确地“查看”int数据类型。如果使用长整型类型说明符定义指针,其标量将为4字节。回顾表3-1,该表的中间一列(即字节长度)告诉你不同数据类型的标量。因此,你可以得出结论:特定指针的标量值等于在内存中存储该数据类型所需的字节数。然而,在所有情况下,指针仍然只需要2字节的存储空间。

在这一点上,你可能会提出疑问:指针给列表带来了什么,使它们有价值?在我们还没完全回答这个问题之前,你需要了解如何初始化指针。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈