指向数组的指针

点击打开在线编译器,边学边练

在串口章节和液晶屏章节的部分代码中总是看到“  *str!='\0'  ”和“  *str++  ”却一时难以理解意思,本节我们将简要讲解这两部分代码的含义,但前提需要大家有对指针方面的知识基础,建议先了解《手把手教你学51单片机》文档12.1节知识内容先。


1.代码解析

我们先定义一个数组“u8 LEDSET[4]={0x7E,0xBD,0xDB,0xE7};”

假设这四个元素的内存排布如下,5,6,7,8代表的是指向元素的指针。

每个数组初始化之后都会在最后那个元素内存的下一个内存分配有一个结束符的数据,“‘\0’”的ASCII码值就是0。

11.0.png

接着我们先把下面代码下载进开发板中观察现象

#include <reg52.h> 
#include <function.h>//详见第六章第8讲 
 
void LED_task(u8 *str)
{ 
    while(*str != '\0')//连续发送字符串数据,直到检测到结束符
    {
        P0=*str++;
        delay_ms(1000);
    }  
}
 
void main()
{  
    u8 LEDSET[4]={0x7E,0xBD,0xDB,0xE7};
    LED_Init();//初始化LED硬件模块
 
    LED_task(LEDSET);
    while(1);
}

主函数里我们只需关注“LED_task(LEDSET);”,传入的参数是指针类型,LEDSET就是指向数组第一个元素的指针,也就是指向的是0x7E,指针是5。

在“while(*str != '\0')”里,由于传入的指针里面的值不是结束符,所以可以进入循环体,此时执行“P0=*str++;”。

“*str++;”的意思是,先把0x7E这个值赋给P0先,然后指针加1,此时的指针就是6了。

那么就有“P0=0x7E;”延时一秒之后,重新判断“while(*str != '\0')”,显然指针为6的内存里也不是结束符,而是0xBD,所以执行“P0=0xBD;”延时一秒。

后面再执行两次赋值给P0为0xDB,0xE7之后,由于此时指针加1之后指向了0x00,也就是结束符,不满足了“while(*str != '\0')”,该函数就执行完了。于是就到执行主函数里的“while(1);”,后面我们看到开发板的实验现象就是中间两盏灯一直保持常亮,因为已经执行完“LED_task(LEDSET);”了。


本文固定URL:https://www.dotcpp.com/course/428

第一章 单片机入门
第二章 LED
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)