1
{
    int *p=12;
    printf("%p",p);
    printf("\n%d",p);
}

出力:

0000000C

12

質問: p にはアドレス 0x0000000C が割り当てられていますか?

{ 
    int *p=12;
    *p=22;
}    

しかし、これは実行されません。では、実際に何が起こっているのでしょうか。

4

2 に答える 2

4
int *p=12;

これはポインタを宣言し、それが指すアドレスを設定します12

*p=22;

これにより、ポインタが逆参照さintれ、そのメモリ アドレスに22 が書き込まれます12。メモリを割り当てず、ポインターをランダムなアドレスを指すように設定しただけなので、実行時エラーが発生します。

あなたを混乱させているのは、両方のコードに が含まれていること*p=...です。ただし、最初の代入はポインタに対するもので、2 番目の代入はポインティに対するものです。これは、C でプログラミングするときに慣れなければならない表記上のオーバーロードの 1 つにすぎません。

于 2012-05-04T12:49:56.823 に答える
0

どちらの場合も未定義の動作をします。

  • 無効なポインタを使用しているため、最初の例の動作は未定義です。

  • 2 番目の例は、無効なアドレスを持つポインターを逆参照するため、最悪です。

    int *p=12; // set the address 12 to the int pointer called p
    *p=22;     // set the value 22 to the address 12 (invalid address)
    
于 2012-05-04T12:49:35.770 に答える