身につくC言語-15回目 アドレスとは-

今回は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」違っていると思います。

まとめ

確かに、普段のプログラミングでは、アドレスを意識することはありませんがもう少しで出てくる「ポインタ」という概念を理解するときに役立ちます。

ポインタはほんとに理解に苦しむ内容です。

アドレスやポインタの使い方は主に「関数の引数」でよく使います。

引数をより幅広くつかうことができるようになります。

スポンサーリンク