C言語入門:基本概念を超シンプルに解説!

 2023.05.28  株式会社システムインテグレータ

 

C言語とは

C言語は、汎用性が高く、高速なプログラムが作成できるプログラミング言語です。その特徴から、オペレーティングシステムや組み込みシステムなど多くの分野で使用されています。C言語は1972年に開発され、以降現代の多くのプログラミング言語の基礎となっています。

本記事では、C言語がどんなものか知りたい人に向けて、基本的な内容をシンプルに解説します。
Business woman typing on keyboard with global system concept

基本構文

まず、基本的な例文をつかって解説します。以下は、"Hello, World!"と表示する簡単なプログラムです。

#include <stdio.h>

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

 ※実行結果

Hello, World!

プログラムの先頭では、ヘッダー・ファイルを読み込んでいます。「stdio.h」はC言語の標準ライブラリで、ここではprintf関数を使用するために必要です。

 次にmain関数が記述されています。C言語のプログラムはmain関数から実行を開始します。

この例では、printf関数を使って「Hello, World!」というメッセージを表示しています。return 0;」は、プログラムが正常に終了したことを示す一般的な慣習です。

上記例文では使用されていませんが、変数を使用する場合は、以下のように変数宣言や代入を行います。

//int型の変数宣言
int num;

 //代入
num = 10;

 //変数宣言と代入を同時に行う
int num2 = 20;

演算子

