ポインタについての復習

program2.1 でのテスト

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);

を挿入して実行して,表示される値について考えてみよう.次の点に明確な答えができること.

#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 *)型へのキャストが必要 */
}

program2.2でのテスト

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]);