在 C 中,除了不需要地址运算符的数组之外,还有其他时间吗?例如,我知道这段代码需要操作符的地址:
typedef struct foo_t {
int bar;
} foo_t;
void foo_init(foo_t *f) { f->bar = 123; }
... {
foo_t f;
foo_init(&f);
}
但是这段代码不需要地址操作符:
... {
char buffer[1024];
memset(buffer, 0, 1024);
}
这里memset声明为:
void *memset(void *ptr, int value, size_t num);
在 C 中,它会自动将其char[]转换为void*- 但尝试对这样的做同样的foo_t事情:
foo_t f;
memset(f, 0, sizeof(foo_t));
不起作用,并且会产生预期的编译时类型错误。与char[]示例一样,如果我们使用数组,它将起作用:
foo_t list[16];
memset(foo, 0, sizeof(list));
它会再次自动foo_t[]将void*
这是C语言中唯一一次发生这种类型的转换吗?我怎么知道这些演员何时会发生?