我正在研究用C编程语言编写的项目。我有一个代码片段如下
unsigned char value[10];
#define arr() (&value[0])
为什么他们为unsigned char数组定义了一个“函数”(arr()
)种#define
'd变量?
他们正在尝试使用arr()[1],arr()[2]
等变量,
arr() + 2
是否等于value + 2
。我尝试执行一个小程序,但这两个结果给了我不同的答案。这怎么可能。因为他们将第一个数组的地址分配给arr()
。这两者应该不一样吗?有人能解释一下如上定义变量的重要性吗?
答案 0 :(得分:1)
我无法告诉你为什么他们已经完成了,但是,arr() + 2
和value + 2
是相同的。
答案 1 :(得分:1)
此行#define arr() (&value[0])
表示只要预处理器(在编译器之前运行)遇到arr()
,它就会用(&value[0])
替换它在文件中。
所以arr()[1]
表示(&value[0])[1]
。 value[0]
是存储在第一个值索引处的内容,&
再次获取它的地址...这与值相同。所以它应该只是value[1]
,除非我遗漏了什么。
答案 2 :(得分:1)
arr()[i]
==> (&value[0])[i]
==> value[i]
另外
arr() + i
==> (&value[0]) + i
==> value + i
所以
arr() + 2
==> (&value[0]) + 2
==> value + 2
我只能猜测程序员用这种方式编写,使编码与像this example
这样的区域代码的其他部分一致答案 3 :(得分:1)
arr()+ 2等于值+ 2.我尝试执行一个小程序, 但这两个结果给了我不同的答案。这怎么可能。 因为他们将第一个数组的地址分配给arr()。应该 这两个不一样吗?
是的,他们是一样的。
试试这个程序
#include <stdio.h>
#define arr() (&value[0])
int main(void)
{
unsigned char value[11] = "0123456789";
printf("arr()[2] = %c\n", arr()[2] );
printf("arr()+ 2 = %c\n",*(arr() + 2) );
printf("value+ 2 = %c\n",*(value + 2) );
return 0;
}