Cでは、アドレス演算子が必要ない配列以外の場合はありますか? たとえば、次のコードには演算子のアドレスが必要です。
typedef struct foo_t {
int bar;
} foo_t;
void foo_init(foo_t *f) { f->bar = 123; }
... {
foo_t f;
foo_init(&f);
}
しかし、このコードには address-of 演算子は必要ありません。
... {
char buffer[1024];
memset(buffer, 0, 1024);
}
ここでmemset
は次のように宣言されています。
void *memset(void *ptr, int value, size_t num);
そしてCでは、それchar[]
をaに自動キャスト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 で発生するのはこれだけですか? これらのキャストがいつ行われるかをどのように知ることができますか?