mikan's technical note

仕事&趣味で実験した小技の備忘録です(Linux,windows,DOS等)

MENU

【C言語】ポインタを理解するための第一歩(int型)

C未経験なのにCのプログラム改修をやらされている同僚くん…

そんな彼にポインタの基本をわかってもらうために書いたサンプルです
※このあとchar型のポインタと配列でまた混乱している同僚くん…ガンバ!(^^;;

プログラム

sample.c

#include <stdio.h>

int main(void)
{
	int	iNum;
	int	*piNum;

	// コードの表示(実行結果がわかりやすいように。意味はない)
	printf("\n");
	printf("int	iNum;\n");
	printf("int	*piNum;\n");
	printf("\n");

	// 確認
	printf("---------- 確認 ----------\n");
	printf("&iNum :%p\n", &iNum);
	printf("iNum  :%d\n", iNum);
	printf("&piNum:%p\n", &piNum);
	printf("piNum :%p\n", piNum);
	printf("*piNum:%d\n",*piNum);	// piNumは不定なので危険(コケるかも)
	printf("--------------------------\n");

	// 値を設定
	iNum = 555;

	// アドレスを設定(とりあえず NULL を設定)
	piNum = NULL;

	// コードの表示(実行結果がわかりやすいように。意味はない)
	printf("\n");
	printf("iNum = 555;\n");
	printf("piNum = NULL;\n");
	printf("\n");

	// 確認
	printf("---------- 確認 ----------\n");
	printf("&iNum :%p\n", &iNum);
	printf("iNum  :%d\n", iNum);
	printf("&piNum:%p\n", &piNum);
	printf("piNum :%p\n", piNum);
//	printf("*piNum:%d\n",*piNum);	// piNumはNULLなのでコケる
	printf("--------------------------\n");

	// アドレスを設定
	piNum = &iNum;

	// コードの表示(実行結果がわかりやすいように。意味はない)
	printf("\n");
	printf("piNum = &iNum;\n");
	printf("\n");

	// 確認
	printf("---------- 確認 ----------\n");
	printf("&piNum:%p\n", &piNum);
	printf("piNum :%p\n", piNum);
	printf("*piNum:%d\n",*piNum);
	printf("--------------------------\n");

	// 値を設定
	*piNum = 777;

	// コードの表示(実行結果がわかりやすいように。意味はない)
	printf("\n");
	printf("*piNum = 777;\n");
	printf("\n");

	// 確認
	printf("---------- 確認 ----------\n");
	printf("&piNum:%p\n", &piNum);
	printf("piNum :%p\n", piNum);
	printf("*piNum:%d\n",*piNum);
	printf("iNum  :%d\n",iNum);	// ここが重要
	printf("--------------------------\n");

	return 0;
}

実行結果

int	iNum;
int	*piNum;

---------- 確認 ----------
&iNum :0x7ffcc0cafd9c
iNum  :21958
&piNum:0x7ffcc0cafda0
piNum :0x7ffcc0cafe90
*piNum:1
--------------------------

iNum = 555;
piNum = NULL;

---------- 確認 ----------
&iNum :0x7ffcc0cafd9c
iNum  :555
&piNum:0x7ffcc0cafda0
piNum :(nil)
--------------------------

piNum = &iNum;

---------- 確認 ----------
&piNum:0x7ffcc0cafda0
piNum :0x7ffcc0cafd9c
*piNum:555
--------------------------

*piNum = 777;

---------- 確認 ----------
&piNum:0x7ffcc0cafda0
piNum :0x7ffcc0cafd9c
*piNum:777
iNum  :777
--------------------------

ポイント

piNum = &iNum;
piNum = 777;

を実行すると、
iNum の値も 777 になる
仕組みを理解しましょう

piNum は iNum のアドレス(メモリ上の番地)を指している
ので、*pinum は iNum と同じなのです

次回は、char型のポインタについて