0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言固件中指针的使用方法

multisim 来源:21IC 作者:21IC 2020-09-26 11:38 次阅读

使用指针值

修改和取消引用指针

有两个与指针关联的值。第一个是存储在指针本身中的存储地址,第二个是存储在该存储地址中的数据。要修改存储在指针变量中的地址,只需使用等号:

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语言固件中的指针以及如何开始使用它们有一个清晰的了解。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7561

    浏览量

    133403

原文标题:如何在C语言固件中使用指针

文章出处:【微信号:A1411464185,微信公众号:multisim】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    面试中的高频问题:指针函数与函数指针,你能完美应对吗?

    一直觉得 C 语言较其他 语言最伟大的地方就是 C 语言中的 指针,有些人认为
    的头像 发表于06-22 08:11 572次阅读
    面试中的高频问题:<b class='flag-5'>指针</b>函数与函数<b class='flag-5'>指针</b>,你能完美应对吗?

    C语言指针用法

    C 语言编程中善用 指针可以简化一些任务的处理,而对于一些任务(比如动态内存分配),必须要有 指针才行的。也就是说精通 C
    发表于03-05 14:22 239次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>的<b class='flag-5'>指针</b>用法

    c语言scanf的正确使用及技巧

    函数的正确使用及一些技巧。 scanf函数的基本用法 scanf函数是通过格式控制字符串来确定输入变量的类型和格式的。它的基本 使用方法是,首先将需要读取的变量的地址传递给scanf函数,然后在格式控制字符串 中指定变量的类型。例如,要读取一个整数并将
    的头像 发表于11-24 10:04 1801次阅读

    c语言max函数的使用方法

    C 语言是一门广泛使用的编程 语言,提供了许多内置的函数来执行各种任务。其中一个非常有用的函数是max函数,它用于比较两个值并返回较大的那个值。在本文中,我们将详细介绍max函数的 使用方法
    的头像 发表于11-22 10:15 8034次阅读

    C语言中链表的作用是什么?

    C 语言中指针用的很少,链表、文件操作几乎没用过,所以也不能理解到底有什么作用。各位有经常在做程序时会用到这些吗。
    发表于11-06 06:23

    C语言运算符的使用方法

    详细介绍了 C 语言表达式、算术运算符、赋值运算符、关系运算符、条件结构、逻辑运算符、位运算符的语法和 使用方法,并讨论了运算符的优先级。
    发表于11-02 11:30 844次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>运算符的<b class='flag-5'>使用方法</b>

    C语言条件结构的使用方法

    前面讨论了简单的条件结构。条件结构用于实现需要判断的情况,它以一个逻辑条件成立与否为条件,决定一个操作的执行或不执行,或执行两个不同的操作。前面介绍的if和if-else结构,它是 C 语言中实现判断
    发表于11-02 11:27 670次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>条件结构的<b class='flag-5'>使用方法</b>

    C语言循环结构的使用方法

    详细介绍了 C 语言while循环结构、do-while循环结构、for循环结构、循环退出语句的语法和 使用方法
    发表于11-02 11:26 976次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>循环结构的<b class='flag-5'>使用方法</b>

    C语言中数字怎么转成指针

    C 语言中数字怎么转成 指针,比如我要去内存地址为0x100的内容,用一句话表达,不如uchar a=?我要问号等于0x100地址的内容
    发表于10-31 06:29

    单片机C语言指针有什么用处呢?

    单片机 C 语言 指针有什么用处呢
    发表于10-23 07:18

    C编程中指针的语法和工作原理

    指针对许多 C编程至关重要,但它们可能很难理解。本文通过实际示例来复习它们的语法以及它们的工作原理。
    发表于10-21 17:54 651次阅读

    C语言指针讲解

    C 语言可以说是工科学生必不可少的编程 语言了,尤其是嵌入式的应用中 C 语言更是大厦之基,甚至在我的评价里他相比于数学对于工科生的作用等价。
    发表于10-01 13:25 198次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>指针</b>讲解

    c语言指针用法详解:如何使用指针变量做函数参数

    指针C 语言中一个比较重要的东西,有人说 指针C 语言的灵魂这句话说的一点也没错。 正确灵活地运用
    发表于09-21 12:32 951次阅读
    <b class='flag-5'>c</b><b class='flag-5'>语言</b><b class='flag-5'>指针</b>用法详解:如何使用<b class='flag-5'>指针</b>变量做函数参数

    C语言中int的使用方法关于数组的复合型表述详解

    C 语言中有没有见过(int [2]){19,20}或者int (*pt2)[4]的 使用方法,字面上可能不好理解,这是 C99之后才新增的知识点,名为复合型表述Compound Liter
    发表于09-19 15:04 526次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中int的<b class='flag-5'>使用方法</b> 关于数组的复合型表述详解

    为什么说指针C语言的灵魂呢?

    指针C 语言的灵魂,这句话并不夸张。
    发表于09-05 17:03 561次阅读
    为什么说<b class='flag-5'>指针</b>是<b class='flag-5'>C</b><b class='flag-5'>语言</b>的灵魂呢?