c-lang:変数
データ型
データ型(タイプ)とは、データオブジェクト(式:値を格納するもの)がどんな値を保持できるかを定めるものである。 変数と関数については宣言時にデータ型の指定をするが、定数のデータ型は、その定数によって決まっているので宣言する必要はない。
処理系(コンパイラ)によって型のサイズは異なる。
table:data-type
char 8ビットの整数型。1バイト文字を1文字格納できる。
int 16ビットまたは32ビットの整数型。
float 32ビットの浮動小数点数型。有効桁は10進数で7桁(単精度浮動小数点数型)。
double 64ビットの浮動小数点数型。有効桁は10進数で13桁(倍精度浮動小数点数型)。
void 値を返さない関数や、汎用型ポインタに用いる。
修飾子を用いてデータ型を拡張できる。
例えば、unsigned charは符合なしの文字型である。
table:modifier
short intに用いる(その際はintを省略できる)。16ビットの整数型にする。
long intに用いる(その際はintを省略できる)。32ビットの整数型にする。doubleに用いると、拡張精度浮動小数点数型にする。
局所変数と広域変数
局所変数、ローカル変数
関数内で定義され、その関数内でのみ使用することができる。
広域変数、グローバル変数
変数の適用範囲(スコープ)
関数外で宣言した変数は、その位置からソースモジュールの最後まで通用する。
関数内で宣言した変数は、その位置から関数の最後まで通用する。
ブロックの頭部で宣言した変数は、その位置からブロックの最後まで通用する。
関数の仮引数として宣言した変数は、その位置から関数の最後まで通用する。
自動変数 auto
関数の中で定義され、その関数の中だけで使用できる。
関数がコールされると、メモリ上に変数が配置される。
自動変数は宣言された関数の中でのみ使用できる局所変数である。
関数内で宣言されていて、記憶クラス指定子のついていない変数は auto である。
静的変数 static
関数の中で定義され、その関数の中だけで使用できる。
プログラムが起動されるとメモリ領域の一部をつねに占有する。
その関数の処理が終わっても変数は消滅せず、その値をいつまでも保持している。
静的変数の機能
値を保持する(記憶の永久性)
変数のプライベート化
内的 static と 外的 static
外部変数 と extern
外部変数
関数外で定義され、どの関数からでも参照できる。
プログラムが起動されるとメモリ領域の一部をつねに占有する。
その関数の処理が終わっても変数は消滅せず、その値をいつまでも保持している。
モジュール内の外部変数
外部変数は関数の外に記述する。 識別子は書かなくとも、その記憶されている位置から外部変数と認識される。
モジュール間の外部変数
外部変数はひとつのモジュール内だけでなく、複数のモジュール間で使うこともできる。 このためには、
外部変数の定義
外部変数の宣言
を使いわけなければならない。
外部変数の定義と宣言
外部変数の定義
その変数の性格を外部変数とする。 そして、実際に記憶領域を割り当てる。 識別子 extern をつけない。
外部変数の宣言
その変数の性格を外部変数とする。 しかし、実際に記憶領域を割り当てない。 識別子 extern をつける。
レジスタ変数 register
関数内で定義され、その関数内で使用できる。
その関数がコールされるとレジスタに割り当てられる。
その関数の処理が終わったら変数は消滅する。
このキーワードは、どの変数が繁雑に参照され、レジスタに格納する価値があるのかを知る手掛かりになる。
register宣言は、そのことをコンパイラに知らせるのに使われる。
その目的は、register変数を使うことによって、プログラムを速く、小さくすることにある。
コンパイラが、この指示を無視するのは自由である。
一般論として、一度しか参照されない変数に対してregisterをすると、コードの効率は悪くなる。
(レジスタの退避と復帰のコードが増える)
レジスタ変数の数と型についての制限はマシンによって変わる。
型定義 typedef (ここでいいんだろうか?)
typedef は、型に新しい名前をつけることができる。
ある意味で、typedef はマクロのテキスト置換( #define )に似ている。
しかし、両者には根本的に違っている点がある。
グローバル変数をマクロで扱う
code:cpp
というように #ifdef で、 GLOBALというマクロ名を空白かextern に変換する。
code:cpp
GROBAL int hogehoge