アドレスとポインタ
C言語はメモリ空間を直接感じれる言語です。Javaとかスクリプト系の言語では余り感じられないと思います。あえて隠していますが。
メモリ空間を直接扱うのはとっても早いのですが、ひとつ間違うだけでエラー発生プログラム終了!高確率でフリーズ。下手するとOSクラッシュなんてことも有りますので心してかかりましょう。
アドレスとはメモリ空間の番地でまさしくメモリの住所の事を指します。プログラムがメモリ上で関数も変数も静的な値も全てメモリに書かれていて、書かれている場所には全てアドレスが付いています。アドレスは実行する度に変わりますので固定ではありません。
ポインタとは、名前のとおりアドレスを指す仕組みです。これはアドレスを知る方法とアドレスから値を知る方法があります。
int main(){ int a= 10; printf("値:%d\n",a); printf("アドレス:%x\n",&a); }
■結果
$ gcc main.c $ ./a.out 値:10 アドレス:0x7fff50aab20c
ポインタあれこれ
int型変数のaと、int型ポインタ変数のbを宣言し、bにaのアドレスを
int main(){ int a= 10; // int型のポインタ変数を宣言 int *b; printf("a値:%d\n",a); // 変数のアドレスを見る(&) printf("aアドレス:%p\n",&a); // ポインタ変数bにaのアドレスを設定し共有にする。 b = &a; // ポインタ変数に値を設定(*) *b = 20; printf("b値(アドレス):%p\n",b); printf("b値からポインタで値を見る:%d\n",*b); printf("bアドレス:%p\n",&b); printf("a値:%d\n",a); printf("aアドレス:%p\n",&a); }
■結果
$ gcc main.c $ ./a.out a値:10 aアドレス:0x7fffdc7d7c9c b値(アドレス):0x7fffdc7d7c9c b値からポインタで値を見る:20 bアドレス:0x7fffdc7d7c90 a値:20 aアドレス:0x7fffdc7d7c9c