使用指针值
修改和取消引用指针
有两个与指针关联的值。第一个是存储在指针本身中的存储地址,第二个是存储在该存储地址中的数据。要修改存储在指针变量中的地址,只需使用等号:
rxbyte_ptr = 0x40;
复制代码
要访问存储在指针地址处的数据,请使用星号。这适用于阅读和写作。
receiveddata = *rxbyte_ptr; *txbyte_ptr = transmitdata;
复制代码
访问指针所指向的值称为解引用,星号(与指针一起使用)称为解引用运算符。
获取变量的地址
与指针的使用有关的一个重要细节是c“地址”运算符。此符号为&。尽管&附加在普通变量而非指针上,但我仍将其视为“指针运算符”,因为它的使用与指针实现紧密相关。
当在变量名的前面加上&时,程序将使用变量的地址而不是变量的值。
即使您不知道特定变量将在内存中的位置,这也使您可以将变量的地址放置在指针中。在以下代码片段中演示了&运算符的用法,该代码片段还用作基本指针用法的摘要。
《div id=“code_v2m”》
char displaychar; char testingvariable; char *displaychar_ptr; displaychar = 0x41; displaychar_ptr = &displaychar; testingvariable = *displaychar_ptr; *displaychar_ptr = 0x42; testingvariable = displaychar;
复制代码这是此代码的逐步说明:
displaychar = 0x41;
复制代码
现在,displaychar变量将保存与ascii‘a’相对应的值。
displaychar_ptr = &displaychar;
复制代码
指针(displaychar_ptr)现在保存变量displaychar的地址。我们不知道该地址是什么,即我们不知道displaychar_ptr中存储的数字。此外,我们不需要知道;这是编译器的业务,而不是我们的业务。
testingvariable = *displaychar_ptr;
复制代码
现在,testingvariable保存displaychar变量的值,即0x41。
*displaychar_ptr = 0x42;
复制代码
我们刚刚使用了指针来修改存储在与displaychar变量对应的地址中的值;现在它具有0x42,即ascii‘b’。
testingvariable = displaychar;
复制代码
现在,testingvariable的值为0x42。
指针算术
txbyte = *(txbuffer + 1); txbyte = txbuffer[1];
复制代码
在大多数情况下,c变量持有一个可以变化的值,指针变量也不例外。用于修改指针值的常见算术运算是加法(例如txbyte_ptr = txbyte_ptr + 4),减法(txbyte_ptr = txbyte_ptr-4),增量(txbyte_ptr ++)和减量(txbyte_ptr--)。只要两个指针具有相同的数据类型,就可以从另一个指针中减去一个指针。但是,您不能将一个指针添加到另一指针。
指针算术并不像看起来那样简单。假设您有一个数据类型为long的指针。您正在调试一些代码,当前正在单步执行一个例程,该例程会重复递增该指针。您在“监视”窗口中注意到,指针的值不会随着每次增加而增加一。这里发生了什么?
如果您不能轻易想到答案,则应该花更多的时间考虑指针的性质。此代码中的指针与长变量(即占用四个字节内存的变量)一起使用。当您增加指针时,您实际上并不希望指针的值增加一个内存位置(在此假设内存是按字节组织的)。而是,您希望它增加四个存储位置,以便它指向下一个long变量。编译器知道这一点,并相应地修改了指针的值。
当您向指针添加数字或从指针减去数字时,也会发生同样的事情。指针中存储的地址不一定会增加或减少该数字。相反,它将增加或减少该数字乘以指针数据类型的字节大小。
指针和数组
指针和数组密切相关。声明数组时,实际上是在创建一个常量指针,该常量指针始终保存数组的起始地址,并且我们用来访问数组元素的索引符号也可以与指针一起使用。
例如,假设您有一个名为txbuffer的char指针,该指针当前保存地址0x30。以下代码片段显示了两种等效的访问地址0x31处数据的方式。
txbyte = *(txbuffer + 1); txbyte = txbuffer[1];
复制代码
何时使用指针
在本节中,我想简要讨论两种编码情况,它们可以受益于指针的使用,并且与嵌入式应用程序特别相关。
指针与数组
从上一节的讨论中可以很自然地得出第一个。指针提供了另一种处理以数组形式存储的数据的方法。在给定例程的上下文中,指针方法可能更直观或更方便。
但是,在某些情况下,基于指针的实现可以提高代码速度。我的理解是,在编译器高度复杂并且能够进行如此广泛的优化之前,这在过去更为正确。不过,在嵌入式开发的背景下,我认为在某些情况下指针可以提供不可忽略的执行速度改进。如果您确实试图达到执行给定代码部分所需的最小时钟周期数,那么值得尝试一下指针。
将指针传递给函数
功能的广泛使用可帮助您编写井井有条的模块化代码。这是一件好事,尽管c施加了在某些情况下可能很尴尬的限制:一个函数只能有一个返回值。换句话说,它只能修改一个变量,除非使用指针。
此技术的工作原理如下:
包括一个指针作为该函数的输入之一。
使用&运算符将变量的地址传递给函数。
在函数内部,变量的地址成为指针的值,并且函数使用解引用运算符修改原始变量的值。
即使原始变量没有直接通过返回值进行修改,该函数之后的代码也假定该变量的值已被修改。
这是一个例子:
#define stepsize 3
char increasecnt_and_checkled(char *count)
{
*count = *count + stepsize;
if(led == true)
return true;
else
return false;
}
int main()
{
char risingedgecount = 0;
char led_state;
。..
。..
led_state = increasecnt_and_checkled(&risingedgecount);
。..
。..
}
复制代码
结论
我希望您现在对c语言固件中的指针以及如何开始使用它们有一个清晰的了解。
AI是否可以武装机器人
Eidoo应用项目的开展将成为区块链中的瑞士军刀
联发科技手持四张王牌 掀开智能驾驶的未来
交流接触器的基本技术参数
闪存门后时代,华为手机增速减缓,OPPO或可超越成为国内第一!
C语言固件中指针的使用方法
基于STM32CubeMX生成HID双向通讯工程的说明
如何构建芯片可靠性模型?
如何将LED显示屏与WiFi网络、微信、手机APP结合 将成为LED显示屏企业和媒体研究的重点
解读基于矢量网络分析仪ZVB的放大器测试分析
中国知名传感器品牌及国内主要传感器企业介绍
51单片机对串联锂离子电池组监测系统的设计
电子芯闻早报:大脑芯片植入助瘫痪者恢复知觉
基于3G通信网的移动机器人远程监控的设计与实现
新能源汽车充电桩插头如何实现过热保护?
华为海洋许剑涛:海底光缆有三大发展趋势
预计五年内全球智慧城市市场价值将达2.46万亿美元
变频器的基本参数有哪些?变频器参数该如何设置?
南昌市教育局与科大讯飞成功签署战略合作协议
激光电视市场发展前景如何?