2

標準への注釈の修正に基づいています。

3.14オブジェクトは、物理メモリアドレスに存在する変数または定数のいずれかです。

  • Cでは、定数は(一部の文字列リテラルを除いて)メモリに存在しないため、オブジェクトではありません。

constには実際のメモリ位置がなく(文字列リテラルを除く)、コンパイラに依存していることは私には理にかなっています。コンパイラは、constへのすべての参照をリテラル値に置き換える可能性があります。そうは言っても、次のことはどのように可能ですか?

const int * foo;

これは、へのポインタを宣言しますconst int。ただし、定数にはアドレスがないので、これは実際にはどういう意味ですか?コンパイル時にのみ存在するリテラル値へのポインターを持つことはできません。

4

2 に答える 2

4

const変数は定数ではありません。定数は、リテラル値、またはのようなリテラル値で構成される式です3+5/2.4。このような定数は実際にはメモリに存在しません。コンパイラはリテラルを適切な場所に挿入します。

于 2012-05-08T17:43:51.590 に答える
3

あなたの例では、は定数fooではなく、const修飾オブジェクトです:

6.7.3型修飾子

構文

1type      -qualifier: ... 3修飾型に関連付けられたプロパティは、左辺値である式に対してのみ意味があります。114) ... 114)実装は、ストレージの読み取り専用領域にないオブジェクトを配置する場合があります。さらに、そのアドレスが使用されない場合、実装はそのようなオブジェクトにストレージを割り当てる必要はありません。
        const
        restrict
        volatile




constvolatile
于 2012-05-08T17:56:46.093 に答える