如何在c中的无符号字符中移动字节

Posted

技术标签:

【中文标题】如何在c中的无符号字符中移动字节【英文标题】:how to move in bytes in an unsigned char in c 【发布时间】:2014-04-24 15:58:05 【问题描述】:

假设我有一个 unsigned char 声明如下:

unsigned char Data[DATA_BLOCK_SIZE] = 0;

表达Data+1是什么意思?

【问题讨论】:

这意味着Data 现在指向数组中的第二个元素。 Data 被分配了数组中第一个元素的地址,所以Data+1 是该地址 + 1(也就是行中下一个元素的地址) 【参考方案1】:

Data 指向Data[0]Data + 1 将指向Data[1]

【讨论】:

数组是不是指针...不要混淆两者,因为它会回来咬你! @EliasVanOotegem 我删除了单词指针。但是Data 不是指向Data[0] 的指针吗?我不是说数组和指针是一样的。但是数组的内部名称充当指针? 不,数组可以用作指针,但内部有很大区别。例如:sizeof(Data) 将产生数组长度。指针在 32 位上的大小始终为 4,在 64 位上的大小为 8……指针是不同的类型:数组“知道” 其大小和类型,而指针不知道。不能,也不应该。 我添加了一个页面链接,该页面非常清楚地解释了数组和指针之间的区别。如果您还没有阅读,请阅读【参考方案2】:

您没有unsigned char,而是unsigned char []。这意味着您有一个unsigned char 数组。当你对Data 进行算术运算时,你会在这个数组中移动。

当你做 Data + 1 时,就像是在做以下事情之一

&Data[1]
(&Data[0]) + 1

称为指针运算Data 不是一个指针(你不能给它分配地址)但是当你创建 Data + 1 时,一个隐式转换完成并且Data 等于它的第一个块地址(&Data[0])。

【讨论】:

【参考方案3】:

Data+1 表示数组Data 中第二个元素的地址;如果要访问第二个元素本身,可以使用Data[1]*(Data+1),它们在C 中是相同的。

【讨论】:

【参考方案4】:

数组和指针不是相同的东西,但它们的行为方式相似,就像这里一样。 Data 保存数组中第一个元素的内存地址。就像一个指针保存着某物的内存地址。 该地址加1,就得到数组中第二项的地址(即Data[1],只有Data[1]指的是实际Data+1解析为内存地址)

您经常看到这种语法,主要是在循环中,因为它不需要使用像 int isize_t len 之类的临时变量。

在你的情况下,一个消除所有疑问的插图:

Data = 0x01 //value of Data
//layout in memory
 0x01 0x02 0x03 0x04 0x05 
| \0 | \0 | \0 | \0 | \0 |

现在如果你写:Data[0],它与用指针写*(data+0) 相同:它取消引用它,从而获取存储在内存中的值 写Data+1,则相当于指针加1:

Data+1 == 0x02 != Data[1]
//because:
Data[1] == *(Data+1);

因此,在一个循环中,计算诸如“flabbergast”之类的字符串中的'a' 的数量,可以这样写:

char word[] = "flabbergast";
int a_count = 0;
do

    if (*word == 'a') ++a_count;
    ++word;
 while (*word != '\0');

有效地将word 用作数组。

请注意,数组和指针不是一回事Read this for details

【讨论】:

以上是关于如何在c中的无符号字符中移动字节的主要内容,如果未能解决你的问题,请参考以下文章

C中的无符号整数在java中的处理

如何从 Java 中的无符号字节中获取浮点数?

C中的无符号字符连接

C - 结构中的无符号字符

如何在c中读取由空格分隔的无符号字符

如何创建一个紧密打包的无符号字节统一缓冲区?