梅川酷子之指针妙用 指针实际上是存储器(或者外设)某个单元的名称,在一般的应用中,不需要知道指针的值,而更关心的是它指向存储空间的内容.下面通过几个例子来说明指针的使用方法. 以下实例均采用”小端模式”.在32位MCU中,不管是什么类型的指针,指针都是一个32位的值(0x????????).
例子1: 基本数据类型的指针 U32 Value=0x12345678; U8 *Ptr8;//定义一个8位指针 Ptr8=(u8 *)&Value;//用取址运算符得到Value的内存地址,然后强制转换(u8 *)成u8型指针那么,*Ptr8的值就是0x78,*(Ptr8+1)的值就是0x56, *(Ptr8+2)的值就是0x34, *(Ptr8+3)的值就是0x12.数组和指针实际上是等价的,Ptr8[0]相当于*Ptr8,Ptr8[1]相当于*(Ptr8+1),以此类推. U16 *Ptr16;//定义一个16位指针 Ptr16=(U16 *)&Value; 同样,*Ptr16和Ptr16[0]的值是0x5678,*(Ptr+1)和Ptr16[1]的值为0x1234;
例子2:指针与结构体变量 typedef struct { u8 a; u8 b; u8 c; u8 d; }MY_TYPE; MY_TYPE MyVar={0x78,0x56,0x34,0x12}; U8 *Ptr8; U16 *Ptr16; U32 *Ptr32; Ptr8=(u8 *)&MyVar;//相当于Pr8=(u8 *)&MyVar.a; Ptr16=(u16 *)&MyVar;//相当于Ptr16=(u16 *)&MyVar.a; Ptr32=(u32 *)&MyVar; //相当于Ptr32=(u32 *)&MyVar.a; *Ptr8等价于MyVar.a,也就是0x78 *(Ptr8+1)等价于MyVar.b,也就是0x56 *(Ptr8+2)等价于MyVar.c,也就是0x34 *(Ptr8+3)等价于MyVar.d,也就是0x12 *Ptr16的值为0x5678 *(Ptr16+1)的值为0x1234 *Ptr32的值为0x12345678
例子3:数组和结构体之间的复制 Void Copy(u8 *From,u8 *To,u8 Count) { While(Count--) { *To=*From;//复制一个字节 From++;//源指针指向下一个单元 To++;//目标指针指向下一个单元 } } 有了这个函数,就可以实现任何类型之间的内容复制了. MY_TYPE MyVar; U8 Bytes[4]; Copy((u8 *)&MyVar,Bytes,sizeof(MyVar)); 在这次Copy的调用中,第一个参数(u8 *)&MyVar是MyVar结构体变量”首地址”,被赋给了函数的*From,作为源地址;第二个参数Bytes则是数组Bytes[4]的基址,被赋给了函数的*To,作为复制的目的地地址;第三个参数sizeof(MyVar)则是结构体变量占用的字节数,被赋给了函数的Count,作为复制的字节数. MY_TYPE A,B; Copy((u8 *)&A,(u8 *)&B,sizeof(MY_TYPE)); 上面这个例子则是把结构体A的内容复制到结构B中.只要加上取址运算和强制类型转换,Copy可以复制任意两个类型变量
例子4:指针的直接和间接访问. 还是定义一个结构体变量和一个结构体指针: MY_TYPE Var; MY_TYPE *Ptr; Ptr=&Var;//把Ptr指向Var内存空间 此时,*Ptr和Var就是等价的了. *(Ptr.a)相当于Ptr->a相当于Var.a *(Ptr.b)相当于Ptr->b相当于Var.b *(Ptr.c)相当于Ptr->c相当于Var.c *(Ptr.d)相当于Ptr->d相当于Var.d *(Ptr.a)称为直接访问, Ptr->a称为间接访问. <梅川酷子原创> |
文章评论(0条评论)
登录后参与讨论