今回はc言語で結構めんどくさい部類に入る「アドレス」という考え方を解説していきます。
記号であらわすと「&」です。
これはscanf();でいつも使いますよね。
これにはきちんとわけがあるのです。
基本的なアドレスの考え方
#include<stdio.h>
int main(void)
{
int a=3;
printf("%d\n",a);
printf("%p\n",&a);
return 0;
}
ここでは2つのpurint関数を使用していますが、上のほうはいつものような単純なものです。
しかし2つ目の
printf("%p\n",&a);
というのは、「aのアドレス値」を出力しています。
アドレスを出力するときは「%p」を使います。
アドレスの値はそのパソコンによって違う
アドレスは必ずしもこの値になるということはありません。
その値が格納されている場所なので、パソコンによっては変化する場合があります。
ではもう一つコードを書いてみましょう。
#include<stdio.h>
int main(void)
{
int a=3;
int b=5;
&a=&b;
printf("aの値は%d\n",a);
printf("aのアドレスは%p\n",&a);
printf("bの値は%d\n",b);
printf("bのアドレスは%p\n",&b);
return 0;
}
このコードは、実行できないと思います。
エラーの内容を見てください。
「左辺値の値が必要」というような内容が書かれていると思います。
このようにアドレス同士代入はできないということです。
では「&a=&b」を消して出力してみましょう。
#include<stdio.h>
int main(void)
{
int a=3;
int b=5;
printf("aの値は%d\n",a);
printf("aのアドレスは%p\n",&a);
printf("bの値は%d\n",b);
printf("bのアドレスは%p\n",&b);
return 0;
}
すると、正常に出力できるはずです。
ここで見てほしいのは、二つのアドレスの値です。
aよりもbのほうが4大きくなっていると思います。
これは、「int型は4バイト」という性質を証明していることに他ありません。
これをdoubleに変えて出力してみましょう。
#include<stdio.h>
int main(void)
{
double a=3;
double b=5;
printf("aの値は%lf\n",a);
printf("aのアドレスは%p\n",&a);
printf("bの値は%lf\n",b);
printf("bのアドレスは%p\n",&b);
return 0;
}
ここではアドレスの値が「8」違っていると思います。
まとめ
確かに、普段のプログラミングでは、アドレスを意識することはありませんがもう少しで出てくる「ポインタ」という概念を理解するときに役立ちます。
ポインタはほんとに理解に苦しむ内容です。
アドレスやポインタの使い方は主に「関数の引数」でよく使います。
引数をより幅広くつかうことができるようになります。