C言語には、いくつかの演算子があります。

  • 算術演算子(+-*/%
  • 比較演算子(==!=><>=<=
  • 論理演算子(&&||!

これらを組み合わせて複雑な式を記述できます。以下のプログラムでは、算術演算子を使って二つの整数の和、差、積、商、余りを計算し、表示します。 

#include <stdio.h>

int main() {
    int a = 10;
    int b = 3;
    printf(": %d\n", a + b);
    printf(": %d\n", a - b);
    printf(": %d\n", a * b);
    printf(": %d\n", a / b);
    printf("余り: %d\n", a % b);
    return 0;
}

 ※実行結果

: 13
: 7
: 30
: 3
余り: 1

制御構造(if文)

if文は条件分岐を行うための構文で、「if (条件) {処理;}」の形で記述します。以下は、比較演算子を使って整数が正・負・ゼロのいずれであるかを判定するプログラムです。変数numは、宣言時にゼロが代入されているため、実行結果は「ゼロです。」と表示されます。

#include <stdio.h>

 int main() {
    int num = 0;
    if (num > 0) {
         printf("正の数です。\n");
    } else if (num < 0) {
         printf("負の数です。\n");
    } else {
         printf("ゼロです。\n");
    }
    return 0;
}

※実行結果

ゼロです。

制御構造(for文)

for文は繰り返し処理を行うための構文で、「for (初期化; 条件; 更新) {処理;}」の形で記述します。以下は、1から10までの整数を表示するプログラムです。ここでは、printf関数の中で改行コードを表す「\n」がないため、値は改行されずに出力されます。

#include <stdio.h>

int main() {
    for (int i = 1; i <= 10; i++) {
         printf("%d ", i);
    }
    return 0;
}

※実行結果

1 2 3 4 5 6 7 8 9 10

配列

配列は、同じデータ型の複数の変数を連続的に格納するためのデータ構造です。
宣言は、「型 配列名[要素数];」、値の代入は「型 配列名[要素数] = {1, 2, ...};」、アクセスは「配列名[インデックス]」で行います。以下のプログラムでは、配列に5つの整数を代入し、その要素を表示しています。

#include <stdio.h>

 int main() {
    int numbers[5] = {1, 2, 3, 4, 5};
    for (int i = 0; i < 5; i++) {
         printf("%d ", numbers[i]);
    }
    return 0;
}

※実行結果

1 2 3 4 5

関数

関数は処理をまとめたものです。
定義は「戻り値の型 関数名(引数1, 引数2, …) {処理; return 戻り値;}」、呼び出しは「関数名(引数1, 引数2, …);」の形で記述します。関数を使うことでコードの再利用性や可読性を向上させることができます。以下は、二つの整数の最大公約数を求める関数を定義し、呼び出すプログラムです。

#include <stdio.h>

 int gcd(int a, int b) {
    while (b != 0) {
         int temp = a % b;
         a = b;
         b = temp;
    }
    return a;
}

 int main() {
    int a = 56;
    int b = 98;
    printf("最大公約数: %d\n", gcd(a, b));
    return 0;
}

 ※実行結果

最大公約数: 14

 注意点として、関数は使用する前に定義しておく必要があります。上の例文では、関数gcdを、main関数の後に記載すると、エラーになります。

ポインタ

ポインタは、変数のアドレス(メモリ上の位置)を保持する特殊な変数です。ポインタを使うことで、関数間で変数を共有したり、動的なメモリ確保を行ったりできます。
ポインタ変数は、「型 ポインタ名;」で宣言し、アドレスを代入する際は、「&」演算子を使います。アドレスを参照するには、「*」演算子を使います。

 以下のプログラムでは、ポインタを使って2つの整数を入れ替える関数を実装し、呼び出しています。

#include <stdio.h>

 // swap: 二つの整数の値を入れ替える関数

void swap(int *a, int *b) {
    int temp = *a; // *a の値(aが指すアドレスの値)を temp に代入
    *a = *b;     // *b の値(bが指すアドレスの値)を *a に代入
    *b = temp;     // temp の値を *b に代入
}

 int main() {
    int x = 10;
    int y = 20;

     printf("Before swap: x = %d, y = %d\n", x, y); //swapする前のx,yを出力
    swap(&x, &y); // xyのアドレスをswap 関数に渡す
    printf("After swap: x = %d, y = %d\n", x, y); //swapした後のx,yを出力

    return 0;
}

 ※実行結果

Before swap: x = 10, y = 20
After swap: x = 20, y = 10

 C言語では、このポインタが利用できることが大きな意味を持っています。ポインタを使うことで、メモリを柔軟に操作することが可能だからです。しかし、メモリの構造をよく理解しないと複雑なプログラムになってしまうため、C言語を学ぶ際にはメモリ構造も必ず理解しておきましょう。

構造体(struct)と共用体(union)

構造体は、異なる型の変数をまとめたデータ構造で、「struct 構造体名 {型 変数名; ...};」で宣言します。共用体は同じメモリ領域を共有する異なる型の変数を格納するデータ構造で、「union 共用体名 {型 変数名; ...};」で宣言します。

 以下は、構造体と共用体の宣言の例です。

//構造体の宣言例
struct Student {
    int id;
    char name[30];
    float score;
};

 

//共用体の宣言例
union Data {
    int intValue;
    float floatValue;
    char str[20];
};

ファイル操作

C言語では、ファイルを操作するための関数が提供されています。

  • fopen関数でファイルを開き、
  • fscanffprintfで読み書きを行い、
  • fcloseでファイルを閉じます。 

以下の例は、テキストファイルから整数を読み込み、その数値を2倍した値を別のファイルに出力するプログラムです。

#include <stdio.h>

 int main() {
    FILE *input = fopen("input.txt", "r");
    FILE *output = fopen("output.txt", "w");

    int num;
    fscanf(input, "%d", &num);
    fprintf(output, "%d\n", num * 2);

    fclose(input);
    fclose(output);
    return 0;
}

※実行結果

// input.txt の内容
100
// output.txt の内容
200

標準ライブラリ

C言語には標準ライブラリが提供されており、様々な便利な関数を利用できます。

標準ライブラリを利用することで、複雑なプログラムも簡単に作成できます。そのため、積極的に活用しましょう。

主なライブラリとして、以下のようなものがあります。

ライブラリ名

内容

stdio.h

標準入出力関数、ファイル操作関数

string.h

文字列操作関数

math.h

数学関数

time.h

時間と日付の操作関数

stdlib.h

動的メモリ管理関数、一般的なユーティリティ関数

errno.h

エラー番号とその説明

assert.h

アサーション関数

locale.h

地域情報に基づく文字列操作関数、地域設定関数

ctype.h

文字型に関する情報を提供する関数

まとめ

今回紹介した内容は、C言語の基本的な部分に過ぎません。オンラインリソースや書籍を活用して、さらに深く学んでみてください。 

また、C言語から派生したいくつかのプログラミング言語(C++C#Objective-Cなど)もあります。興味のある方は合わせてチェックしてみると良いでしょう。

C#ってどんな言語?|その特徴と学習メリット
https://products.sint.co.jp/topsic/blog/csharp-language-overview

C++はどんな言語?C言語との違い、特徴から勉強方法までわかりやすく解説
https://products.sint.co.jp/topsic/blog/c-plus

 


RELATED POST関連記事


RECENT POST「プログラミング」の最新記事


プログラミング

PostgreSQLとは?特徴やほかのデータベースとの違いを解説

プログラミング

アルゴリズムとは?意味や具体例、代表的なアルゴリズムの種類などを紹介

プログラミング

【初心者向け】JSONとは?データ形式の基礎や書き方、使用例などを解説

プログラミング

サーバーサイドエンジニアとは? 仕事内容や年収、必要なスキル・知識を解説

C言語入門:基本概念を超シンプルに解説!

TOPSIC TOPへ