-2
int main()
{
  const int i = 10;
  int *p = (int*) &i;
  *p = 20; 
  printf("%d\n",i);   // 10
  printf("%d\n",*p);  // 20
}

本当の住所を教えてもらえますか? i の値を変更したい場合、どうすればよいですか? 下手な英語を許して!

4

3 に答える 3

8

本当の住所を教えてもらえますか?

はい:

const int* p = &i;
...
printf("%p\n", p);

i の値を変更したい場合、どうすればよいですか?

しないほうがいいです。これは未定義の動作です。やっぱりconst「変えられない」ってことですよね?何らかの理由で変更したい場合はconst、ピリオドとして宣言しないでください。

一部のプラットフォームでは、const データが別の読み取り専用メモリ セグメントに配置され、そのような場所に書き込もうとすると、segfault が発生します。また、多くのコンパイラは const 変数への参照をリテラル値に置き換えます。あなたの場合のように、これらのアドレスを取得しようとすると、代わりに元の値のコピーで一時変数が作成される場合があります。したがって、元の値ではなく、一時的な値のみを変更できます。

于 2012-06-04T08:24:40.173 に答える
4

で行ったのとまったく同じように、「実際の」アドレスを取得します&i

修飾されiたオブジェクトであるため、一度初期化するとその値を変更することはできません。const

その式の結果を変更可能なポインタにキャストするのは悪い考えです。オブジェクトのその値を変更しようとするため、未定義の動作を引き起こすint書き込みが可能になるためです。*p = 20;const

于 2012-06-04T08:25:29.387 に答える
1

使用する

printf("%p\n",p);

%pポインター値をフォーマットするためのものです。

iの値は変更できず、さまざまなバグが発生する可能性があります (または何もしません)。

于 2012-06-04T08:25:01.243 に答える