NekoC

猫でもわかるC言語の個人的なまとめ資料

View on GitHub

08_配列・文字列とポインタ

配列とアドレス

サンプルコード


#include <stdio.h>
#include <stdlib.h>

int main(){
	int arrayInt[4] = { 0, 1, 2, 3 };
	int count;

	for (count = 0; count < 4; count++){
		printf("arrayInt[%d] = %p\n", count, &arrayInt[count]);
	}

	printf("arrayInt = %p\n", &arrayInt);
	if ((int*)&arrayInt == &arrayInt[0]){
		printf("arrayInt = arrayInt[0]\n");
	}
	else{
		printf("arrayInt ≠ arrayInt[0]\n");
	}

	system("pause");
	return 0;
}

出力結果


arrayInt[0] = 008FFA38
arrayInt[1] = 008FFA3C
arrayInt[2] = 008FFA40
arrayInt[3] = 008FFA44
arrayInt = 008FFA38
arrayInt = arrayInt[0]
続行するには何かキーを押してください . . .

配列とアドレス2

サンプルコード

#include <stdio.h>
#include <stdlib.h>

int main(){

	int array[] = { 10, 20, 30, 40, 50 }, count, *p;

	p = array;
	for (count = 0; count < 5; count++){
		printf("array[%d] = %d\t&array[%d] = %p\tp + %d = %p\n",count,array[count],count,&array[count],count,p + count );
	}
	system("pause");
	return 0;
}

出力結果

array[0] = 10   &array[0] = 00EFF928    p + 0 = 00EFF928
array[1] = 20   &array[1] = 00EFF92C    p + 1 = 00EFF92C
array[2] = 30   &array[2] = 00EFF930    p + 2 = 00EFF930
array[3] = 40   &array[3] = 00EFF934    p + 3 = 00EFF934
array[4] = 50   &array[4] = 00EFF938    p + 4 = 00EFF938
続行するには何かキーを押してください . . .

多次元配列


#include <stdio.h>
#include <stdlib.h>

int main(){
	int array[3][2] = {10,20,30,40,50,60};
	int outer, inner;

	/************
	格納のされ方
	[10]	[20]
	[30]	[40]
	[50]	[60]
	************/

	printf("\n各要素の値\n");
	for (outer = 0; outer < 3; outer++){
		for (inner = 0; inner < 2; inner++){
			printf("\tarray[%d][%d] = %d",
				outer,inner,array[outer][inner]);
		}
	printf("\n");
	}

	printf("\n各要素のアドレスを確かめる\n");
	for (outer = 0; outer < 3; outer++){
		for (inner = 0; inner < 2; inner++){
			printf("\t&array[%d][%d] = %p\t(array[%d] + %d) = %p\t"
				, outer, inner, &array[outer][inner], outer, inner, (array[outer] + inner));
		}
	printf("\n");
	}

	printf("\narray[m][n]を *(*(a + m) + n)と書けるのか確かめる。\n");
	for (outer = 0; outer < 3; outer++){
		for (inner = 0; inner < 2; inner++){
			printf("\t*(*(array + %d) + %d) = %d\n"
				, outer, inner, *(*(array + outer) + inner));
		}
	}

	system("pause");
	return 0;

}

出力結果


各要素の値
        array[0][0] = 10        array[0][1] = 20
        array[1][0] = 30        array[1][1] = 40
        array[2][0] = 50        array[2][1] = 60

各要素のアドレスを確かめる
        &array[0][0] = 00FDFC14 (array[0] + 0) = 00FDFC14               &array[0][1] = 00FDFC18 (array[0] + 1) = 00FDFC18
        &array[1][0] = 00FDFC1C (array[1] + 0) = 00FDFC1C               &array[1][1] = 00FDFC20 (array[1] + 1) = 00FDFC20
        &array[2][0] = 00FDFC24 (array[2] + 0) = 00FDFC24               &array[2][1] = 00FDFC28 (array[2] + 1) = 00FDFC28

array[m][n]を *(*(a + m) + n)と書けるのか確かめる。
        *(*(array + 0) + 0) = 10
        *(*(array + 0) + 1) = 20
        *(*(array + 1) + 0) = 30
        *(*(array + 1) + 1) = 40
        *(*(array + 2) + 0) = 50
        *(*(array + 2) + 1) = 60
続行するには何かキーを押してください . . .