在 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语言中唯一一次发生这种类型的转换吗?我怎么知道这些演员何时会发生?