嵌入式C语言编程中经验教训总结(七)指针、指针数组和数组指针
嵌入式C语言编程中经验教训总结(七)指针、指针数组和数组指针
指针
在嵌入式C语言中,数组的指针是指数组在内存中的起始地址,数组元素的地址是指数组元素在内存中的起始地址。例如
int Buff[100];
int *pBuf = Buff;
其中Buff[100]为一个包含100个元素的数组,pBuf为指向Buff数组的指针,所以
Buff[0] 和*pBuf获取的数据是一样的。同样,我们也可以申请字符数组和指针,例如:
unsigned char DL645Cmd_ReadCommAddr[20]=
{12,0x68,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x68,0x13,0x00,0xDF,0x16}; //读通信地址
其存储了电力抄表系统常用的读通信地址的645命令,我们声明一个指向它的指针:
unsigned char *pCmd = DL645Cmd_ReadCommAddr;
通过下面的循环,就可以依次取出命令字:
for(i=0;i<len;i++)
{
//SendDate = DL645Cmd_ReadCommAddr[i]; //方式1
SendDate = *pCmd(i); //方式2
//载波发送部分;
。。。 。。。
}
指针数组:
指针数组指的是声明的数组里,各个元素均为指针,例如:简单的定义:
int *a[10];
我们就声明了一个包含10个int型指针的数组。更复杂的情况下,还以645命令的定义为例:
unsigned char DL645Cmd_ReadCommAddr[20]={0x68,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0x68,0x13,0x00,0xDF,0x16}; //读通信地址
unsigned char DL645Cmd_ReadVoltageA[20]={0x68,0x11,0x11,0x11,0x11,0x11,0x11,0x68,0x11,0x04,0x33,0x34,0x34,0x35,0x1B,0x16}; //读A相电压
unsigned char DL645Cmd_ReadVoltageB[20]={0x68,0x11,0x11,0x11,0x11,0x11,0x11,0x68,0x11,0x04,0x33,0x35,0x34,0x35,0x1C,0x16}; //读A相电压
unsigned char DL645Cmd_ReadVoltageC[20]={0x68,0x11,0x11,0x11,0x11,0x11,0x11,0x68,0x11,0x04,0x33,0x36,0x34,0x35,0x1D,0x16}; //读C相电压
这样的命令大概有好几百条,怎么能统一管理昵?我们就可以声明一个指针数组:
unsigned char *DL645Cmd[] ={DL645Cmd_ReadCommAddr,DL645Cmd_ReadVoltageA,DL645Cmd_ReadVoltageB,DL645Cmd_ReadVoltageC};
这样,每一条命令作为指针数组DL645Cmd的一个元素,不仅方便了后续的扩展和调整,由于不同指令长度不同,使用指针数组还避免了使用二维数组时的大量数据空间浪费。
数组指针
数组指针是指一个指向数组的指针,其重点在于它是一个指针,只不过是指向了一个数组,和执行变量的指针相比,通过对数组指针的移动,可以遍历整个数据,而执行变量的指针往往没有这个需求;
数组指针的定义如下:
int (*pData)[10]; 其中,由于[]的优先级高于*,所以必须添加(*p).
说明:括号中的*表明 pData 是一个指针,在32位系统下,任何类型的指针所占内存大小都为4个字节,它指向的数组有10个元素,声明完成后,指针指向该数组的首地址.在本文的第一节中,
int *pBuf = Buff;
pBuf即为数组指针。