8-1 アドレス

この記事は約4分で読めます。

変数のアドレス

C言語では、すべての変数はメモリ上に保存されます。sizeof(int)が4バイトの環境では、int型の変数はメモリ上の領域を4バイト使用しています。変数のメモリ上の位置をアドレスといいます。環境にもよりますが、1バイトずつアドレスが割り当てられています。アドレス演算子&を用いると、その変数のアドレスを取得できます。配列の要素のアドレスも取得できます。

&(変数名)

アドレスをprintf関数で画面に表示するには、フォーマット指定子%pを使用します。

#include <stdio.h>
int main(void){
	int a,b,i;
	int ary[5];
	char str[5];
	printf("sizeof int=%d\n",sizeof(int));
	printf("sizeof char=%d\n",sizeof(char));
	printf("&a=%p\n&b=%p\n",&a,&b);
	for (i=0;i<5;i++){
		printf("&ary[%d]=%p\n",i,&ary[i]);
	}
	for (i=0;i<5;i++){
		printf("&str[%d]=%p\n",i,&str[i]);
	}
	return 0;
}

実行結果

sizeof int=4
sizeof char=1
&a=0019FF38
&b=0019FF34
&ary[0]=0019FF18
&ary[1]=0019FF1C
&ary[2]=0019FF20
&ary[3]=0019FF24
&ary[4]=0019FF28
&str[0]=0019FF2C
&str[1]=0019FF2D
&str[2]=0019FF2E
&str[3]=0019FF2F
&str[4]=0019FF30
(実行結果は環境により異なります)

筆者の環境では、アドレスが16進数で表示されました。数値が8桁の16進数で表示差されていることから、筆者の環境では32ビットの数値でアドレスが管理されていることがわかります。int型配列aryの要素のアドレスをよく見ると、アドレスは4ずつ増えています。sizeof intが4バイトなので、アドレスも4ずつ増えるということです。同じように、charは1バイトなので、char型配列strの要素のアドレスは1ずつ増えています。

ポインタ変数

アドレスを値として格納する変数をポインタといい、変数のアドレスの型はその変数へのポインタ型といいます。ポインタ型の変数を定義するには

型名 *変数名;

とします。型名に*をつけるとポインタ型になります。例えば、intへのポインタ型の変数pnを定義するときは

int* pn;

と書きます。ポインタ型の変数にはアドレスを代入することが可能です。ポインタにある変数のアドレスが格納されているとき、ポインタはその変数を指すといいます。

#include <stdio.h>
int main(void){
	int a,b;
	int *pn;
	printf("&a=%p\n",&a);
	pn=&a;
	printf("pn=%p\n",pn);
	printf("&b=%p\n",&b);
	pn=&b;
	printf("pn=%p\n",pn);
	return 0;
}

実行結果

&a=0019FF38
pn=0019FF38
&b=0019FF34
pn=0019FF34

&a,&b,pnはともにintへのポインタ型であり、int*型です。&a,&bは定数であるのに対してpnは変数なので、値を代入することができます。pn=&aとするとポインタpnは変数aを指し、pn=&bとするとpnはbを指すようになります。

ヌルポインタ

何も指していないポインタをヌルポインタといい、プログラム中ではNULLと表します。大文字であることからわかるように、NULLはマクロとして定義されています。

#include <stdio.h>
int main(void){
	printf("NULL=%p\n",NULL);
	return 0;
}

実行結果

NULL=00000000

ほとんどの環境ではNULLは値として0になります。メモリのアドレスは通常1から始まるので0は何も指さないという意味に使用されます。

一口にヌルというと、’\0’とNULLがあります。’\0’は0という値(ヌル文字)ですが、NULLは0というポインタ(ヌルポインタ)として実装されていることに注意してください。(C++では’\0’とNULLは同一です)

まとめ

&演算子を用いると、その変数のメモリ上のアドレスを取得できる。

アドレスを値として格納する変数をポインタという。

コメント