嵌入式C语言的灵魂--指针--一网打尽

网上讲指针的文章很多,这里全面的总结一下,特别是在提高代码效率方面,很多人都没有提及。

嵌入式C语言的灵魂--指针--一网打尽

1.参数传送与返回

C语言的参数传送是拷贝传送,即把变量的值拷贝到函数的临时变量实现。这就是为什么当我们需要改变原变量值的时候,需要传入原变量的指针。其实这个指针参数也是拷贝,只不过拷贝后的临时指针与原始指针指的是同一个变量位置,所以才能改变原变量的值。

正因为参数传送是拷贝方式,所以当参数结构比较大的时候,就需要消耗比较多的拷贝运算,此时,采用指针方式就可以大幅减小这个过程。

process(dataType_t * pdata)
{
int a = pdata->var;
pdata->var = 1;
}

当不要禁止改变原结构内容时,加const

process(const dataType_t * pdata)
{
int a = pdata->var;
pdata->var = 1;//无效
}

通用指针 有些时候,我们要定义一个指针,能够接受任意的数据类型,可以用void,在通信里面经常用到。

sdData(void* pdata, int len)
{
uint8_t pd=(uint8_t*)pdata;
//发送字节数据
}

2.提高代码效率

指针的这个功能会被很多人忽视,因为如果不进行代码反汇编操作,单从C语言代码执行和调试中是察觉不出来的。只有通过通过查看反汇编代码,才能真真切切的发现其巨大差异。这种差异在大代码里面非常明显(超过64K的调用),小代码里不明显。

(1)在工程中,我们经常要定义一些全局变量。在C语言里使用全局变量的时候,和普遍的当地变量局部变量没有任何差别,但是其实际的编译代码,却会相差很多。简单的说,大代码里,全局变量可能与其调用的位置相差很远(超过64K),CPU需要更长的指令来实现。这一点在8位单片机里面最为明显,像STM8,针对不同的FLASH容量提供了不同的库函数,而且对全局变量和局部变量专门进行位置设置,都是为了优化代码提高效率。

(2)对远程数据结构的访问,采用指针方式可以提高效率,特别是在运算量大的时候就更加明显。

//远程全局变量
extern dataType_t data;
process(void)
{
data.a =3;
data.b =4;
}

采用指针效率更高
process(void)
{
dataType_t * pdata = &data;
pdata->a =3;
pdata->b =4;
}


分享到:


相關文章: