thisdesuのブログ

C言語はじめました

にほんブログ村 IT技術ブログ C/C++へ

アドレスとポインタ

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