第1回目のヒント

■ C言語の基本

データ型

データ型とは、データの種類である。データ型と使用するメモリ量は関係が深い。

たとえば、char は、「文字」のデータ型で、1バイトである。short int は、「整数」のデータ型であり、2バイトである。int は、「整数」のデータ型であり、大きさは処理系依存である。通常、32ビット計算機で32ビット対応のOS上では、4 バイトである。

データ型の大きさは、sizeof(データ型) により得られる。

変数

変数は、プログラムの上で、データを特定するための記述である。

プログラム上で変数を使うとき、データ型を指定しなければならない。この指定をすることを「変数宣言」という。

プログラム上で変数宣言をする場所に依存するが、変数宣言により、計算機のメモリ上に、使用可能なメモリが準備される。その大きさは、変数のデータ型に対応している。

ポインタ

ポインタは、変数のために準備されたメモリのアドレスである。

int 型のデータ構造に対するアドレスを扱う変数は、int のポインタ変数という。 int *p; という宣言により、変数 p を使うことができる。

整数の変数として、 int x; という宣言のあるとき、x のために準備されたアドレスは、 &x により得られ、 p = &x; により int のポインタ変数にそのアドレスを代入することができる。

配列

配列は、同一のデータ型のデータの並びである。

配列の構造をした変数の宣言は、2通りある。

プログラムを作成する段階で、配列の大きさを決めておく(固定する)ならば(方法1)を使う。プログラムの実行時に配列の大きさを決めておくならば(方法2)を使う。

どちらの方法で宣言しても、変数 s の使い方は同じである。

文字列

文字列は、文字型 char の配列である。

文字列は文字の連続であるが、「\0」が終端文字である。

改行も文字であり、「\n」が改行文字である。

プログラム上で、'a' と書くと、それは文字型である。

プログラム上で、"abc" と書くと、それは文字列であり、'a','b','c','\0' という4つの char 型のデータの並びである。

文字列の長さを測る関数は、strlen(s)である。改行文字も長さに含まれる。\0は含まれない。

"abc" を格納するには、大きさ4の配列が必要である。\0 を格納するためである。

キーボードから abc を入力し、fgetsをすると、改行文字が含まれる。char s[5]; の宣言があるとき、fgets(s, 5, stdin) を実行すると、s[0] は 'a', s[1] は 'b', s[2] は 'c', s[3] は '\n', s[4] は '\0' となり、strlen(s) は 4 を返す。ちなみに、char s[5] の宣言のとき s[5] は使えない。

文字列のコピーをする関数は、 strcpy(dst,src)である。コピーの元となる文字列は src、コピー先(書き込み先)となる文字列は dst である。dst には src が格納できるだけの十分なメモリが確保されていなければならない。

構造体

複数の変数を束ねたものが、構造体である。

struct により束ねる変数を定義する。以下に定義の例を示す。構造体を定義する際、束ねられる変数の宣言が必要である。下記の例の name や age は、構造体を構成する変数であり、メンバ変数とも呼ばれる。

struct {
  char name[10];
  int  age;
}

メンバ変数へのアクセス方法はドット記法と矢印記法がある。ドット記法は、構造体を表す変数のメンバ変数をアクセスする際使用する。矢印記法は、構造体へのポインタ変数のメンバ変数をアクセスする際使用する。

main()
{
  struct {
    char name[10];
    int age;
  } n, *p:

  strcpy(n.name,"abc");
  n.age = 20;
  p = &n;
  printf("%s\n",p->name);
  printf("%d\n",p->age);
}

データ型の定義

データ型を新しく定義するために、typedef がある。

  1. typedef int Seisuu;
  2. typedef int RGB[3];
  3. typedef struct { char name[10]; int age } NameCard;

1つめは、「Seisuu」というデータ型の定義であり、具体的には int 型である。2つめは、「RGB」というデータ型の定義であり、具体的には、大きさ 3 の int の配列である。3つめは、「NameCard」というデータ型の定義であり、具体的には、長さ10の文字の配列の変数 name と int 型の変数 age で構成される構造体である。

変数宣言をするときは、typedef で定義したデータ型の名前を使うことができる。

typedef int Seisuu;
typedef int RGB[3];
typedef struct { char name[10]; int age } NameCard;

main()
{
  Seisuu a;
  RGB c1, c2;
  NameCard n;
  NameCard *p;

  a = 1;
  c1[0] = 0; c1[1] = 0; c1[2] = 3;

  strcpy(n.name, "abc");

  p = (NameCard *)malloc(sizeof(NameCard));
  strcpy(p->name, "abc");
}