c - 良好形式 : Pointer vs. 局部变量与数组索引

标签 c

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

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

char cmd_i2c_read(unsigned char *cmd, unsigned short cmd_len) { ... }

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

更好的形式是:

  1. 创建表明每个字节用途的局部变量:

    unsigned char device_address = cmd[2];
    unsigned char register_address = cmd[3];
    unsigned char num_bytes = cmd[4];<br/>
    // use the local variables:
    if(num_bytes &le 0xFF) {
        do_stuff(device_address, register_address, num_bytes);
    }
  2. 创建本地指针:

    unsigned char *device_address = &cmd[2];
    unsigned char *register_address = &cmd[3];
    unsigned char *num_bytes = &cmd[4];<br/>
    // use the pointers:
    if(*num_bytes &le 0xFF) {
        do_stuff(*device_address, *register_address, *num_bytes);
    }
  3. 直接索引*cmd数组:
    if(cmd[4] <= 0xFF) { do_stuff(cmd[2], cmd[3], cmd[4]); }

最佳答案

选项 1 很清楚,但有点冗长。我一点都不喜欢2,3很难理解。就我个人而言,我更喜欢将结构用于此类事情。

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);

关于c - 良好形式 : Pointer vs. 局部变量与数组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2321590/

相关文章:

c - random() 函数只会吐出大数字

c - 管道和 select() 有问题

c - 如何在不使用 for 循环的情况下获取 char * 变量的大小?

c - 在 visual studio 2005 中强制执行 C 风格注释

c - 这两段代码的工作

c - (uint16_t*) 和 (uint32_t*) 有什么区别?

c - 使用 Pthreads 进行并行编程

c - 使用 fgetc(stdin) 设置变量

将数组转换为字符串 Nesc

c - 在 PKCS#12 结构中管理多个 RSA key /证书