e-Learningのページの補足資料で説明したように,program21.cにのdvector関数に
printf("sizeof(double)=%d, i=%d, アドレス a=%d (a-i) = %d (a+1)=%d \n", sizeof(double), i, a, a-i, a+1); printf("aの値が収められているアドレス=%d\n", &a);
を挿入して実行して,表示される値について考えてみよう.次の点に明確な答えができること.
a[0]
にアクセスするとどうなるか.#include <stdio.h> #include <stdlib.h> #define N 5 /* 要素数の指定 */ #define N_MIN 2 /* aについての最小の引数 */ double *dvector(int i, int j); /* ベクトル領域の確保 */ void free_dvector(double *a, int i); /* 領域の解放 */ int main(void) { double *a, *b; int i; // printf("aの領域確保\n"); /* 配列aの添字は1〜N */ a = dvector(N_MIN,N+N_MIN); /* メモリのアドレスを確認 */ printf("aの値=%p\n", a); for ( i=N_MIN; i<=N+N_MIN; i++) { a[i]=(double)i/20.0; printf("a[%d]のアドレス=%p \n",i, &a[i]); /* 配列インデックスとアドレスを表示 */ } for ( i=N_MIN; i<=N+N_MIN; i++) { printf("a[%d]の値=%f \n",i, *(a+i)); /* ポインタを使った値の参照 */ } return 0; } double *dvector(int i, int j) /* a[i]〜a[j]の領域を確保 */ { double *a; if ( (a = (double *)malloc( ((j-i+1)*sizeof(double))) ) == NULL ) { printf("メモリが確保できません(from dvector) \n"); exit(1); } printf("sizeof(double)=%d, i=%d, アドレス a=%d (a-i) = %d (a+1)=%d \n", sizeof(double), i, a, a-i, a+1); printf("aの値が収められているアドレス=%d\n", &a); return(a-i); } void free_dvector(double *a, int i) { free( (void *)(a + i) ); /* (void *)型へのキャストが必要 */ }
dmatrix関数に次のような命令を挿入し結果の意味を考えてみよう.
printf("&a=%d, a=%d, a+1=%d, &a[1]=%d, a[1]=%d, a[2]=%d\n", &a, a, a+1, &a[1], a[1], a[2]); printf("&a[1][3]=%d, &a[2][3]=%d\n", &a[1][3], &a[2][3]);
a[1]
の値と &a[1][3]
の値の差を説明できること.a[1]
と a[2]
の差は,予想より離れていると思う.そのことを確認する.( double a[2][3];
のように配列を宣言したときとはメモリーの使われ方が異なる.)