发 帖  
原厂入驻New

[经验] C编程中的指针:什么是指针,它做什么?

2020-9-8 23:30:28  242 c语言 指针
分享
4
什么是指针?
指针是变量。像其他变量一样,它具有数据类型和标识符。但是,使用指针的方式与使用“普通”变量的方式根本不同,并且必须使用星号告诉编译器应该将变量视为指针。这是指针声明的两个示例:
  1. char        *RxByte_ptr;
  2. int        *ADCValue_ptr;
复制代码
标识符不需要包含将变量标记为指针的字符(例如“ ptr”)。但是,我强烈建议您这样做。这将帮助您使思想更加井井有条,并且如果您以这种方式标记了所有指针,那么其他工程师将更容易理解您的代码。

指针做什么?
它指出。更具体地说,它指向另一个变量的数据,或者指向存储在内存中但未与变量关联的数据。



我们通常认为变量是存储数据的东西,“数据”是指将用于计算,或发送到另一设备,或加载到配置寄存器或用于控制LCD像素的信息。指针是变量,但不用于存储此类数据。而是,指针存储一个存储器地址。


温度数据存储在位于内存地址0x01的变量中,蓝色变量是保存温度数据存储地址的指针。
也许这是一些人开始感到困惑的时候,我认为发生这种情况是因为很容易忽略处理器内存的物理现实。内存块是一组数字存储单元的集合。对于8位处理器,每组存储单元对应一个字节。区分一个组和另一个组的唯一方法是通过一个地址,而这个地址就是一个数字。指针是一个存储数字的变量,但是该数字被解释为地址,即,它是指定内存中确切位置的值。
让我们用一个简短的类比来强化这个概念。想象我站在图书馆里,有人走到我面前说:“谁是狮心王理查德?” 如果我回答说:“ 1189年至1199年的英格兰国王”,那我就像一个正常变量。我正在提供人想要的信息,数据。相反,如果我以一本名为《英格兰中世纪君主》的书作为回应,那我就像一个指针。我没有提供所需的数据,而是指出了可以在何处找到这些数据。我仍然包含有用的信息,但这些信息是不是事实本身,它是定位在那里的人可以访问这一事实。

了解指针数据类型
正如您在上面显示的示例中可能已经注意到的那样,指针是使用数据类型声明的。也许这会导致难以理解指针的真正含义。如果指针仅仅是与存储位置的地址相对应的数字,那么不同的数据类型将如何发挥作用?例如,如果您的微控制器具有4 kB的RAM,那么怎么会有指针具有char数据类型呢?无符号字符的最大值为255;最大值为255。如果该指针必须指向位于内存地址3000的变量,会发生什么?
理解此问题的关键如下:指针的数据类型不指示使用多少字节存储其值。而是,用于存储指针值的字节数与必须访问的内存地址数相对应,而与指针的数据类型无关。此外,指针的大小由编译器确定,并且对于程序员而言不是直接可见的。

考虑下图:



假设我们使用的可悲的微控制器只有11个字节的RAM。8位数字提供的值的范围是0到255,因此一个字节的内存足以代表该设备中所有可能的内存位置。

该图强调了一个事实,即使声明为long的变量也可以通过一个字节的指针进行访问。蓝色变量是一个指针,用于保存32位变量Seconds_Cnt的地址。该变量使用四个字节的内存,但是变量的地址(在此示例中对应于最低有效字节)将始终为等于或小于0x0A的数字。指针必须使用long数据类型声明,因为它与long变量一起使用,但是指针本身占用一个字节的内存,而不是四个字节。


评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表