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很容易的对应到各个寄存器了。
9208

被折叠的 条评论
为什么被折叠?



