关于指针强制转换

1. 指针变量,大小都是四个字节(32bit),内容就是指向的对象的首地址。不同类型指针不同点就是对首地址之后的那块内存会做不同解释

2.定义指针变量:

int*ptr ; /*定义ptr为类型为int的指针变量*/

ptr指向了一块内存的首地址,这块内存的大小是sizeof(int)个字节。

*ptr = 1;/*把数值1赋值给ptr所指向的4个字节的内存空间里*/


3.指针的强制转换

请看下例:

 float f=12.3;  

 float *fptr=&f; 

 int *p;  

在上面的例子中,假如我们想让指针p指向实数f,应该怎么搞?是用下面的  语句吗?  

p=&f;  不对。因为指针p的类型是int*,它指向的类型是int。

表达式&f的结果是一  个指针,指针的类型是float*,它指向的类型是float。两者不一致,直接赋值的  方法是不行的。

对指针的赋值语句要求赋值号两边的类 型一致,所指向的类型也一致。

为了  实现我们的目的,需要进行“强制类型转换”:  p=(int*)&f;  如果有一个指针p,我们需要把它的类型和所指向的类型改为TYEP*和TYPE,  

那么语法格式是:  (TYPE*)p;  

这样强制类型转换的结果是一个新指针,该新指针的类型是TYPE*,它指向的  类型是TYPE,它指向的地址就是原指针指向的地址

。而原来的指针p的一切属性都 没有被修改。


例如:

int main()
{
int data = 0x1234;
char *ptr = (char*)&data;
cout<<hex<<*ptr<<endl;
return 0;

}

我的PC是小端模式,data在内存中存储情况是:从低地址到高地址依次存0x34 0x12 0x00 0x00

输出的结果是:4


4. 指针强制转化常用于CPU寄存器地址的编写

例如:

DSP6678中,按照手册寄存器地址写好结构体

typedef struct  {
    volatile Uint32 XMPAXL;
    volatile Uint32 XMPAXH;
} CSL_XmcXmpaxRegs;


typedef struct  {
    CSL_XmcXmpaxRegs XMPAX[16];
    volatile Uint8 RSVD0[384];
    volatile Uint32 XMPFAR;
    volatile Uint32 XMPFSR;
    volatile Uint32 XMPFCR;
    volatile Uint8 RSVD1[116];
    volatile Uint32 MDMAARBX;
    volatile Uint8 RSVD2[124];
    volatile Uint32 XPFCMD;
    volatile Uint32 XPFACS;
    volatile Uint8 RSVD3[8];
    volatile Uint32 XPFAC0;
    volatile Uint32 XPFAC1;
    volatile Uint32 XPFAC2;
    volatile Uint32 XPFAC3;
    volatile Uint8 RSVD4[224];
    volatile Uint32 XPFADDR[8];
} CSL_XmcRegs;


#define CSL_XMC_CONFIG_REGS     (0x08000000)/*指定此寄存器的地址*/


CSL_XmcRegs * XMC_regs = (CSL_XmcRegs *) CSL_XMC_CONFIG_REGS;

/*将CSL_XMC_CONFIG_REGS地址所指向的类型强制转换成CSL_XmcRegs结构体*/

那么XMC_regs这个指针就指向了0x08000000地址上的寄存器,通过XMC_regs很容易的对应到各个寄存器了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值