嵌入式C语言编程中经验教训总结(七)指针、指针数组和数组指针

本文总结嵌入式C语言编程中指针、指针数组和数组指针的经验。介绍了数组指针是数组在内存的起始地址,指针数组元素均为指针,可避免二维数组的数据空间浪费,还说明了数组指针能遍历整个数组,与指向变量的指针有区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

嵌入式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即为数组指针。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyjbj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值