身につく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」違っていると思います。

 

まとめ

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

 

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

 

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

 

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