ログイン
kid's world

配列

配列

ここまではmalloc関数やfree関数を使って大量の値を扱う方法を見てきたが,これらの関数を使わない方法もある。それが次に説明する配列である。扱うデータの個数が最初から決まっている場合は,配列を使ったほうが簡単で安全である。

配列の宣言

ではまず,配列の宣言のしかたから解説しよう。基本的には,次のような書式である。

型 配列名[個数];

たとえばint型の値を100個扱う配列iを宣言したい場合は,

int i[100];

と宣言する。宣言するとき,次のように普通の変数やポインタ変数と混ぜて宣言してしまってもかまわない。

int *p, i[100], j;

配列名はポインタ

次のように,

int i[100];

と宣言すると,メモリ上にはint型の値が100個入るメモリ領域が確保されている。このとき,配列名「i」は,そのメモリ領域の先頭アドレスを指すポインタになっている。したがって値を書き込むには,ポインタ変数を使ったときと同じように,

*i=100;
*(i+1)=127;
*(i+2)=1234;
...

と書くことができる。ただし配列名はポインタではあっても,変数ではないというところが,ポインタ変数と唯一異なるところである。変数ではないので,アドレスを変更することはできない。したがって,

i++;

とか,

i=p;

などと書くことはできない。

実は,配列はポインタ変数の場合のような値の読み書きをすることはまれで,普通は次のように書く。

i[0]=100;
i[1]=127;
i[2]=1234;
...

このように配列名の後ろに大カッコ([ ])をつけて,その中に添え字(インデックス)を書くことで,それぞれの要素にアクセスできるのだ。この書き方は便利である。あたかも「i[0]」から「i[99]」までの100個の変数名があるかのように扱えるわけだから。

では,List 8に配列を使った例をあげておこう。配列iの先頭から,10,20,30を代入し,printfですべての合計を表示している。ポインタ変数を使うのと比べて,実にシンプルだ。

List 8: 配列を使った例

#include <stdio.h>

main()
{
  int i[3];
  
  i[0]=10;
  i[1]=20;
  i[2]=30;
  
  printf("%d\n",i[0]+i[1]+i[2]);
}

ここで勘の鋭い方は,「ポインタ変数でも同じ書き方ができるのではないか」と思われただろう。配列とポインタ変数の唯一異なる点は,配列はアドレスを書き換えられない,というだけだからだ。その予測は実に正しい。List 9に例をあげておいた。ただし,ポインタ変数を使ってこのような書き方をすることはあまりない。配列で添え字を使うと覚えておこう。

List 9: 配列のように扱えるポインタ変数

#include <stdio.h>
#include <stdlib.h>

main()
{
   int *p;
   
   p=malloc(sizeof(int)*3);
   if(p==NULL) exit(1);
   
  p[0]=10;
  p[1]=20;
  p[2]=30;
  
  printf("%d\n",p[0]+p[1]+p[2]);
  
  free(p);
}

おわりに

今回はかなり難しい内容だったかもしれないが,これが理解できているのといないのでは,プログラマとしてのレベルがそうとう違ってくることは間違いない。もしあやふやな部分があったら,何度か読み返して,また実際にプログラムを作成して,メモリとポインタの関係を理解できるようになっていただきたい。

次回は,キーボードから値や文字を得る方法について解説する。


文字を覚える変数」へ進む

広告


©Toshio Koide 1996-2007.

目次

リンクについて

リンクは御自由にどうぞ。

メール

mail.gif

広告