配列とポインタ
ポインタ変数を使うことで、配列のそれぞれの値にアクセスできる。
#include <stdio.h> #define SIZE 9 int main(void) { int array1[SIZE]; char array2[SIZE]; int i; int *p1 = NULL; char *p2 = NULL; for (i=0; i<SIZE; i++) { array1[i] = i; array2[i] = (char)((int)'A' + i); } p1 = &array1[0]; p2 = &array2[0]; // ポインタ変数に1を足すと、その型のサイズひとつ分だけアドレスが移動する。 // つまり、配列の添字と一致する。 for (i=0; i<SIZE; i++) { printf("array1[%d]=%d *(p1+%d)=%d ", i, array1[i], i, *(p1+i)); printf("array2[%d]=%c *(p2+%d)=%c\n", i, array2[i], i, *(p2+i)); } // array1[0]=0 *(p1+0)=0 array2[0]=A *(p2+0)=A // array1[1]=1 *(p1+1)=1 array2[1]=B *(p2+1)=B // array1[2]=2 *(p1+2)=2 array2[2]=C *(p2+2)=C // array1[3]=3 *(p1+3)=3 array2[3]=D *(p2+3)=D // array1[4]=4 *(p1+4)=4 array2[4]=E *(p2+4)=E return 0; }
添字の無い配列は、その配列の先頭のアドレスである。
よって、int array[5]
という配列があれば、array
でその配列のアドレスになるので、*array
で array[0]
、*(array+1)
で array[1]
とそれぞれ同じ意味になる。
#include <stdio.h> #define SIZE 5 int main(void) { double array_d[SIZE] = {0.1, 0.2, 0.3, 0.4, 0.5}; double *p1 = NULL; double *p2 = NULL; int i; // 配列名は、実は、配列の先頭のアドレスである。 // つまり、&array_d[0] と array_d は同じ。 p1 = array_d; p2 = array_d; for (i=0; i<SIZE; i++) { printf("%lf %lf %lf\n", *(array_d + i), p1[i], *p2); p2++; } // *(array_d + i), p1[i], *p2 は同じアドレスを参照する。 // 0.100000 0.100000 0.100000 // 0.200000 0.200000 0.200000 // 0.300000 0.300000 0.300000 // 0.400000 0.400000 0.400000 // 0.500000 0.500000 0.500000 return 0; }
配列の動的生成
malloc
指定したバイト分だけ、ヒープ領域にメモリを確保する。
p1 = (int *)malloc(sizeof(int)*SIZE);
のように、目的の型でキャストする。
ヒープ領域にメモリが確保されているので、使用後は、free
でメモリを開放しなければならない。
#include <stdio.h> #include <stdlib.h> #define SIZE 5 int main(void) { int *p1 = NULL; double *p2 = NULL; int i; // メモリを確保して、配列を生成 p1 = (int *)malloc(sizeof(int)*SIZE); p2 = (double *)malloc(sizeof(double)*SIZE); for (i=0; i<SIZE; i++) { p1[i] = i; p2[i] = (double)i; } for (i=0; i<SIZE; i++) { printf("p1[%d]=%d p2[%d]=%lf\n", i, p1[i], i, p2[i]); } // p1[0]=0 p2[0]=0.000000 // p1[1]=1 p2[1]=1.000000 // p1[2]=2 p2[2]=2.000000 // p1[3]=3 p2[3]=3.000000 // p1[4]=4 p2[4]=4.000000 // メモリ開放 free(p1); free(p2); for (i=0; i<SIZE; i++) { printf("p1[%d]=%d p2[%d]=%lf\n", i, p1[i], i, p2[i]); } // メモリを開放したので、意味のわからない値になる。 // p1[0]=0 p2[0]=0.000000 // p1[1]=0 p2[1]=0.000000 // p1[2]=-1476812784 p2[2]=2.000000 // p1[3]=21892 p2[3]=3.000000 // p1[4]=4 p2[4]=4.000000 return 0; }