2011-12-08 6 views
2

私が持っている例:iのアドレスはのconst int型へのポインタに変換される場合にはこの場合資格の変換はどのように行われますか?

int i = 1; 
const int *b = &i; 

を、私は理解していないこと 、です。修飾変換でiがconst整数に変換されませんか?資格の変換が適用されるとき、フードの下で正確に何が起こるのですか?

答えて

6

フードの下で何も起こりません。 constは厳密にコンパイル時エンティティです。コンパイラは、文がエラーであり、コードを生成しないかどうかを決定するために、constという知識のみを使用します。従って、以下:

int i = 1; 
const int *b = &i; 

は、生成されたコードの用語で

int i = 1; 
int *b = &i; 

と等価です。しかし、あなたは次の操作を実行した場合:

int i = 1; 
const int *b = &i; 
*b = 1; 

をコンパイラがbは(それがiの何も知らない間に)constを持っており、アウトエラーになります気づくでしょう。しかし、追加されたconstでエラーとみなされないステートメントは、constの有無にかかわらず同じコードを生成します。私の

+0

+1役立ちます。この回答はどの参考文献か本から来ますか? – user1086635

+0

@ user1086635:これについてのリファレンスはありませんが、標準のどこかで見つけることができます。 – Dani

1

アドレスが

int型のconstへのポインタに変換されます。 &iはまだintconst intではない)のアドレスです。フードの下でint*は暗黙的にconst int*に変換されます。したがって、*bは変更できませんが、iは依然として変更可能です。あなたの仮定が真であるならば、コンパイルエラーになります以下ですが、それはできません:

はまた、別の方法で考える

int i = 1; 
const int *b = &i; 
int *c = &i; // perfectly valid ! 
関連する問題