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
- ポインタのアドレス一つに対して、int型一つ分のアドレスが格納されている。
サンプルコード
#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
続行するには何かキーを押してください . . .