プログラムを書いていると、様々な値(データ)を保持し、あとから使いたくなることに出くわす。 このような目的のために、データに固有の名前をつけたものを変数と呼ぶ。
変数に対する操作としては、次の3種類がある。
C 言語では代入や参照を行う前にあらかじめ変数を準備する作業が必要である。 宣言の際には、変数の型と名前を組み合わせなければならない。
変数は幾つ作っても良く、区別するために名前をつける。 名前には英数字および _(アンダースコア)を用いることができる。ただし、数字から始まることはできない。
int i; /* int 型の変数として i を準備する */ int very_long_variable_number_1; /* 長い変数名の例 */
変数名 = 式;
という形式で式の値を変数名に記憶させることができる。
代入を行うと、以前に記憶されていた値は消え去り、新たに与えた値で上書きされる。
i = 1; /* 変数 i に 1 を代入 */ /* 小数点を含むようなものを整数型に代入すると、 小数点以下が捨てられる。そのため 実際に代入されるのは 3 である。*/ very_long_variable_number_1 = 3.1415926535;
'=' の左辺以外で変数が現れるときには、変数の参照となる。 実行の時点でその変数に代入されている値が使われる。
int i, j; i = 1; /* 変数 i に 1 を代入 */ j = i + 1; /* 変数に i + 1 の結果を代入。 * この場合 i には 1 が入っているので * j は 11 となる */ i = i + 1; /* i の内容に対して 1 を加えた結果を * 変数 i に代入。上の結果の代入先が * i になっているだけである。 * "=" を数学的な意味で考えると * 意味不明になるので注意。 */
変数の中身を画面等に出力するには printf
関数を用いる。
C 言語では、データは表現できる内容に応じた「型」を持つ。 型は、実数(浮動小数点)、整数という区別だけではなく、 実数、整数の中でも表すことのできる範囲に応じた複数種類のものがある。
「整数型」の変数に実数を代入すると小数点以下が0にむかって省略される。
/* test_int.c */ #include <stdio.h> int main() { /* 整数型変数に実数を代入してみる */ int i; /* 正の数の場合は切り捨て */ i = 1.5; printf("i = 1.5 ===> %+d\n", i); /* 負の数の場合も確かめてみる */ i = -1.5; printf("i = -1.5 ===> %+d\n", i); }
「整数」を表すための型として次のものが用意されている。
型名 | データサイズ(バイト) | 表現できる値の範囲 | |
---|---|---|---|
符合付 | 符合無 | ||
char |
1 | -128 〜 127 | 0 〜 255 |
short |
2 | -32768 〜 32767 | 0 〜 65535 |
int |
2 または 4 (※1) | -32768 〜 32767 または | 0 〜 65535 または |
-2147483648 〜 2147483647 | 0 〜 4294967295 | ||
long |
4 (※2) | -2147483648 〜 2147483647 | 0 〜 4294967295 |
実数(浮動小数点)を表現する変数には次のものが用意されている。 実数型の変数に整数を代入すると、少数点以下が 0 となる(当たり前..)。
型名 | データサイズ(バイト) | 表現できる値の範囲 | おおよその有効桁数 |
---|---|---|---|
float | 4 | -3.4×1038〜3.4×1038 | 10進数で7桁程度 |
double | 8 | -3.4×10308〜3.4×10308 | 10進数で14桁程度 |
実数型には、符合無の型はなく、必ず符合付きである。
「1バイト」とは「8ビット」で、28 = 256通りのものを表すことができる情報量である。
コンピュータ内部では、メモリ空間 1バイトずつにアドレス(address, 番地)がつけられている。
そのメモリ空間上に、ある特定の領域を取って、変数として利用される。
&
演算子を用いると、変数のメモリ上の位置を求める事ができる。
printf 関数で、アドレスを表記するための書式指定子には %p
を用いる。
また、演算子 sizeof
を変数に対して用いると、その変数の占める領域の大きさをバイト単位で求めることができる。
プログラムの実行時に、例えば上のようなメモリ配置になっていた瞬間に
int main() { int i; char a[6]; i = 1; printf("&i = %p sizeof(i) = %d\n", &i, sizeof(i)); printf("&a = %p sizeof(a) = %d\n", &a, sizeof(a)); printf("&a[3] = %p sizeof(a[3]) = %d\n", &a[3], sizeof(a[3])); }
というプログラムを実行すると
~% ./a.out &i = 0x52f4 sizeof(i) = 4 &a = 0x52fa sizeof(a) = 6 &a[3] = 0x52fd sizeof(a[3]) = 1 ~%
という出力を得る。
メモリ上のアドレスを表現するポインタを格納できる 変数である。上に出てきたすべての型に対するポインタ変数が存在する。