良好形式:指针与局部变量与阵列索引

use*_*485 5 c

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

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

char cmd_i2c_read(unsigned char *cmd, unsigned short cmd_len) { ... }
Run Code Online (Sandbox Code Playgroud)

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

这是更好的形式:

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

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

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

Joh*_*ler 4

选项1很清楚,但有点罗嗦。我一点也不喜欢2,而且3也很难理解。就我个人而言,我更喜欢使用结构来完成这类事情。

\n\n
typedef struct  {\n   unsigned char whatever[2];\n   unsigned char device_address;\n   unsigned char register_address;\n   unsigned char num_bytes;\n   }  CMD;\n\nCMD * pcmd = (CMD *)&cmd[0];\n\n// use the local variables:\nif(num_bytes \xe2\x89\xa4 0xFF) {\n    do_stuff(pcmd->device_address, pcmd->register_address, pcmd->num_bytes);\n
Run Code Online (Sandbox Code Playgroud)\n