单片机用一个指针变量_单片机里面定义指针变量 - CSDN
  • 本来通过一个实例来解释C语言指针

    单片机C语言变量分别有char型,int型,long型,float型等,它们分别占用内存为1个单元,2单元,4单元,4单元等,另外数组和字符串则占用了内存某段连续的单元。这些变量的共同特征是它们都装的数值。那如果一个变量里面装的不是数值,而是地址,这个变量则称为指针变量。所以指针变量用于存储器的地址号。

    那么问题又来了,指针变量占多大内存呢?比如char *p,p指针变量前面用char修饰,莫非占一个单元?再例如 long *r,r指针变量前用long修饰,莫非是占4个单元?我们知道C51中,RAM的地址号是从0到255,ROM则是从0到65535。最大的地址号是正整数65535,显然有两个字节便可装下。因此C51中指针变量自身只占两个单元。

    既然如此那这些类型修饰符可以不要?我们知道,指针变量中装的是一个地址,也就是说通过这个地址,我便可以找到这个地址中的信息。如果指针指向的是一个char型变量,那么其通过指针(装载char型变量的地址)我找到了这个变量。但如果是指向一个float型变量呢,如果没有这个float来修饰指针变量,那么我们巡着指针只能找到一个字节的数据,而一个float型有4个字节,显然计算机就分不清是不是该把指针后面的三个字节视为一个完整的数据。所以指针变量前面的类型修饰符不是用于修饰指针变量自身所占用的地址数量,而是用于修饰指针变量中所存储的地址与后续地址之间的关联情况。

    接下来我们用一个实验来感受下指针的用法。

    实验、从单片机发送字符串0123456789到桌面串口调试助手。

    #include "reg51.h"
    #define u16 unsigned int
    #define u8 unsigned char
    
    void delay(u16 x)
    {
    	while(x--);
    }
    
    void Uart_Init() //串口初始化
    {
    	SCON=0x50; //8位异步模式
    	TMOD|=0x20;	//定时器1工作方式2
    	TH1=253;//9600bit/s
    	TR1=1;
    }
    
    void Send_Byte(u8 dat)	  //串口发送一个字节
    {
    	SBUF=dat; //启动发送,只需要把发送内容给SBUF这个寄存器
    	while(TI==0); //等待发送完成,因为TI为1时表示在发送停止位
    	TI=0;
    }
    
     void Send_String(u8 *str)	 //发送一个字符串	*str为字符串第一个字符的地址
     {
    	while(*str)
    	{
    		Send_Byte(*str);
    		str++;
    	}
    
     }
    
    void main()
    {
    	Uart_Init();
    	while(1)
    	{
    	   Send_String("0123456789");
    	   Send_Byte(10); //回车键
    	   delay(60000);
    	   delay(60000);
    	}
    }
    

    从仿真串口接收器来看,这个程序运行得很好。现在我把void Send_String(u8 *str)修改为void Send_String(u16 *str),重新编译并仿真,运行得到


    13579?跟着一串乱码,这又是为什么?u16是一个无符号int型,Send_String函数每次会取两个单元作为一个数传进来,进入while循环后,第一次就取"0"*256+"1"传给了Send_Byte函数,而Send_Byte只能装下u8型即一个单元数据,就就是高位的0要溢出,就只剩下1了。所以一直取到了9,之后因为while(*str),继续取字符串后续的内存单元,而这些内存单元里面是什么并不确定,所以显示乱码。

    同样我们可以尝试void Send_String(long *str)等等。另外补充一个知识点,定义chara; char *p; p=&a; 其中&是C语言求首地址运算符。


    展开全文
  • 指针变量 注:keil中单片机C编程 若指针没有指向提前声明的变量,会产生混乱 eg: 情景: 情景二: ...结论:情景二中,是指针使用的规范过程,先分配了变量,然后指针指向变量。 情景一中则没有定义变量,直

    指针与变量


    注:keil中单片机C编程


    若指针没有指向提前声明的变量,会产生混乱
    eg:
    情景一:              情景二:
    Type *p,*q;           Type *p,*q,pp,qq;
    给指针p赋值;              p=&pp;
    给指针q赋值;              q=&qq;


    p或q的值会出问题         正常,没问题(Type为一结构体)


    结论:情景二中,是指针使用的规范过程,先分配了变量,然后指针指向变量。
    情景一中则没有定义变量,直接用指针操作,出现错误,原因:因为指针只是用来存储变量的地址,指针作为局部变量被存储在内存的栈中,由于没有为指针赋值,那么指针变量内存储的内容是随机的,所以造成混乱。




    关于指针自身地址和指针所指地址
    keil中单片机C编程


    rf_packet_info *buff,buffer;


    uart_sendbyte(buff);  uart_sendbyte(&buff);  uart_sendbyte(&buffer);
    buff=&buffer;
    uart_sendbyte(buff);  uart_sendbyte(&buff);  uart_sendbyte(&buffer);


    烧写后第一次运行串口结果:
    03                      21                      27
    27                      21                      27
    第一次之后的输出结果:
    27                      21                       27
    27                      21                       27


    结论:uart_sendbyte(buff) 指针buff内所存的内容,即所指变量的地址,指针在被赋值前其值是随机的;
    uart_sendbyte(&buff)  指针自身的地址;
    uart_sendbyte(&buffer)  变量buffer的地址。
    展开全文
  • 单片机C语言指针变量

    2019-03-26 19:23:03
    C语言中指针一个神奇的东西,可以为编程带来极大方便。但使用不当又会产生意想不到的情景,需要大家慎重。下面Arduino Nano编辑一段程序,看如何更好的使用C语言的指针指针及其应用 首先在程序的开始部分先...

    C语言的指针及指针传递

    概述

    C语言中指针是一个神奇的东西,可以为编程带来极大方便。但使用不当又会产生不可预料的结果,需要大家慎重。下面用Arduino Nano编辑一段程序,看如何更好的使用C语言的指针。

    指针及其应用

    首先在程序的开始部分先定义两个变量:

    unsigned char Pixel[128];
    unsigned char *pixel_pt;
    

    第一个变量Pixel是一个数组,同时也是一个数组的指针。*pixel_pt是一个无符号变量的指针。下面用程序来说明如何使用指针型的变量。

    void setup() 
    {
      Serial.begin(115200);
      pixel_pt = Pixel;
      for (unsigned char i = 0; i < 128; i++)
        *pixel_pt++ = i;  
    }
    
    void loop() {
    
      if(Serial.available() > 0)
      {
        incomingByte = Serial.read();
        // printing title
        Serial.print("No");
        Serial.print("\t\t");
        Serial.print("Pixel");
        Serial.print("\t\t");
        Serial.print("*pixel_pt");
        Serial.println();
        pixel_pt = Pixel;      // 地址指针又指向Pixel[0]
        for (unsigned char i = 0; i < 128; i++)
        {
          Serial.print(i);
          Serial.print("\t\t");
          Serial.print(*pixel_pt++, HEX);
          Serial.print("\t\t");
          Serial.print(Pixel[i], HEX);
          Serial.println();
        }
          pixel_pt = Pixel;
          pixel_pt++;
          pixel_pt++;
          pixel_pt++;
          pixel_pt++;
          pixel_pt++;
          pixel_pt++;
          Serial.print("\r\n");
          Serial.print(Pixel[6], HEX);
          Serial.print("\r\n");  
          Serial.print(*pixel_pt, HEX);
          Serial.println();
          Serial.print(pixel_pt[6], HEX);
          if (memcmp(&pixel_pt[6], &Pixel[0x0C], 1) == 0)
            Serial.print("\r\nThe compare is OK");
          else
            Serial.print("\r\nThe compare is not OK");
      }
     
      delay(1000);  
    }
    

    运行结果

    No Pixel *pixel_pt
    0 0 0
    1 1 1
    2 2 2
    3 3 3
    4 4 4
    5 5 5
    6 6 6
    7 7 7
    8 8 8
    9 9 9
    … 省略
    126 7E 7E
    127 7F 7F

    6
    6
    C
    The compare is OK

    注意,在程序中使用了指针操作,pixel_pt++命令,相当于Pixel[i++]变址。用pixel_pt[6]也可以对地址变化后的第六个元素进行寻址。用Serial.print(pixel_pt[6], HEX);输出结果是C。

    展开全文
  • 1 指向对象的常指针变量与指向常对象的指针变量区别  Time * const p; //指向对象的常指针变量 p的值(p的指向)不能修改  const Time *p; //指向常对象的指针变量,p指向的类对象的值不能通过p来修改 1.1 ...

    1 指向对象的常指针变量与指向常对象的指针变量区别

      Time * const p; //指向对象的常指针变量  p的值(p的指向)不能修改

      const Time *p;  //指向常对象的指针变量,p指向的类对象的值不能通过p来修改

    1.1 指向对象的常指针变量

    将指针变量声明为const型,这样指针变量始终保持初值,不能改变,即其所指向不变。

    Timet1(10,12,15),t2;

    Time *const ptr1; //const位置在指针变量名前面,指定ptr1是常指针变量

    ptr1 =&t1; //ptr1指向对象t1,此后不能再改变指向

    ptr1 =&t2; //错误,ptr1不能改变指向

     

    注意:指向对象的常指针变量的值不能改变,即始终指向同一个对象,但可以改变其所指向对象(如t1)的值。

    什么时候需要用指向对象的常指针呢?如果想将一个指针变量固定地址与一个对象相联系(即该指针变量始终指向一个对象),可以将它指定为const型指针变量。这样可以防止误操作,增加安全性。

    往往用常指针作为函数的形参,目的是不允许在函数执行过程中改变指针变量的值,使其始终指向原来的对象

     

     

    1.2 指向常对象的指针变量

    指向常对象的指针最常用于函数的形参,目的是在保护形参指针所指向的对象,使它在执行过程中不被修改。

    ……

        int main()

        {

            void fun(const Time *);//函数声明,形参是指向常对象的指针变量

            Time t1(10,13,56);

            fun(&t1);              //实参是对象t1的地址

        

            return 0;

        }

       

        void fun(const Time *p)  //定义fun函数

        {

            p->hour = 18;         //错误

            cout<<p->hour<<endl;

        }


    展开全文
  • 对于指针变量,编译时它的值一般不能确定,需要额外的存储单元(例如寄存器)保存,生成间接寻址指令访问指针指向的对象。int a=10;int *p=&amp;a;首先,a变量存在内存里的块位置这位置里包含a变量的名称...
  • C语言结构体对函数指针封装示例 示例: #include <stdio.h> int i, j; struct DATE{ int year; char month; char data; char hour; char min; char sec; }; struct DATE date; struct str_func {....
  • # include int main(void) { int i = 373; double j = 4.5; char ch = 'A'; int * p = &i; double * q = &j; char * r = &ch; printf("%d %d %d\n",sizeof(p), sizeof(q), sizeof(r));...
  • SYD8801是款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。...单片机编译器中局部变量和全局变量的深入解析   ...
  • 若在C51中定义一个全局变量,编译器将在RAM中为该变量指定一个专用地址,在C程序中给变量赋的值将存入这个专用地址中,程序操作该变量是,首先从专用地址中取出存放的值,然后再进行计算。全局变量被定义在内存中的...
  • 我们知道,没有初始化的全局变量和static修饰的局部变量都会被编译器默认初始化为0,所以这些指针变量的地址是确定的0,其实也是NULL,所以他们不是野指针。未赋值的局部指针变量的值是随机分配的,为野指针,例如 ...
  • 编译器里定义一个指针变量,编译器就会给这个指针变量分配一个空间,这个空间存放的是内存的某个地址数据的,即这个指针变量是用来存放内存某地址的,编译器给这个指针变量分配的空间大小是和cpu寻址长度有关的,...
  • C51:Keil c51指针变量

    2015-06-28 11:44:57
    要在程序中使用变量必须先标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才 能为变量分配相应的存储空间。定义一个变量的格式如下:   [存储种类] 数据类型 [存储器类型] 变量名表 ...
  • 首先:假设p指向char类型变量 (占1字节)假设q指向int类型变量 (占4字节)假设r指向double类型变量(占8字节) 那么p,q,r它们本身所占的字结束是否一样?sizeof(数据类型)此运算符功能:返回值就是该数据...
  • 个指针之间的运算

    2018-07-23 10:28:27
    只有指向同一数组的俩个指针变量之间才可以进行计算。否则是没有意义的。 两指针变量相减 两指针变量相减所得之差是俩指针所指数组之间相差的元素数。实际上是俩指针值(地址)相减之差再除以该数组元素的...
  • 我们都知道有一个规则,那就是尽量不要使用全局变量,但自己写程序,有时感觉使用全局变量很方便,而且并没感到有什么缺点。 将网上查的的资料总结一下,发现全局变量的缺点主要有两个,其它具体的危害一般都是这两...
  • 结构体变量指针作为函数参数传递的例子,最近因为工作上的需要在处理单片机书如数据的时候需要,要使用结构体变量作为函数的参数进行数值的传递,最网上找了一下,发现介绍这部分的知识不是很多,并且比较杂,很多写...
  • 指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份...假设有一个 int 类型的变量 a,p1是指向 a 的指针变量,p2 又是指向 p1 的指针变量,它们的关系如下图所示: 将这种关系转换为C语言
  • 指针变量本身所占用的内存大小跟所指向的类型 没有任何关系。 它只跟当前CPU的寻址位数 和编译器的 位数有关。跟多少位的处理器无关 例如:  32位处理器上32位操作系统的32位编译器,指针大小4字节。  32位...
  • 单片机学习指针2

    2019-01-27 18:55:09
    关于此处的理解,可以知道HIDRxBuf[128]是一个全局变量,因此HIDRxBuf在这里指的就是一个地址,是一个确定的值,而ep-&gt;xfer_buff只进行了指针的声明,并没有进行向量的赋值,因此这里是...
1 2 3 4 5 ... 20
收藏数 8,591
精华内容 3,436
关键字:

单片机用一个指针变量