int main()
{
const int i = 10;
int *p = (int*) &i;
*p = 20;
printf("%d\n",i); // 10
printf("%d\n",*p); // 20
}
本当の住所を教えてもらえますか? i の値を変更したい場合、どうすればよいですか? 下手な英語を許して!
本当の住所を教えてもらえますか?
はい:
const int* p = &i;
...
printf("%p\n", p);
i の値を変更したい場合、どうすればよいですか?
しないほうがいいです。これは未定義の動作です。やっぱりconst
「変えられない」ってことですよね?何らかの理由で変更したい場合はconst
、ピリオドとして宣言しないでください。
一部のプラットフォームでは、const データが別の読み取り専用メモリ セグメントに配置され、そのような場所に書き込もうとすると、segfault が発生します。また、多くのコンパイラは const 変数への参照をリテラル値に置き換えます。あなたの場合のように、これらのアドレスを取得しようとすると、代わりに元の値のコピーで一時変数が作成される場合があります。したがって、元の値ではなく、一時的な値のみを変更できます。
で行ったのとまったく同じように、「実際の」アドレスを取得します&i
。
修飾されi
たオブジェクトであるため、一度初期化するとその値を変更することはできません。const
その式の結果を変更可能なポインタにキャストするのは悪い考えです。オブジェクトのその値を変更しようとするため、未定義の動作を引き起こすint
書き込みが可能になるためです。*p = 20;
const
使用する
printf("%p\n",p);
%p
ポインター値をフォーマットするためのものです。
i
の値は変更できず、さまざまなバグが発生する可能性があります (または何もしません)。