如何在c中的unsigned char中以字节为单位移动

时间:2014-04-24 15:58:05

标签: c byte unsigned-char

让我们说我有一个unsigned char声明如下:

unsigned char Data[DATA_BLOCK_SIZE] = {0};

表达式Data+1是什么意思?

4 个答案:

答案 0 :(得分:2)

您没有unsigned char,而是unsigned char []。这意味着你有一个unsigned char数组。当您在Data上进行算术运算时,您将移入此数组。

当您执行Data + 1时,它就像执行以下某项操作

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

它被称为指针算术Data不是指针(您无法为其指定地址),但是当您创建Data + 1时,会执行隐式转换,Data等于其第一个块地址(&Data[0] })。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

数组和指针不是相同的东西,但它们的行为方式类似,就像这里一样。 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