コンテンツにスキップ

プログラミング/C言語

出典: フリー教科書『ウィキブックス(Wikibooks)』

C言語の起源と意義

[編集]

C言語は、1972年にBell研究所のDennis RitchieによってUNIXオペレーティングシステムの開発のために生み出されたプログラミング言語です。システムプログラミングと低レベルハードウェア制御における最も重要な言語の一つとして、今なお多くのソフトウェアの基盤となっています。

メモリと基本的な型

[編集]
#include <stdio.h>
#include <stdint.h>

int main() {
    // 基本的な型
    int whole_number = 42;                  // 整数
    float decimal_number = 3.14159f;        // 単精度浮動小数点数
    double precise_number = 3.14159265358; // 倍精度浮動小数点数
    char letter = 'A';                      // 文字
    _Bool is_true = 1;                      // ブール値(C99以降)

    // 明示的なサイズ指定の型
    int8_t tiny_int = 127;         // 8ビット符号付き整数
    uint32_t large_unsigned = 4294967295; // 32ビット符号なし整数

    // ポインタと参照
    int *ptr = &whole_number;      // ポインタ
    int value = *ptr;              // ポインタが指す値の参照

    return 0;
}

配列と文字列の操作

[編集]
#include <stdio.h>
#include <string.h>

void string_and_array_example() {
    // 配列の宣言と初期化
    int numbers[5] = {10, 20, 30, 40, 50};
    char name[50] = "プログラマ";

    // 文字列操作
    char greeting[100] = "こんにちは、";
    char name_copy[50];

    // 文字列連結
    strcat(greeting, name);
    
    // 文字列コピー
    strcpy(name_copy, name);

    // 配列の走査
    for (int i = 0; i < 5; i++) {
        printf("numbers[%d] = %d\n", i, numbers[i]);
    }
}

動的メモリ管理

[編集]
#include <stdio.h>
#include <stdlib.h>

void dynamic_memory_example() {
    // 動的メモリ確保
    int *dynamic_array = malloc(10 * sizeof(int));
    if (dynamic_array == NULL) {
        perror("メモリ確保に失敗しました");
        exit(1);
    }

    // メモリの初期化
    for (int i = 0; i < 10; i++) {
        dynamic_array[i] = i * 10;
    }

    // メモリの解放
    free(dynamic_array);
}

ポインタと関数

[編集]
#include <stdio.h>

// 参照渡しによる関数
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 関数ポインタ
int calculate(int x, int y, int (*operation)(int, int)) {
    return operation(x, y);
}

int add(int a, int b) {
    return a + b;
}

int multiply(int a, int b) {
    return a * b;
}

int main() {
    int x = 10, y = 20;
    swap(&x, &y);
    printf("x = %d, y = %d\n", x, y);

    // 関数ポインタの使用
    int result1 = calculate(5, 3, add);
    int result2 = calculate(5, 3, multiply);

    printf("加算結果: %d\n", result1);
    printf("乗算結果: %d\n", result2);

    return 0;
}

構造体と共用体

[編集]
#include <stdio.h>

// 構造体の定義
struct Person {
    char name[50];
    int age;
    float height;
};

// ビットフィールドを使用した構造体
struct Flags {
    unsigned int is_active : 1;
    unsigned int is_admin : 1;
    unsigned int permission_level : 4;
};

// 共用体
union Data {
    int integer;
    float floating;
    char character;
};

int main() {
    // 構造体の使用
    struct Person student = {"田中", 20, 175.5};
    printf("名前: %s, 年齢: %d\n", student.name, student.age);

    // ビットフィールドの使用
    struct Flags user_flags = {1, 0, 7};

    // 共用体の使用
    union Data data;
    data.integer = 42;
    printf("整数値: %d\n", data.integer);
    
    data.floating = 3.14f;
    printf("浮動小数点値: %f\n", data.floating);

    return 0;
}

ファイル入出力

[編集]
#include <stdio.h>
#include <stdlib.h>

void file_io_example() {
    // ファイルへの書き込み
    FILE file = fopen("example.txt", "w");
    if (file == NULL) {
        perror("ファイルを開けません");
        exit(1);
    }
    
    fprintf(file, "こんにちは、C言語の世界\n");
    fclose(file);

    // ファイルからの読み込み
    file = fopen("example.txt", "r");
    if (file == NULL) {
        perror("ファイルを開けません");
        exit(1);
    }

    char buffer[100];
    while (fgets(buffer, sizeof(buffer), file)) {
        printf("読み込んだ内容: %s", buffer);
    }

    fclose(file);
}

マクロとコンパイル時処理

[編集]
#include <stdio.h>

// 単純なマクロ
#define PI 3.14159
#define MAX(a, b) ((a) > (b) ? (a) : (b))

// 条件付きコンパイル
#ifdef DEBUG
    #define LOG(x) printf("デバッグ: %s\n", x)
#else
    #define LOG(x)
#endif

int main() {
    double radius = 5.0;
    double area = PI * radius * radius;

    int x = 10, y = 20;
    printf("最大値: %d\n", MAX(x, y));

    LOG("テスト実行中");

    return 0;
}

C言語の適用領域

[編集]

C言語は以下の分野で特に重要な役割を果たしています:

  • オペレーティングシステム開発
  • 組み込みシステム
  • デバイスドライバ
  • システムプログラミング
  • 高性能コンピューティング

まとめ

[編集]

C言語は、その直接的なハードウェア制御能力と効率的な実行性能により、コンピュータサイエンスの基盤を形作ってきた言語です。低レベルな制御から高度な抽象化まで、プログラマに強力な表現力を提供します。現代のソフトウェア開発において、その重要性は依然として高く評価されています。