原创 梅川酷子之指针妙用

2011-1-8 22:56 1820 11 11 分类: MCU/ 嵌入式
 



梅川酷子之指针妙用

指针实际上是存储器(或者外设)某个单元的名称,在一般的应用中,不需要知道指针的值,而更关心的是它指向存储空间的内容.下面通过几个例子来说明指针的使用方法.


以下实例均采用”小端模式”.在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条评论)

登录后参与讨论
我要评论
0
11
关闭 站长推荐上一条 /2 下一条