初心者にも分かりやすくC言語の特徴と書き方を解説!

この記事のランク
読む時間3分
重要度

C言語は1972年にAT&Tベル研究所で開発された半世紀以上の歴史のあるポピュラーなプログラミング言語です。

元々はUNIXというOSを開発するために生まれた言語で、C言語で作られているシステムも多く、Python、Javaに続いて需要がある人気のプログラミング言語です。

この記事では、C言語で何ができるのか?をテーマに、Cの特徴を実際のソースコードを見ながらご紹介致します。

ななころ

Twitter(@nana_korobi04)でも情報発信していますので、
フォローいただけると嬉しいです!

目次

C言語でできること

C言語は汎用性が高いプログラミング言語で、以下のような様々なシーンで活用されています。

組み込み系システム

組み込み系システムはC言語が最も活用されている分野で、電子レンジやエアコンといった家電から、カーナビや自動車のコンピュータ部分ロボットなどハードウェアを司ることができます。

ななころ

制御系システムも呼ばれており、私たちの生活に密着したプログラミング言語といえますね。

IoT/AI

C言語はハードウェアに密着したプログラミング言語で、処理速度が速くかつ省電力で起動するため、物理的のリソースが限られているスマートウォッチや、大量のデータを処理するAIの開発に適しています。

コンピューターゲーム

C言語はシューティングゲームや横スクロールゲームといった簡単なコンピュータゲームを開発することができます。

現在のアーケードゲームや家庭用のコンシューマゲームはC言語を拡張したC++で作られていることもあり、C++を習得後、基礎の部分を学ぶためC言語を習得するゲームプログラマもいるようです。

C言語とC++の違い

C++は「シープラプラ」と読み、システム開発の現場では「シープラ」と略して呼ばれています。

C言語は手続き型言語と呼ばれ、ソースコードの上から順番に処理が流れていきますが、C++はJavaなどで採用されているオブジェクト指向を取り入れ、効率良く開発できるように改良されています。

また、C言語では文字や数字などデータの種類を指定しますが、C++はジェネリックプログラミングといって、データの種類を意識せずにコーディングすることができます。

C言語とC#の違い

C#はMicrosoft社がJavaをベースに開発したオブジェクト指向のプログラミング言語で、文法はC言語やC++と似ていますが、C言語やC++とは互換性がない全く異なる言語となります。

オブジェクト指向については下記の記事で詳しく解説していますので、是非ご参考にしてください!

C言語のはじめかた

C言語は、人間が書いたコードをコンピュータが処理できるように変換するコンパイラという環境が必要なプログラミング言語です。

C言語のコンパイラはMicrosoftが提供しているVisual Studioが有名ですが、会員登録が発生するため、今回はgccコンパイラという無償のものを使います。

1.「gccコンパイラ」のインストール

「gccコンパイラ」のインストール手順
STEP
cygwinのサイトにアクセス

下記のサイトにアクセスしてください。

あわせて読みたい
STEP
setup-x86_64.exeのダウンロード
STEP
インストールを進める

以下の手順でインストールを進めてください。

2.ソースコードを記載

これでC言語の開発環境の準備ができました。

それでは、実際にコードを書いてみましょう。

#include <stdio.h>

int main(){
printf("Hello\n");
return 0;
}

以下、1行づつ構文を解説していきます。

最初の1行目は、 #include(インクルード)と呼ばれる機能で、「stdio.h」というファイルを読み込んでいます。

stdio.hはヘッダーファイルと呼ばれ、汎用的に使う機能が予め用意されたC言語の標準ライブラリです。

stdio.hのヘッダーファイルを読み込むと、stdio.hに記述されている機能が使えるようになります。

次に、int main(){ 〜中略〜 }の部分ですが、これは関数と呼ばれる処理が一まとまりになったもので、他の言語ではサブルーチンと呼ばれることもあります。

「int」は扱うデータの種類を指定しており、この関数では処理の結果を整数(intenger)として返すという意味になります。

末尾に、return 0; という記述がありますが、これは「戻り値」や「リターンコード」といい、プログラムが問題なく終了したら”0”の整数を返します。

銀行のATMやスーパーのセルフレジなどで操作を誤ると、エラーコードが出たりしますが、あれもプログラムで異常が起きたら”0”以外の整数を返して、どの処理でエラー

中段の printf(“Hello\n”);は、printf()という予めstdio.hで用意された関数で、()の中にある「Hello」という文字を出力しています。

なお、文字は”(ダブルコーテーション)で囲い、コンピューターに文字列であることを認識させます。

