指针是地址的同时,指针还是类型。“指针会指向一种数据类型首地址”这是一位姓的同事说的。其实这也是指针类型的本质。如果您使用过STM32的芯片,那么对这个就更加深刻了。比如对IO的操作就使用了结构的指针。
所以指针本来地址,但是指针类型可以任意定义,给指针注入了极大的活力。这也成位C生命力的一个主要原因。
unsigned char *pUchar;
unsinged int *pUnInt;
这是两个指针类型,pUchar可以指向一个unchar 类型的数据的地址。pUnInt是指向一个unint类型的数据地址。灵活运用指针的类型可以提高系统的运行效率。因为无论那种计算机系统中赋值语句总比其他语句效率高。这个在与非网的博主“凤舞天”的系统也有应用。大家可以关注他。
我们写一段代码分析一下。
#include
int main(void)
{
unsigned char *pUnchar;
unsigned int *pUInt;
unsigned int x;
x=0x12345678;
pUInt=&x;
pUnchar = pUInt;
printf("*pUnchar=%x\r\n",*pUnchar);
printf("*(pUnchar+1)=%x\r\n",*(pUnchar+1));
printf("*(pUnchar+2)=%x\r\n",*(pUnchar+2));
printf("*(pUnchar+3)=%x\r\n",*(pUnchar+3));
}
以上代码在VC6.0中运行结果:
我们来分析一下这段代码,首先变量x赋值为0x12345678,然后指针pUInt指向x的地址,我们有将pUInt的值赋给了pUnchar。pUnchar也指向了变量x的地址。因为x的值为0x12345678,pUnchar的类型是unsigned char ,所以只能指向一个字节的变量。上位机中数据高位在高地址,低位在低地址。pUnchar指向低地址。所以初值是0x78,我们逐步上移,就索引到了0x56、0x34、0x12。
也就是我们通过一个unsigned char的指针拆分了一个unsigned int数据。这在数据通讯过程中是非常有用的。因为如果需要按照字节发送一个整型数据,那么在发送端可以轻松的拆分。在接收端可以轻松的还原。
在下一节我们继续通过代码介绍数据的拆分和还原。