0

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 で発生するのはこれだけですか? これらのキャストがいつ行われるかをどのように知ることができますか?

4

3 に答える 3

2

私が知っている暗黙的なアドレス取得の唯一の「その他」(コメントを参照)のケースは、関数ポインタ[ 12 ]の場合です。与えられた関数

int
f(void);

次の 2 行は同じ意味です。

int (*fptr1)(void) = f;
int (*fptr2)(void) = &f;

makefptr1とそれぞれfptr2への関数ポインターの両方f

于 2015-01-19T02:03:17.553 に答える
1

文字列リテラルはアドレスによってポインターに割り当てられ、初期化の右側として使用される場合は「値」によって割り当てられます。

const char *str_ptr = "foo";  /* str_ptr points to a string "foo",
                                 in read-only memory. */

char chr_ar[] = "barbar";     /* chr_ar is 7 bytes, and is initialized
                                 with the bytes "barbar" */
于 2015-01-19T02:08:29.867 に答える