如何在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 i
或 size_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中的无符号字符中移动字节的主要内容,如果未能解决你的问题,请参考以下文章