第6回(11/7) 配列とポインタ(第7, 11章)


配列:同類のデータをひとまとまりに扱うための入物


  1. 宣言方法

    int a[100];

    この宣言により、a[0], a[1], a[2], ..., a[99] の100個の整数型の変数を用意することができる。 (各々の要素に任意の整数を代入することが可能)

    	a[0] = 12345;
    	a[1] =  6789;
    

  2. メリット

    for文や、while文などにより一括してデータを扱うことが可能

    	sum = 0;
    	for (i = 0; i < 100; ++i) sum = sum + a[ i ];
    

  3. 使用上の注意点

  4. 使用例
  5. 練習問題1:前回の課題レポートでは、Mg原子の部分座標、(0,0,0)と(0.6667,0.3333,0.5)、を構造因子の二乗F*Fを計算する式中に直接代入していた。 しかし、このプログラムを他の結晶 のX線回折図形の計算に利用できるようにするためには、この部分を一般化する方が良い。 そこで、原子の部分座標を記憶する2次元配列atom[2][3]を用意し、以下の仕様に変更せよ。
  6. 練習問題2:上の問題では、格子定数、原子座標をプログラム中に記述している。さらに、利便性を高めるために、これらの情報(格子定数、単位胞中に含まれる原子数、原子座標)をscanf文を利用して実行時に入力できるように改良せよ。また、その際、これまで1と仮定していた原子のX線散乱能を各原子の原子番号として、原子座標と同時に入力できるように配列を1列増やすこと。そのプログラムを用いて、以下の水素吸蔵合金として有名なLaNi5の粉末X線回折パターンを計算してみよ。その結晶に関する情報は以下の通り。
  7. ポインタについて(変数はどこに記憶されるのか?)

    以下のプログラム(pointer.c)を作成し、実行してみよ。


    &を変数の前につける:変数が格納されている番地(アドレス)を示す

    *をアドレスの前につける:そのアドレスに格納されている値を示す


  8. pointer.cの解説



  9. 以下のプログラム(pointer2.c)を作成し、ポインタ変数の挙動について考えよ。
    #include 
    main()
    {
      int a = 100, b = 200, *pa, *pb;
      pa = &a; pb = &b;
      printf("a = %d, pa = %x, *pa = %d\n", a, pa, *pa);
      printf("b = %d, pb = %x, *pb = %d\n", b, pb, *pb);
    }
    



    さらに、ポインタ変数(*pa)のポインタ変数(**ppa)を用いた以下のプログラムを入力し、ポインタ変数への理解を深めよ。最後のprintf文中の下線部において、ポインタ変数ppaを用いてaの値100を表示するためにはppaの前に何をつければよいか考えよ。



  10. 配列とポインタの関係

    →配列名自身は、配列の先頭アドレスを有する


    以下のプログラム(array.c)を作成し、実行せよ。
    #include 
    main()
    {
      int i, a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
      for(i = 0; i < 10; ++i){
        printf("a[%d]=%d a+%d=%x *(a+%d)=%d\n",
    			i, a[i] , i, a+i, i, *(a+i));
      }
    }
    
    実行結果
    a[0]=0 a+0=effffa00 *(a+0)=0
    a[1]=1 a+1=effffa04 *(a+1)=1
    a[2]=2 a+2=effffa08 *(a+2)=2