【发布时间】:2015-01-19 01:45:13
【问题描述】:
在 C 语言中,除了数组之外,还有什么时候不需要地址操作符?比如我知道这段代码需要operator的地址:
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 中发生这种类型转换的情况吗?我怎么知道这些演员何时会发生?
【问题讨论】:
-
唯一的其他隐式“地址获取操作”是函数名到函数指针。
-
@5gon12eder 请将其添加为答案。
-
任何参考文献都很棒。我能找到的 C 规范并不完全是 light 阅读材料。
-
另外,伙计们,我把这个问题放在这里是因为我在 stackoverflow.com 上找不到答案,并认为这个问题会被问到。如果有人能找到一个类似的问题来回答这个问题,那就太好了。
-
@JonathonReinhart 我认为这可能不值得回答,但多亏了你的动力,它现在是一个。
标签: c pointers casting reference upcasting