{
int *p=12;
printf("%p",p);
printf("\n%d",p);
}
出力:
0000000C
12
質問: p にはアドレス 0x0000000C が割り当てられていますか?
{
int *p=12;
*p=22;
}
しかし、これは実行されません。では、実際に何が起こっているのでしょうか。
int *p=12;
これはポインタを宣言し、それが指すアドレスを設定します12
。
*p=22;
これにより、ポインタが逆参照さint
れ、そのメモリ アドレスに22 が書き込まれます12
。メモリを割り当てず、ポインターをランダムなアドレスを指すように設定しただけなので、実行時エラーが発生します。
あなたを混乱させているのは、両方のコードに が含まれていること*p=...
です。ただし、最初の代入はポインタに対するもので、2 番目の代入はポインティに対するものです。これは、C でプログラミングするときに慣れなければならない表記上のオーバーロードの 1 つにすぎません。
どちらの場合も未定義の動作をします。
無効なポインタを使用しているため、最初の例の動作は未定義です。
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)