また、「\n」は改行コードと呼ばれ、次の行に移るためのものです。

3.Cプログラムを実行

それでは実際にプログラムを動かしてみましょう。

C言語のプログラムを実行する際は、先ほどインストールしたgccコンパイラを使います。

Cプログラムの実行手順
STEP
cygwinの起動

cygwinを起動してください。

STEP
コンパイルの実行

コンソールに「gcc Hello.c」と入力してコンパイルを実行してください。

STEP
プログラムの起動

コンパイルエラーが出なければ、「./a.exe」と入力してプログラムを起動

cygwinのコンソールに「Hello」という文字が出力されましたでしょうか?

アドレスとポインタ

C言語はプログラミング言語の中でも、特に難易度が高いと言われていますが、その理由はアドレスとポインタという概念が分かりにくいことが理由です。

ポインタを簡単に表現すると、変数と呼ばれる値が入った箱のアドレス(コンピュータ上で値を格納しているメモリの場所)を取得します。

ポインタの何が良いのかというと、呼び出した変数の中の値を参照したり書き換えたりすることができます。

実際にプログラムを作って動きを見て理解してみましょう。

#include<stdio.h>

int main() {
int x;
x = 5;
printf("x=%d\n", x);
printf("&x=%p\n", &x);
int *p;
p = &x;
printf("p=%p\n", p);
printf("*p=%d\n", *p);
return 0;
}

上記のサンプルコードを先ほどのHello.cと同じ手順で実行して下さい。

出力結果とコードを照らし合わせながら解説していきます。

int x;
x = 5;


main関数の最初の2行は「x」というint型(整数を扱う型)の変数に”5”という値をセットしています。

printf(“x=%d\n”, x);

6行目のprintf()では、xの値を出力しています。

文字列の真ん中にある「%d」は、出力フォーマット指定子といい、変数の種類が整数なら「%d」、文字列なら「%c」など型に合わせた指定子を記述します。

printf(“&x=%p\n”, &x);

7行目のprintf()では、変数xの前に&が付いています。

これは変数のアドレス(住所)を参照するための「アドレス演算子」と呼ばれるものです。

出力フォーマット指定子の「%p」は、アドレスを表示させるためのもので、16進数で出力されます。

実行結果の1行目、2行目を比べてみましょう。

<実行結果>
x=5
&x=0xffffcc24

※「0xffffcc24」の部分がアドレスで、コンピューターによって異なります。

実行結果の1行目は、変数xにセットされた整数の”5”がそのまま出力されています。

実行結果の2行目は、変数xのアドレスが16進数で出力されています。

続いて、main関数の中の8〜9行目の記述を見てみましょう。

int *p;
p = &x;


8行目の「p」の前についている「*」は「間接演算子」と呼ばれ、変数にアドレスをセットするためのもので、間接演算子が付いた変数をポインタ変数と呼びます。

よって、9行目では「&x」で変数xのアドレスをポインタ変数pにセットしているということになります。

続いて、10~11行目の出力部分を見ていきましょう。

printf(“p=%p\n”, p);
printf(“*p=%d\n”, *p);


10行目ではポインタ変数のアドレスを「%p」で出力し、11行目では「%d」で整数を出力しています。

実行結果の3行目、4行目を見てみましょう。

<実行結果>
p=0xffffcc24
*p=5

※「0xffffcc24」の部分がアドレスで、コンピューターによって異なります。

注目すべきは、printf()「p」を指定すると変数xのアドレスが出力され、「*p」を指定すると変数xの整数が出力されている点です。

このように、ポインタ変数はアドレスを扱う場合は間接演算子”なし”、変数の中身を扱う場合は間接演算子”あり”、といった具合に使い分けを行います。

ポインタ変数の何が良いのかというと、ポインタ変数pはアドレスの情報しか持たないため、メモリの使用量が減るということです。

今回は「5」という1バイトの整数ですが、例えば変数xに100バイトのデータがセットされていた場合、ポインタではない変数pにセットしようとすると、+100バイト(合計200バイト)のメモリを使うことになります。

まとめ

C言語はアドレスとポインタを上手く使うことにより、メモリが抑えられ高速処理が実現できるということがお分かり頂けたかと思います。

他のプログラミング言語ではメモリを意識してコーディングする必要はありませんが、どんな言語でも変数を定義する際はメモリを使っているのです。

C言語を通してメモリ管理の重要性を理解し、他の言語でもメモリを抑えたコーディングが出来ることが優秀なプログラマと言えるでしょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次