とある学生の技術Blog

半分くらい自分の備忘録として…

【初心者入門】C言語の基本

f:id:t-0731:20150609044954j:plain最近、友人がC言語の講義を受けているそうなのですが、話を聞く限り「おまじない」などが多用されてなんの処理かわからないような箇所も多々あったようなので少し解説します。

そもそもC言語とは

C言語ベル研究所で作られたプログラミング言語です。 プログラムを実行するときは、コンピュータが実行するのに最適な機械語というものに変換する必要があります。 この変換作業をコンパイルと呼び、変換ツールコンパイラです。

include(インクルード)とは

Cにはいろいろな便利な関数があります。関数とは大雑把に言えば、いくつかのコードをまとめて一つの処理としたもののことです。 例えば有名なものにprintfがあります。

printf("Hello World!\n");

しかしprintfはそのままでは使えません。使いたいときには以下のようにファイルの一番上に記述する必要があります。

#include <stdio.h>

これをインクルード命令といいます。インクルード命令は関数がまとめられているファイルを読み込む命令です。この場合だとstdio.hというファイルを読み込んでいます。ちなみにstdioとは「STandarD Input/Output」の略称で「標準入出力」という意味です。

関数とは

関数は数学で言う「y=2x」のような関数と同じと考えてください。関数は以下のように宣言をします。

int func(int, int);

関数の宣言のことをプロトタイプ宣言と言います。プロトタイプ宣言は関数を使う前に宣言しなくてはいけません。
なぜならばCでは1行目から順にコンパイルされていくので、関数を使っている処理があった時に関数が定義されてなければどう解釈していいのかわからずエラーになってしまうからです。そのためプロトタイプ宣言を行うことでこのコードにはこういう関数があってこういう変数が使えますよという宣言をしているのです。 そして関数は定義します。

int func(int a, int b) {
  int c;
  c = a + b;
  return c;
}

funcの前のintは返す値の型を記述します。返す値のことを返り値や戻り値などといいます。戻り値はreturnの後に書き、この場合だと変数cの値を返しています。また、func()の中の変数a,bは呼び出した処理から受け取った値が格納されます。これを引数といいます。呼び出すときは例えば以下のようにします。

int sum, x=5, y=7;
sum = func(x, y);

つまり変数sumにfuncの戻り値を代入するということです。その時、引数にx, yを指定しています。

2次元配列とは

2次元配列とは配列が2次元になったものです。 配列はしばしばロッカーに例えられます。横一列にロッカー番号0番から順に並んでいる感じです。ロッカーの番号が配列の添字に該当します。2次元配列はそれに縦方向のロッカーが増えたようなイメージです。

ポインタとは

ポインタはメモリを扱う仕組みのことで、ポインタ変数を使ってメモリのアドレスにアクセスできます。ポインタ変数は値と値の格納されているアドレスの2つを持っています。アドレスとは変数の値が格納されている番地のことです。 ポインタ変数は以下のように宣言します。

int *p;

ポインタ変数はアドレスを直接いじることができるので例えば以下の様な事ができます。

int num=5;
int *p;

p = &num;
printf("num1=%d, p1=%d\n", *p, num);

num+=10;

printf("num2=%d, p2=%d\n", *p, num);

この出力の結果は以下のようになります。

num1=5, p1=5
num2=15, p2=15

このコードでは

p = &num;

で変数のアドレスを参照しています。そしてそのアドレスをpのアドレスとして代入しています。基本的にポインタ変数は宣言する時以外に*(アスタリスク)がついていたらポインタ変数の持っているアドレスに格納されている値を指します。逆にアスタリスクがついていない場合はポインタ変数のアドレスを指しています。 変数のアドレスを参照するには&(アンパサンド)を使います。scanfを使ったことのある人は見覚えがあるのではないでしょうか。

scanf("%d", &a);

これは変数ではなく変数のアドレスに直接値を格納していたのです。

そしてnumのアドレスがpに代入されたということは2つのアドレスは同じになっているということです。 ゆえにnumに10を足しても実際には変数numのアドレスに格納されている値に変更が加えられているので、pとnumを出力してみると共に同じアドレスの値を指しているので同じ値が出力されているわけです。

とりあえずこの辺りが最初につまづきやすい場所なので簡単に解説をしました。 さらに学習する上で理解の助けとなれば幸いです。特にポインタはもっと奥が深いのでしっかり学習することをおすすめします。 最後まで見ていただきありがとうございました。