C言語

#if文

#if文は、プリプロセッサディレクティブのひとつで、指定されたマクロの値が真(true)の時、#endifまでのプログラムが有効となりコンパイル対象となる・・・。 偽(false)の時は、コンパイル対象にならないので、実行もされない・・・。 つまり、コメントアウ…

#define文

#define文は、プリプロセッサディレクティブのひとつで、プログラム中の指定した文字列を別の文字列に置換する・・・。 こういうのをマクロといい、さまざまなマクロを#define文で定義できる・・・。今回は数値と文字列の定数マクロを定義する・・・。INT_TE…

#include文

#include文は、プリプロセッサディレクティブのひとつで、指定されたファイルを取り込むという命令・・・。プリプロセッサは、コンパイル前に行う前処理をする機能で、プリプロセッサが行う命令をプリプロセッサディレクティブという・・・。 (なのでプリプ…

関数ポインタ

変数がアドレスを持ち、変数のアドレスを格納する変数がポインタであるように、関数もアドレスを持ち、関数のアドレスを格納する変数を関数ポインタという・・・。 <戻り値型> (*<関数ポインタ名>)(<引数型>, <引数型>, ...); 関数ポインタはこんな風に宣言…

voidポインタ

voidポインタ(void *)は、さまざまなポインタ型にキャストでき、逆にどんな型のポインタでもvoidポインタにキャストできる・・・。これで状況に応じて、さまざまな型に対応した関数が定義できる・・・。funcはvoidポインタと渡す型のサイズを受け取る・・・…

ポインタへのポインタ

ポインタは、変数のアドレスを持つ変数・・・。 ということは、そのポインタへのポインタを定義することも可能・・・。 int **pp; このように宣言すれば、ppはint型変数へのポインタを格納するポインタになる・・・。 これを使った2つの例を示す・・・。まず…

ビットフィールド

C言語における変数のサイズは最小でもcharの1バイト、8bit分はある・・・。 それに対し、真か偽かを保持するなら1bitで十分である・・・。 こういう場合に、なんとかしてbit単位でメモリ領域を割り当てられないだろうか・・・。C言語の構造体にはビットフィ…

共用体

共用体は、構造体に似ているが、要素1つ1つにメモリ領域が割り当てられているのではなく、複数の要素が1つのメモリ領域を共有している・・・。今回は、union_userという共用体を定義・・・。 構造体struct_user_nは、nameだけ・・・。 構造体struct_user_na…

列挙型

列挙型はいくつかのマクロ定数をまとめたようなもので、列挙型の変数はこのマクロ定数群のうちのどれかを値に取る・・・。例えば、 enum TEST{ TARO, JIRO, SABURO }; enum Test test; という感じで、TESTの定義とtestの宣言をした場合、testの値はTARO, JIR…

typedef

typedefは、既存の型に新しい型名を付けるときに使う・・・。 typdef <元の型名> <新しい型名> このように使う・・・。例えば、unsigned charという型をbyteという型として定義できる・・・。 unsigned charがなくなったわけではなく、byteという型は実際はu…

可変引数

printfのように、呼び出し側で引数の数や型を決めるような関数を作ることができる・・・。 引数が呼び出し側で可変なので可変引数という・・・。可変引数を扱うには、stdarg.hというヘッダファイルをインクルードする必要がある・・・。例えば、今回は指定さ…

main関数の引数

プログラムを実行するときに、オプションとしてパラメータを渡すことができる・・・。 $ ./program abc例えば、このようにprogramに"abc"という文字列を渡せる・・・。 これをコマンドライン引数ともいい、これはmain関数の引数として渡されるので、 int mai…

再帰関数

関数の中で、再びその関数自身を呼び出すことができ、こういう関数を再帰関数と呼ぶ・・・。 これを使うことで、ループ処理をより簡潔に記述できる・・・。渡された値を階乗した値を返す関数factorialを定義する・・・。その前にmain関数は、こうなっている…

ブロック

ブロックは、'{'と'}'で囲んだ場所のこと・・・。 関数や、if文、for文など、処理をまとめたところにはほとんど必ずといっていいほど使われている・・・。ブロックの先頭で宣言した変数は、そのブロックの末尾を抜けるまで有効であり、値が保持されていて、…

sizeof演算子

ストックがなくなったので、久しぶりにC言語のSampleの続きを・・・。sizeof演算子は、型、変数、ポインタ、配列、構造体、式などのサイズを返す演算子・・・。 sizeof よく括弧でくくるので、 sizeof() こんな感じで関数みたいに見えることが多いが演算子・…

