让我们说我有一个unsigned char声明如下:
unsigned char Data[DATA_BLOCK_SIZE] = {0};
表达式Data+1
是什么意思?
答案 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 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