C言語

【C言語】第6章第8回:構造体ポインタと動的メモリ確保

構造体ポインタを活用することで、動的メモリを効率的に管理できるようになります。この章では、構造体ポインタの基本と応用について学びます。

0. 記事の概要

この記事を読むメリット

  • 動的メモリ管理の理解:動的に構造体を作成・操作する方法を学べます。
  • 効率的なデータ操作:構造体ポインタを使った柔軟なデータ操作が可能になります。
  • 実践的な応用力:大規模なプログラムにおける効率的なメモリ使用法を習得します。

この記事で学べること

  • 構造体ポインタの基本的な操作
  • 動的メモリ確保の方法(mallocfree
  • 構造体ポインタを使った実践例

活用のイメージ

例えば、学生情報を管理するプログラムでは、必要に応じてメモリを動的に確保し、効率よくデータを扱うことが求められます。本記事を通じて、動的メモリ確保と構造体ポインタを使いこなす方法を習得しましょう。

1. 構造体ポインタの基本操作

1.1 構造体ポインタとは?

構造体ポインタは、構造体変数のアドレスを格納するポインタです。ポインタを使うことで、直接構造体データを操作できます。

1.2 構造体ポインタの基本例

#include <stdio.h>

// 学生情報を表す構造体
typedef struct {
    char name[50];
    int age;
} Student;

int main() {
    Student student = {"Alice", 20};
    Student *ptr = &student; // 構造体変数のアドレスをポインタに格納

    // ポインタを使ってデータを表示
    printf("Name: %s, Age: %d\n", ptr->name, ptr->age);
    return 0;
}
動作説明
  1. 構造体の定義:Student構造体を定義します。
  2. 構造体ポインタの宣言:Student型ポインタptrを宣言し、構造体変数studentのアドレスを格納します。
  3. データのアクセス:->演算子を使い、構造体メンバーにアクセスします。

2. 動的メモリ確保の基本

2.1 mallocを使ったメモリ確保

#include <stdio.h>
#include <stdlib.h>

// 学生情報を表す構造体
typedef struct {
    char name[50];
    int age;
} Student;

int main() {
    // 動的に構造体メモリを確保
    Student *student = (Student *)malloc(sizeof(Student));

    // データの代入
    sprintf(student->name, "Bob");
    student->age = 22;

    // データの表示
    printf("Name: %s, Age: %d\n", student->name, student->age);

    // メモリの解放
    free(student);
    return 0;
}
動作説明
  1. 構造体の定義:Student構造体を定義します。
  2. 動的メモリ確保:malloc関数を使い、構造体のメモリを動的に確保します。
  3. データの代入:->演算子を使い、構造体メンバーにデータを代入します。
  4. データの表示:構造体のメンバーデータを出力します。
  5. メモリの解放:free関数を使い、確保したメモリを解放します。

3. 構造体ポインタの応用例

3.1 配列を使ったデータ管理

#include <stdio.h>
#include <stdlib.h>

// 学生情報を表す構造体
typedef struct {
    char name[50];
    int age;
} Student;

int main() {
    // 学生の配列を動的に確保
    int n = 3;
    Student *students = (Student *)malloc(n * sizeof(Student));

    // データの代入
    for (int i = 0; i < n; i++) {
        sprintf(students[i].name, "Student%d", i + 1);
        students[i].age = 18 + i;
    }

    // データの表示
    for (int i = 0; i < n; i++) {
        printf("Name: %s, Age: %d\n", students[i].name, students[i].age);
    }

    // メモリの解放
    free(students);
    return 0;
}
動作説明
  1. 構造体の定義:Student構造体を定義します。
  2. 配列の動的メモリ確保:mallocで構造体配列のメモリを確保します。
  3. データの代入:forループで各構造体メンバーにデータを代入します。
  4. データの表示:構造体配列の全データを出力します。
  5. メモリの解放:配列のメモリをfreeで解放します。

4. 練習問題

以下の課題に挑戦して、構造体ポインタと動的メモリ確保の理解を深めましょう。

  1. 動的にメモリを確保して、従業員情報(名前、役職、給与)を管理するプログラムを作成してください。
  2. 構造体配列を動的に作成し、学生の成績情報を管理するプログラムを作成してください。
  3. 商品情報(商品名、価格、在庫数)を構造体で管理し、在庫数を更新する関数を作成してください。

5. まとめ

構造体ポインタと動的メモリ確保を使うことで、大規模なデータ操作が効率的に行えます。次回は、構造体を活用した実践的なプロジェクトについて学びます。