x;のように「変数の型」と「変数の名前」を指定する。1;あるいはx++;と書くことが出来る。1;あるいはx--;と書ける。定数は、10進数については10のようにそのまま記述する。8進数は先頭に0をつけて047などとする。16進数は先頭に0xをつけて0xffなどとする。浮動小数点定数は10.08や1.0e-2などのように記述する。文字は'A'、文字列は"ABC"と囲んで表記する。変数には型と呼ばれるものが存在する。型は変数の性質を表す。初心者のためのポイント学習C言語より。)型キャストを行うことで、型を変換できる。余りの計算また、++でインクリメント(その数値に+1を計算して代入)、--でデクリメント(その数値に-1を計算して代入)ができる。インクリメント・デクリメント演算子には、後置演算(a++)と前置演算(++a)が存在する。単独で用いた時は結果は変わらないが、=とともに用いると、++aは先に処理をしてから代入され、a++は代入してから後に処理が行われる。配列は、変数を連続的に格納する、変数の集合。val[]という風に[]のついた変数を定義すると、配列となる。配列では、複数の値を連続的に持つ変数を作ることが出来る。x[2]の変数が出来る。配列の初期化は以下のように記述する。};配列の初期化の際に、配列以上の要素を記述するとエラーになる。配列未満の要素を記述すると、あまったデータは0で初期化される。str[256]とする。"hello";などとする。constconstは、「一度代入されたら変更されない変数」すなわち(名前のついた)定数を定義するのに使う。char*型を使うことが多い。できるだけ定数として使われる変数にはすべてconstを付けることが推奨される。関数の引数が文字列のポインタである場合、constをつけることで明示的に「変更されない」ということを示すことができる。staticstaticは静的ローカル変数と静的グローバル変数を宣言するのに使う。静的ローカル変数は、関数のローカル変数でありローカルスコープでのみアクセスできる変数でありながら、関数の実行が一度終わってからもプログラム終了まで保持され続ける変数のこと。以下のように、関数の中で定義した静的ローカル変数をインクリメントすることで、関数を呼び出すたびに値を増やし続ける、といったことができる。func();}実行結果123この時、x=0という初期化処理は最初の一回のみされ、xは関数の実行が終わってもプログラムの終了まで値を保持し続ける。静的グローバル変数は関数外で宣言されるグローバル変数でありながら、別のファイルからはアクセスできない変数のこと。関数外でstaticを使った場合、そのグローバル変数は静的グローバル変数となり、他のファイルからはアクセスできなくなる。static変数は、簡易オブジェクト指向のようにも利用できる。オブジェクトのインスタンスを作る代わりに、静的ローカル変数を使用できる。静的グローバル変数を使うことで、複数の関数から共有されるデータをグローバル変数としながら、他のファイルからアクセスできなくし、隠蔽することができる。この場合、静的グローバル変数にアクセスするための特別のインターフェース関数を作って、そのインターフェースからのみグローバル変数にアクセスできるようにすることで、グローバル変数を隠蔽することができる。ややこしいことにJavaにもstaticキーワードというものがあり、これも意味が違う。Javaのstaticメソッド(あるいは変数)は、クラスのインスタンスを作成しなくても実行できる、インスタンスの生成とは別個の関数的なメソッド(変数)である。BOOKS)」より編集して引用。printf("君の名前を入力してください。printf("%sさん、どうもこんにちは。printf("君の年齢を入力してください。return(0);}charは文字型の変数。ここでは文字型の変数の配列の宣言と同時に、MAXLINEと呼ばれる定数をマクロで宣言している。(#defineで宣言している部分。プリプロセッサによってコンパイル前にマクロ的に書き変えられる。#includeはファイルを読み込んで追加する。)文字列(単語など)を変数にしたい時は、文字型の配列か、それへのポインタを使う。文字列は文字型の配列へのポインタとして扱われるため、そのままでは別の変数にコピーできない(参照的アドレスだけがコピーされる)。文字列をコピーしたい時はstrcpy関数を使う。strcpyにはバッファーオーバーフローの問題があるため、セキュリティ機能を追加したstrcpy_sを使うべきである。C++ではstrcpy関数を使うとコンパイルエラーが発生し、strcpy_s関数を使うように促されることがある。ちなみに、文字はシングルクォーテーションで、文字列はダブルクォーテーションで表す。printf/scanfなどで文字を指定する時は%sで表す。str[128];printf("文字列を入力しなさい。\n");scanf("%s",str);printf(出力)とgets(入力)printfは文字列を出力(表示)する関数で、getsは文字列を入力する関数。コマンドラインのプログラムでは、入力と出力が主な操作になる。printfでは、フォーマットされた書式で変数の内容を表示できる。数値型の変数には%dを使用する。x);getsは入力用の関数で、1行分の文字列を入力するが、本当は使ってはならない。バッファオーバーランを防ぐことができないからである。getsは文字列の代入にポインタを指定するが、データのサイズを指定する引数がないため、ポインタが指す配列のサイズ以上の文字を代入されてしまうとセキュリティホールが発生する。よって、サンプルとしてのみ用いるだけで、実際には使うべきではない。scanfについても同様にバッファオーバーランの問題があるが、scanfの場合は文字幅指定で回避できる。した場合、fgetsをgetsやscanfの代替として用いることができる。Wikipedia入出力関数について詳細はLinux(システムコール・API)を参照のこと。バッファオーバーフローを起こす主な関数C言語の入出力関数は、入力系の関数でバッファオーバーフローを起こす可能性があるので気を付けよう。Handbookに、バッファオーバーフローを起こす危険性のある主な関数の一覧があります。sprintf()は使うべきでありません。Handbookそのほか、FreeBSDの各種ハンドブックはUNIXのプログラマにとっていい文書だと思うので、参考になさってください。Handbookブロック文と制御フローifとswitchif文は条件式に応じてコードの現在位置を分岐したり、「ある条件が満たされる場合にのみ処理を行う」といったことができる。elseで複数分岐できる。b;処理が二行以上になる時は{}を使う。ifによってさまざまな条件を選択することができる。...}switch-case文を使うこともできる。変数の値によって別のコードを実行できる。どの値でも無かった時のためにdefaultを最後に実行することが多い。case文を実行することもできる。プログラミング入門者向けサイトを参照のこと。forとwhileforは繰り返し。ある条件が満たされる間、同じ処理を繰り返すことができる。if文と組み合わせて使うことも多い。n;は繰り返しの条件文(条件を満たさなくなれば繰り返しをやめる)、i++は繰り返しがひとつ終わったらそのたびにすることを示している。処理が二行以上になる時は{}を使う。...}forの他にwhile文を使うことも多い。()の括弧内には条件文だけを記述する。...}while文では、繰り返しを続けるための条件だけを()内に記述する。そのため、どこかで繰り返しを終えるようにコードを書かなければならない。for文やwhile文では、コード内にbreak;を記述することで繰り返しを終えることも出来る。continue;を記述することで、次のループを実行することもできる。これとは違った繰り返し文として、do-while文を使うこともできる。do-while文では、まず最初に文が実行され、その後に条件式を評価し、条件式が真ならば次の繰り返しが実行される。繰り返しの前に文が実行される(do)、という点が違う。gotogotoはジャンプ命令で、ラベルのある場所にジャンプする。gotoを多用すると、分かりづらく保守しづらいプログラムになることが多く、カーニハン&リッチーの「プログラミング言語C」でも推奨されていない。多くは関数と条件分岐で代用できる。以下のように2つ以上のループから抜け出すような場合には、gotoは例外的に有用である。exit();if文やwhile文の中に関数を入れるまた、「その関数が正常終了した時に、さらに処理を続ける」といった場合に、if文の中に関数を入れ子構造にして入れることもある。if文だけではなくwhile文などでも同じことをする。メッセージループX11やWindowsのGUIプログラミングなどでは、メッセージループと呼ばれる、GUIアクションのイベントメッセージをwhileなどのループで回し、イベントに応じてswitch文などでメッセージ処理を行うことがある。この時、ループの中ではイベントメッセージが何か送られてくるまで待機し、送られてきた状況とそのメッセージに応じてさまざまな処理を振り分ける。グローバル変数とgotoは使わないグローバル変数とは、関数の中のローカルスコープに定義されたローカル変数ではなく、関数の外のグローバルスコープに定義された、全ての関数からアクセスできる変数のこと。初心者がやりがちなこととして、グローバル変数とgotoを使うのは良くない。関数や引数、オブジェクト指向のクラスやインスタンスを使うことで、手続き型すぎるのではなく、オブジェクト指向や関数型プログラミングのようなプログラミングを行うことを心がけよう。カウントが0から始まるのかC言語でカウントが0から始まる理由は、ポインタを操作する際にメモリアドレスの数が+0から始まるからです。最初の要素はメモリアドレス+0、次の要素はメモリアドレス+1となるため、カウントは0から始まった方が都合が良いのです。配列の添え字が0から始まるのも同様の理由です。i)はp[i]としてアクセスできます。ひとつの理由として、二進数が0000から始まる、というのがある。0001から始まるよりも、0000から始まった方が、コンピュータとして表現・利用しやすいことがある。ある意味、「C言語ハッカーのジョーク的慣習」のようなところもある。「プログラミング言語C」より引用。pop();などと呼び出す。main関数自体ではスタック変数に直接触らない、というのが重要である。C言語では、原則プログラムの実行は「main」と名付けられたmain関数から始まる。APIなどでは異なる場合もある。func(100);のように呼び出す。このように、returnを使って返り値を返すことで、実行結果を呼び出し元に返すことができる。C言語でサブルーチンが「関数」と呼ばれるのは、return文があるからである。計算結果を返す目的だけではなく、特定の処理をサブルーチンにして「汎用的に操作したい」時にも、return文を使うことができる。関数を「自動の実行処理」として使うreturnと引数を上手く使うことで、「自動の実行処理」を上手く作ることができる。後述するポインタを引数の中で使うことで、さまざまなサブルーチンを抽象化されたアルゴリズムとして記述することができる。関数とは自動の実行処理である。UNIXのprintfなどの関数では、「ストリーム」という考え方で、まるで「変数が関数の中を通り抜ける」ように関数を記述することができる。後日注記:バグを無くすという点から見ても、注意深くコアの関数を実装して、あとはその関数を呼び出す形でプログラムを記述することで、「絶対に動く」という信頼性の向上につながる。逆に関数にする必要が無いのに関数をむやみに作っていると、相互依存性の問題から破綻することがある。さまざまな場所に処理が分散すると、いざそれを書き直そうと思った時に保守できないこともあるため、バランスが必要である。returnと同じことを引数のポインタでやる同じことは、ポインタを使うことでも実現できる。引数に構造体のポインタを与えて、関数の中でポインタの指す構造体データを操作することが出来る。特定のデータを参照だけをする場合もあれば、特定のデータを書き換える場合もある。これによって、複数のデータをひとつの構造にした構造体を操作・処理するたくさんのメソッドを作ることが出来る。LinuxカーネルやWindowsプログラミングで、構造体のポインタを使う場合が多い。これはオブジェクト指向にも良く似ていて、Pythonなどでは第一引数に「self」と呼ばれる自分自身を指す参照名を定義し、self.valやself.func()のようにメンバ変数やメソッドにアクセスする。C言語でオブジェクト指向を実現したい場合は、場合によってGTK+などで使われているGLibというライブラリを使うこともできるし、C++で書くこともできる。関数は汎用的に作り、使おう関数は出来るだけ汎用的に作ろう。同じ関数を使いまわしたり、繰り返し使うことが出来たら、それは一段階上のプログラミングが出来ている。他人の書いた関数の機能を理解するために他人の書いた関数の機能を理解するためにどのようにするか。Reading」では以下のようにすることが多いと記述されている。(プレミアムブックス版)より引用。)モジュール化とプリプロセッサライブラリまた、単独のプログラムではなく、外部からサブルーチンを呼び出して実行する「ライブラリ」と呼ばれる受動的なプログラムを作って使うこともできる。ライブラリを使う時は、使いたい関数の宣言の書かれたヘッダファイルを#includeして読み込む必要がある。ヘッダファイルには、実装とアルゴリズムは書かれていないが、関数の宣言だけが書かれている。y);のような形である。<stdio.h>とコードの一番最初に書くことで、コードの中でprintfやgetsのような関数を使うことができるようになる。「stdio」は「標準入出力(スタンダードIO)」の意味である。C言語の関数には、「関数を使う前にその関数が記述されていなければならない」というルールがある。先のヘッダファイルには、前述したような「関数のプロトタイプ宣言」が記述されている。関数を使う前の準備として、このプロトタイプ宣言が記述されていれば、C言語ではそれ以降の記述で関数を使うことが出来る。ヘッダファイルは、このプロトタイプ宣言が記述されたファイルである。ヘッダファイルを#includeすることで、関数をそのファイルの中でいつでも使うことが可能になる。後日注記:関数だけではなく、構造体や自分で作ったデータ型なども、ヘッダファイルに書いて読み込む形式にすることが多い。基本的に、別のファイルに記述された関数や型を実行するためには必ずプロトタイプ宣言が必要。実際には同一ファイルに記述された関数であっても、順番を気にしなくて必要が無いという理由からプロトタイプ宣言を記述したり、ヘッダファイルをincludeすることが多い。プリプロセッサプリプロセッサには、#define、#ifdef~#else~#endif、#if~#elif~#else~#endif、#include、#error、#warning、#pragmaなどがある。これはコンパイル前にプリプロセッサによって処理されて純粋なC言語のソースコードに変換される。基本的に#define(定義)、#ifdef(定義されているかどうか)、#include(別ファイルを含む)を知っていれば良い。これらは、主にWindowsとLinux向けのコードを分けて書くことでクロスプラットフォームに対応したり、ある種の定数(変数展開せずマクロで使いたい場合など)のように使うことが多い。*);のようにプロトタイプ宣言を行う。オブジェクト指向のようなインターフェースは用意されない。データを破壊しないように気を付けて使おう。以上は以下のサイトからの引用。60;ポインタの先にある構造体のメンバは、「->」でアクセスできる(下を参照のこと)。オブジェクト指向のクラスとメソッドは、要はこの構造体の「.」を、構造体を作るのと同じように、同一インスタンスでのメンバ関数とメンバ変数の共有に応用したものである。printf("\n");}typedefを用いて型名を宣言することで、独自の型を宣言して、structをつけなくてもその型の変数を宣言できるようになる。C言語ではFILE型などがこれに当たる。C++ではクラス名を宣言することでオブジェクトの型となるクラスを宣言できる。(プレミアムブックス版)を参考に執筆しました。Readingによれば、Cプログラムの構造体には以下の用法がある。・まとめて操作されるデータ要素をグループ化する・関数から複数のデータ要素を返す・リンクデータ構造を作る・各種の装置やネットワークリンク、記憶媒体などのデータ構造をマッピングする・抽象データ型を実装する・プログラムをオブジェクト指向のスタイルで作成する特に、データ構造のマッピングは、ネットワークや2次記憶装置とデータをやりとりしたり、プログラムからハードウェアを直接操作したりするとき、その外部媒体のデータ構造を実現するために構造体がよく用いられる。Cでオブジェクト指向Cでオブジェクト指向は出来ないというのが通説だが、GTK+などでは、Cによるオブジェクト指向のライブラリであるGLibなどを使って、Cでもオブジェクト指向を行うことが出来る。ポインタポインタポインタ:ポインタは変数のメモリアドレスの入った変数であり、*pはポインタの先の変数の値、&xは変数のアドレスを指している。456;printf("%d",x);この例では、456と表示される。xに456がポインタを介して代入されている。ポインタと変数のアドレス普通、変数は宣言されるごとに、新しい領域に変数のデータが確保されます。zを順に次々に宣言すると、xとyとzはそれぞれ、別々の領域に変数が作られます。これは、それぞれの場所に値を確保したいような、「値型の変数」では問題ありません。「参照型の変数」とも呼ばれますが、ポインタを使うことで、「同じ場所(アドレス)にある別の名前の変数」を参照できます。これは、たとえばデータ構造のように、「プログラムの中で、別の名前でも同じアドレスの変数を参照したい」時に使えます。リストのようなデータ構造では、「リストに連結された次のデータ」を参照するために、ポインタを使います。ポインタを応用することで、同じアドレスを関数の内部(呼び出し先)と外部(呼び出し元)で共有することもできます。した「データの共有」という考え方が、ポインタによって行えます。「変数のアドレス」という考え方で、同じ場所にあるデータを「共有」し、「指し示す」という考え方が、ポインタです。先の連結リストの例のように、ポインタを上手く使うことで、「データ構造の中に別の変数のアドレスを含める」といったようなことができます。ある場所にある変数を、別の場所から操作できるのです。したことができるのは、変数が単なる数値ではなく、「メモリアドレス上のデータ領域」であるためです。C言語では変数にその変数が位置するメモリアドレスでアクセスすることができます。(プレミアムブックス版)を参考に執筆しました。Readingによれば、Cプログラムのポインタには以下の用法がある。ポインタは内部的にはメモリアドレスで表現されることから、ポインタを使ってハードウェア固有のメモリ領域にアクセスする低レベルコードがよくみられる構造体のポインタ構造体のポインタは->でアクセスできる。1;構造体のポインタを上手く使うことで、関数への引数から同じ構造体を操作することができる。これにより、簡単な変数の保持と共有ができる。どの関数からも同じデータを使いたい時は、構造体のポインタを使う。C++/Javaのオブジェクト指向は、構造体に関数ポインタを関連付けて、どの関数からも同じ構造体のデータ(構造体のポインタ)にアクセスできるようにしたもの、だと考えることができる。ポインタを操作する関数C言語では、ファイルポインタのように、構造体へのポインタを関数に渡す、という手法を多用する。Windowsなどで、ポインタを操作する関数というのはたくさん存在し、ポインタを返す関数もたくさんある。ファイルなどシステムのデータを参照する時に、ポインタを返す関数を使い、ハンドラなどを関数に渡すことが多い。構造体のポインタを関数に渡すのは半ば慣例化していて、Linuxカーネルなどでも、ポインタを関数に渡すことが通例になっている。関数の内部でポインタのデータを操作することができる。高度なプログラミングとして、ポインタをインクリメント(++で繰り返し値を増やしていく)して関数ポインタを操作したり、構造体などで関数ポインタのようなものを列挙したりすることで、汎用的なプログラミングを行うことが出来る。ポインタは「データの在り処」C言語で出てくる「ポインタ」は、さまざまな関数処理を行うための、「データの在り処」だと考えましょう。Cでは、ファイルポインタFILE*など、とにかくポインタがたくさん出てきますが、基本的にそれらは、ファイルの読み書き位置やデータへのアクセスを許すものであり、要は「データの在り処」です。実際のプログラミングでは、ポインタを返す関数というのは良く使われる。このようなコードがよく出てくる。next_block();こうしたポインタと関数の使い方をすることで、open()のようにシステムで確保したデータ領域を保持したり、何らかの処理を行った上で確保されたデータ領域へのアクセス手段を(別の関数でアクセスするために)保持し続けることができる。ポインタを返す関数を作る時は、変数の寿命に注意すること。関数内で宣言されたローカル変数の「値」を返すのは問題ないが、「アドレス」を返すのは駄目。ローカル変数として宣言された変数は、関数が終わってしまえば削除されてしまうため、ローカル変数へのアドレスは関数が終わった時点でアクセスできなくなる。値の場合はコピーされて渡されるためこういう問題は無い。関数内で作った変数のアドレスを返したい時は、malloc()などを使うことが考えられる。-ファイル入出力FILE型のポインタ特に良く使うのは、FILE型のポインタである。ファイルを操作する入出力の処理ができる。グレープシティ株式会社より、引用して一部自分で修正。)このようにすることで、ファイルの読み書き情報をどの関数でも参照・変更することができる。ちなみにファイルオフセットの位置を変えるには専用の関数lseek()が存在するので、このようにptrメンバを手動で編集する必要はない。ファイルオープンとエラー処理C言語では、ファイルオープンは以下のようになる。追加読み書きができる。これにbが付いている場合("rb"など)はバイナリファイルを表す。オープン処理のいろいろな書き方より編集して引用。)このように、必ずファイルのオープン処理を行う時はエラー処理をしなければならない。共用体と列挙型union(共用体)Cの共用体(union)は、同じ記憶域を共有する複数の項目をひとつにまとめたもの。Cの共用体には以下のような用途がある。(プレミアムブックス版)を参考に執筆・引用しました。)enum(列挙型)enumは列挙型と言われるもので、値を列挙してそれぞれに数値を割り振ることで、複数の値を格納する「列挙スタイルの型を作る」ことができる。PIG;動的なメモリ管理mallocとfreemalloc()を使うと、静的な変数へのメモリ割り当てだけではなく、動的に変数にメモリを割り当てることができる。malloc()で確保したメモリは、使用後に必ず手動でfree()関数で解放しなければならない。パソコン活用研究C&C++であそぼにサンプルコードがある。malloc関数について|teratailを参考に自分でコードを記述。5);のように、配列のサイズを指定したmalloc()関数を実行し、その返り値を型キャストして配列のポインタに代入する。)動的なメモリ割り当てmalloc()で動的に確保した配列は、ポインタに代入して操作し、実行時に配列のサイズが決められない。このため、「どれくらいのサイズになるか分からない」変数を扱うために使用できる。途中で配列のサイズを変更したい場合はrealloc()を使う。malloc()で確保した変数はヒープ領域に保管され、スコープを脱出しても削除されない。このため、さまざまな変数から共通してアクセスするような「共有データ」のために使用できる。使い終わった後はfree()で解放しなければ、メモリリークが起きる。関数ポインタ関数ポインタ関数ポインタを使うことで、関数をポインタとして変数に格納できる。構造体や配列に格納したり、引数として関数ポインタを使うことも可能。Linuxで遊ぼうにサンプルコードがある。以下は上記サイトを参考に自分でコードを記述。何かと良く使われる、スタックとキューについて。スタックでは、最後に入れたデータが一番最初に取り出される。上へとどんどん積んでいって、上から取り出されるイメージである。タが一番最初に取り出される。左から右へと突っ込んでいって、右から取り出されるイメージである。(C言語:アルゴリズムとデータ構造)を参考に執筆しました。)配列とリスト配列とリストの違いは、配列は連続した領域に変数の列を格納するのに対し、リストは前後のデータのある位置をメモリーに入れておく。(C言語:アルゴリズムとデータ構造)を参考に執筆しました。)アルゴリズムとデータ構造アルゴリズムとデータ構造を参照のこと。ライブラリ標準CライブラリCの標準ライブラリ。Linuxではglibcが使われるが、Windowsや*BSDなどではそれぞれの実装を利用する。使うのは入出力ライブラリの中のprintf()など。入力ライブラリでは安全性とセキュリティに注意(誤ってポインタに変数の大きさ以上の入力を入れないこと)。以下のようなサイトから標準Cライブラリのヘッダ一覧を参照できます。cppreference.comを参考に執筆・引用しました。Library)のpthread_create()という関数を使う。スレッドと排他処理サンプルコードロボット以下は自分の作ったロボットのコード。テレビやパソコンは、機械だ。テレビやパソコンは、生き物ではない。テレビって何なのだろう。テレビとパソコンは好きだ。テレビとパソコンは嫌いだ。比較すると、テレビの方が普通だ。比較すると、パソコンの方が普通だ。テレビよりパソコンの方が普通かな。パソコンよりテレビの方が普通かな。