C言語は、1970年代初頭に開発された、非常に強力で効率的なプログラミング言語です。特にシステムプログラムや組み込みシステムの開発に使用されることが多いですが、非常に多くのプログラミングパラダイムをサポートしており、他の多くの高級言語の基盤ともなっています。この記事では、C言語の基本的な構文から、関数やポインタ、メモリ管理に至るまで、C言語を深く理解するために必要な情報を網羅的に解説します。
1. C言語の基本構文
C言語のプログラムは、通常、以下の基本的な構造を持ちます:

c#include // 標準入出力ライブラリのインクルード
int main() { // メイン関数の定義
printf("Hello, World!"); // 文字列を画面に表示
return 0; // プログラムの終了を示す
}
このコードは「Hello, World!」と画面に表示する非常にシンプルなプログラムです。ポイントは、C言語のプログラムは必ず main
関数から実行が始まるという点です。
2. 変数とデータ型
C言語には、整数型、浮動小数点型、文字型など、多くの基本的なデータ型が用意されています。変数は、これらのデータ型を使ってメモリ内にデータを格納します。
c#include
int main() {
int a = 10; // 整数型の変数a
float b = 3.14; // 浮動小数点型の変数b
char c = 'A'; // 文字型の変数c
printf("a = %d\n", a); // 整数型変数の表示
printf("b = %.2f\n", b); // 浮動小数点型変数の表示
printf("c = %c\n", c); // 文字型変数の表示
return 0;
}
int
は整数型を表し、float
は浮動小数点型、char
は文字型を表します。- 変数には初期値を代入することができ、
printf
関数を使って値を表示します。
3. 演算子
C言語では、さまざまな演算子を使って変数に対して計算を行います。主な演算子には以下のものがあります:
- 算術演算子:
+
、-
、*
、/
、%
(余り) - 比較演算子:
==
(等しい)、!=
(等しくない)、<
(より小さい)、>
(より大きい) - 論理演算子:
&&
(論理積)、||
(論理和)、!
(論理否定)
c#include
int main() {
int a = 5, b = 10;
printf("a + b = %d\n", a + b); // 加算
printf("a * b = %d\n", a * b); // 乗算
printf("b % a = %d\n", b % a); // 剰余
return 0;
}
4. 条件分岐
C言語では、if
文を使用して条件に基づく分岐を行います。複数の条件を評価したい場合は、else if
を使い、最終的にすべての条件が満たされない場合は else
が使われます。
c#include
int main() {
int x = 20;
if (x > 10) {
printf("xは10より大きい\n");
} else {
printf("xは10以下\n");
}
return 0;
}
このプログラムでは、x
が 10 より大きいかどうかを判定し、それに応じたメッセージを表示します。
5. ループ構文
C言語には、繰り返し処理を行うための for
、while
、do-while
ループがあります。
forループ
c#include
int main() {
for (int i = 1; i <= 5; i++) {
printf("i = %d\n", i); // 1から5までの数を表示
}
return 0;
}
whileループ
c#include
int main() {
int i = 1;
while (i <= 5) {
printf("i = %d\n", i); // 1から5までの数を表示
i++;
}
return 0;
}
do-whileループ
c#include
int main() {
int i = 1;
do {
printf("i = %d\n", i); // 少なくとも1回は表示
i++;
} while (i <= 5);
return 0;
}
6. 関数
C言語では、再利用可能なコードを作成するために関数を使用します。関数は、特定のタスクを実行する一連の命令をまとめたもので、引数を取って結果を返すことができます。
c#include
int add(int a, int b) { // 関数の定義
return a + b;
}
int main() {
int sum = add(3, 4); // 関数を呼び出す
printf("3 + 4 = %d\n", sum); // 結果を表示
return 0;
}
この例では、add
関数が2つの整数を加算し、その結果を返します。
7. ポインタ
C言語の強力な特徴の1つは、ポインタを使用してメモリを直接操作できることです。ポインタは、メモリのアドレスを格納する変数です。
c#include
int main() {
int a = 10;
int *ptr = &a; // ポインタptrがaのアドレスを指す
printf("aの値: %d\n", a); // 変数aの値
printf("ptrが指す値: %d\n", *ptr); // ptrが指すアドレスの値
return 0;
}
このコードでは、ptr
が a
のアドレスを指し、そのアドレスを使って a
の値を間接的に操作します。
8. メモリ管理
C言語では、動的メモリ割り当てを行うために malloc
や free
といった関数を使用します。これにより、プログラム実行時に必要なメモリを確保し、使用後に解放することができます。
c#include
#include
int main() {
int *arr = (int*)malloc(5 * sizeof(int)); // 5個の整数分のメモリを確保
if (arr == NULL) {
printf("メモリの確保に失敗しました\n");
return 1;
}
for (int i = 0; i < 5; i++) {
arr[i] = i * 2; // 配列に値を代入
}
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]); // 配列の値を表示
}
free(arr); // メモリを解放
return 0;
}
このコードでは、malloc
を使ってメモリを確保し、使用後に free
を使ってそのメモリを解放しています。
9. 配列と文字列
C言語では、配列を使用して同じデータ型の複数の値を1つの変数に格納することができます。文字列は、文字の配列として扱われます。
c#include
int main() {
int arr[3] = {1, 2, 3};
for (int i = 0; i < 3; i++) {
printf("%d ", arr[i]); // 配列の値を表示
}
char str[] = "Hello, C!";
printf("\n文字列: %s\n", str); // 文字列を表示
return 0;
}
結論
C言語は非常に多くの機能を提供しており、低レベルのメモリ管理から高レベルの関数定義まで幅広く使用できます。シンプルで効率的なコードを書くことができ、他の多くのプログラミング言語の基盤にもなっています。理解するべきポイントは、変数の型、ポインタ、メモリ管理の重要性、そして効率的なループや条件分岐の使い方です。C言語を深く学ぶことで、プログラムの効率を最大化し、システムレベルでの操作にも強くなることができます。