首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >很好的形式:指针对局部变量和数组索引

很好的形式:指针对局部变量和数组索引
EN

Stack Overflow用户
提问于 2010-02-23 20:48:24
回答 7查看 496关注 0票数 5

请原谅,如果这是一个微不足道的问题-我通常是一个控制系统的人(plc和自动化),但我发现自己最近参与了一些嵌入式微控制器和个人电脑项目。

假设我有一个函数,它接受指向“命令字节”数组的指针,通常长度为5或10个字节,如下所示:

代码语言:javascript
复制
char cmd_i2c_read(unsigned char *cmd, unsigned short cmd_len) { ... }

我想解码命令字节(*cmd)。

更好的形式是:

  1. 创建局部变量,指示每个字节的用途:

无符号字符device_address = cmd2;无符号char register_address = cmd3;无符号char num_bytes = cmd4;//使用局部变量: if(num_bytes &le 0xFF) { do_stuff(device_address,register_address,num_bytes);}

  • 创建本地指针:

无符号字符*device_address =&cmd 2;无符号char *register_address =&cmd 3;无符号char *num_bytes =&cmd 4;//使用指针: if(*num_bytes &le 0xFF) { do_stuff(*device_address,*register_address,*num_bytes);}

  • 直接索引*cmd数组:

if(cmd[4] <= 0xFF) { do_stuff(cmd[2], cmd[3], cmd[4]); }

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-02-23 20:57:37

备选方案1是明确的,但有点冗长。我一点也不喜欢2,3很难理解。就我个人而言,我更喜欢在这类事情上使用结构。

代码语言:javascript
复制
typedef struct  {
   unsigned char whatever[2];
   unsigned char device_address;
   unsigned char register_address;
   unsigned char num_bytes;
   }  CMD;

CMD * pcmd = (CMD *)&cmd[0];

// use the local variables:
if(num_bytes ≤ 0xFF) {
    do_stuff(pcmd->device_address, pcmd->register_address, pcmd->num_bytes);
票数 4
EN

Stack Overflow用户

发布于 2010-02-23 20:50:22

我更喜欢第三项,但可以说是优先考虑。

票数 3
EN

Stack Overflow用户

发布于 2010-02-23 20:51:42

IMHO,第一条路更好。它比数字3容易读,因为您不需要知道函数的签名才能理解参数是什么。

对于较大的数据结构,我将使用数字2,即使用指针,使您不必复制值。但在这种情况下,差别并不显著,我认为*/&稍微降低了可读性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2321590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档