読者です 読者をやめる 読者になる 読者になる

#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型の動…

strcmp

strcmpは文字列同士を比較し、どちらがASCIIコード順で先か後かを判定する・・・。Man page of STRCMP戻り値が負の値の場合は、第1引数の文字列が先、 戻り値が正の値の場合は、第2引数の文字列が先、 戻り値が0の場合は、2つの文字列は等しいと判定する・・…

strcat

strcatは、文字列を別の文字配列の末尾に連結するC標準ライブラリ関数・・・。Man page of STRCAT第1引数に連結先の文字配列、第2引数に連結元の文字列を指定する・・・。 後ろから前に連結・・・。 コピー先の文字配列はNULL終端である(NULL文字で終わって…

strcpy

strcpyは、文字列を別の文字配列にコピーするC標準ライブラリ関数・・・。Man page of STRCPY第1引数にコピー先の文字配列、第2引数にコピー元の文字列を指定する・・・。 後ろから前にコピーという感じ・・・。 コピー先の文字配列は、コピー元の文字列、そ…

strlen

strlenは、文字列の長さを取得するC標準ライブラリ関数・・・。Man page of STRLEN引数に対象となる文字列(文字列リテラルや文字配列)を指定すると、戻り値として文字列の長さをバイト数で返す・・・。 文字列の長さとは言ったが、バイト単位で返すので文字…

文字列

これまでも散々扱ってきた文字列について改めて・・・。文字列は、 文字列リテラル 文字配列 に分けられる・・・。文字列リテラルは、任意のメモリが確保され、それぞれの文字が指定の文字に固定される・・・。 プログラム中でメモリを確保していないので、…

fscanf

fscanfはファイルから読み込んだデータを、指定の書式に基づいて、指定の変数や配列などに格納するC標準ライブラリ関数・・・。Man page of SCANFの2番目がfscanf、ファイルポインタ以外はscanfと同じ・・・。"test.txt"からスペース区切りのデータを読み込…

fprintf

fprintfは指定された書式でファイルに出力するC標準ライブラリ関数・・・。Man page of PRINTFの2番目にあるのがfprintfで、名前の通りprintfのようにファイルに出力できる・・・。"test.txt"に、入力された名前(name)、年齢(age)、住所(address)、を出力す…

fopen

ファイルに読み書きをするには、まず"開く"という行為をしなければならない・・・。fopenは指定されたファイル名のファイルを開くC標準ライブラリ関数・・・。Man page of FOPENここでは"test.txt"というテキストファイルを開いてみる・・・。ファイルへの入…

構造体

いくつかの異なる型の要素をまとめて、1つの新しい型として扱うことができるのが、構造体・・・。ここでは、名前、年齢、住所(といっても都道府県ぐらいでいいが)という3つの要素を、1つにまとめた簡易名簿の構造体を定義し、その構造体の変数各要素に入力さ…

ポインタ

ポインタは、変数のアドレスを格納するための変数・・・。たいていの変数は、メモリ上に割り当てられているので、そのメモリのアドレスがわかれば値にアクセスできる・・・。 そのメモリのアドレスを格納することができるのがポインタと呼ばれる特殊な変数・…

配列

これまでにも何度か出てきてる配列について・・・。配列は、同じ型のメモリ領域を連続して確保したもので、 <型名> <配列名>[<要素数>];このように宣言する・・・。たとえば、 int a[10]; は要素数10のint型配列aで、int型変数10個分に相当する・・・。ここ…

関数

これまで、プログラムをすべてmain関数の中に書いてきたが、 プログラムが巨大になってくると、読みにくいし、保守性も悪い・・・。いくつかの処理をまとめて、ひとつの関数とすることで、 ひとつひとつのコードは短く読みやすくすることができる・・・。mai…

for文

for文も繰り返し処理の構文の一種・・・。 条件式に加えて、初期化式、増分式を設定できる・・・。 for (<初期化式>; <条件式>; <増分式>){ <繰り返したい処理>; }式で初期値が決まり、とで回数も決まるので、繰り返す回数が決まっている処理の場合はこちら…

do-while文

do-while文も繰り返し処理の構文の一種・・・。do-whileは、 do{ <繰り返したい処理>; }while (<条件式>);と書く・・・。 while文と違うのは、条件式が後ろにあるということ・・・。 そして、これにより、最初の1回は無条件で必ず実行されるという特徴がある…

while文

特定の処理を繰り返したい場合は、繰り返し処理の構文を使う・・・。whileは、 while (<条件式>){ <繰り返したい処理>; }と、書くことでが真(非ゼロ)である間は、を繰り返す・・・。ここでは、入力されたn, m(n まずは、変数の宣言・・・。開始値のn、終了値…

switch-case文

分岐する条件が変数の値であれば、switch-case文を使うこともできる・・・。たとえば、 aが1なら、"a is one."とprintfで出力、 aが2なら、"a is two."とprintfで出力、 aが3なら、"a is three."とprintfで出力、 それ以外なら、"a is otherwise."とprintfで…

if-else文

if文は、条件によって処理を分岐させたい時に使う構文・・・。たとえば、 aが10なら、"a is 10"とprintfで出力 したいときは、 if (a == 10) printf("a is 10\n"); と書く・・・。 ifのあとの括弧"()"に条件式、そのあとに実行したい処理を書く・・・。 "=="…

算術演算子

変数やリテラルを使って、数値を計算するときに使う基本的な演算子が算術演算子・・・。ここでは入力された値と算術演算子を使って、四則演算と剰余算を行う・・・。 $ vi arithmetic_operator.c入力された値を格納するa, bと、add_result、sub_result、mul_…

scanf

scanfは標準入力から入力されたデータを、指定の書式に基づいて、指定の変数や配列などに格納するC言語の標準ライブラリ関数・・・。Man page of SCANF標準入力とはキーボードのこと・・・。 指定の書式というのはちょっと置いといて・・・、 とにかく数値を…

printf

久しぶりに更新・・・。 もう何度も出てきてるし、説明してるprintfだけど、ここで改めて・・・。printfは指定された書式で文字列を標準出力に出力するC言語の標準ライブラリ関数・・・。Man page of PRINTF標準出力とはいわゆるコンソール出力のこと・・・…