キャスト演算子

キャスト演算子は、指定された型にキャスト(型変換)する演算子・・・。式の値や変数が違う型同士の場合、暗黙的なキャストのルールによって、同じ型になるように変換される・・・。ただし、指定した型に強制的に変換したい場合はキャスト演算子を使って変換…

ビット演算子

単一の整数値、または2つの整数値同士は、ビット演算子を使ってビット演算が可能である・・・。まずは、入力されたa, bの値を2進数のビット列で出力する・・・。 2で割った余りを下の桁から文字配列に入れていく感じ・・・。 (今回はintのa, bを8桁2進数で表…

論理演算子

if文などの条件式で条件と条件を繋げたり、条件を否定する条件にしたりする時、論理演算子を使う・・・。論理和(OR)の演算子("||")を使って、 A || B は「AまたはB」というような意味・・・。 どちらかが満たされていればいい・・・。aが10より大きい、また…

const

const修飾子を変数宣言で型の前に付けると、値が変更できない変数(つまり定数)となる・・・。 const <型> <変数名> 例えば、 /* ヘッダファイルのインクルード */ #include <stdio.h> /* 標準入出力 */ /* main関数の定義 */ int main(void){ /* 変数の初期化 */ int </stdio.h>…

exit

exitは、指定した終了コードでプログラムを終了するC標準ライブラリ関数・・・。Man page of EXITmain関数の中のreturn文と基本的には同じ・・・。 ただ、これを使えば、任意の他の関数からプログラムを終了できる・・・。 異常時の強制終了とかに使う・・・…

外部変数

グローバル変数は、そのモジュール内ならどこでも参照、代入が可能な変数であった・・・。 では、別のモジュールからその変数を参照したり、代入したりする場合はどうすればいいのか?このような場合は、参照したい別モジュールで、参照したい変数をexternを…

スタティック変数

スタティック変数は、関数などのブロック内部のみアクセス可能だが、そのブロックを抜けても変数の値を保持する性質を持つ・・・。今回は、関数内部に3つの変数を宣言し、関数が呼ばれるたびにその値がどう変化するかを見ていく・・・。スタティック変数を含…

グローバル変数

基本的に変数は、if文や、for文、関数などブロック("{"と"}")で囲まれた範囲(これをスコープという)でのみ有効であり、 外からそこにアクセスすることはできないし、そのブロックを抜けると値も保持される保証は無い・・・。グローバル変数は、そのモジュー…

ftell

ftellは指定されたファイルの現在のアクセス位置を取得するC標準ライブラリ関数・・・。Man page of FSEEKの2番目がftell・・・。 引数はファイルポインタだけ・・・。 戻り値に、先頭からのアクセス位置がlongの値で返ってくる・・・。fseekの頁ではprof.bi…

fseek

fseekは指定されたファイルのアクセス位置をセットするC標準ライブラリ関数・・・。Man page of FSEEKの1番目がfseek・・・。 ファイルポインタ、基準位置から何バイト目か、基準位置(先頭からなのか、末尾からなのか、など)、って感じで指定する・・・。こ…

fread

freadは指定されたファイルなどのストリームから、指定サイズのデータを読み込み、指定のメモリ領域に格納するC標準ライブラリ関数・・・。Man page of FREADの1番目がfread・・・。 バイナリファイルから、変数、配列、構造体にデータを格納するとき使う・…

fwrite

fwriteは指定されたメモリ領域のデータを指定されたサイズ分、ファイルなどのストリームに出力するC標準ライブラリ関数・・・。Man page of FREADの2番目がfwrite・・・。 一般的には、変数や配列、構造体などをバイナリデータのままファイルに書き込むとき…

fputs

fputsは指定された文字列をファイルなどのストリームに出力するC標準ライブラリ関数・・・。Man page of PUTSの2番目がfputs・・・。 指定文字列を標準出力へ出力するputsをベースにしている・・・。 第1引数に出力する文字列、第2引数にファイルポインタを…

fgets

fgetsはファイルなどの指定されたストリームから1行分の文字列を読み込んで、指定の文字配列に格納するC標準ライブラリ関数・・・。Man page of FGETCの2番目がfgets・・・。 標準入力から1行読み込むgetsをベースにしているが、getsはセキュリティ上の問題…

malloc

mallocは、指定されたサイズのメモリを動的に割り当てるC標準ライブラリ関数・・・。Man page of MALLOC引数には、割り当てるメモリのサイズを指定する・・・。 戻り値には、割り当てたメモリ領域の先頭アドレスが返ってくる・・・。これを使って、int型の動…