C言語 構造体とポインタ: 実践ガイド
C言語 構造体とポインタ: 実践ガイド
ポインタで構造体メンバーを操作し、動的メモリ確保で柔軟なCデータ構造を構築する方法を学びます。
構造体とポインタに入る前に、以下の基礎トピックを確認してください:
ポインタで構造体を参照する
構造体とそれを指すポインタの宣言例を簡潔に示します。
struct Person {
int member1;
int member2;
/* 追加メンバー */
};
int main(void) {
struct Person *ptr, harry;
/* ptrは任意のPersonインスタンスを指せる */
}
このスニペットでは、ptrはstruct Personインスタンスへのポインタです。
例: ポインタ経由で構造体メンバーにアクセス
ポインタ経由で構造体フィールドを読み書きするには、->演算子を使います。
#include <stdio.h>
struct Person {
int age;
float weight;
};
int main(void) {
struct Person *personPtr, person1;
personPtr = &person1; /* person1を指す */
printf("Enter age: ");
scanf("%d", &personPtr->age);
printf("Enter weight: ");
scanf("%f", &personPtr->weight);
printf("\nDisplaying:\n");
printf("Age: %d\n", personPtr->age);
printf("Weight: %f", personPtr->weight);
return 0;
}
ここでは、personPtr = &person1;でperson1のアドレスをpersonPtrに格納します。以降、personPtr->fieldでのアクセスは(*personPtr).fieldと等価で、簡潔な構文を提供します。
personPtr->ageは(*personPtr).ageと同じpersonPtr->weightは(*personPtr).weightと同じ
構造体の動的メモリ確保
コンパイル時に必要な構造体インスタンス数が不明な場合、C標準ライブラリで実行時にメモリを確保します。
例: 構造体配列の確保
#include <stdio.h>
#include <stdlib.h>
struct Person {
int age;
float weight;
char name[30];
};
int main(void) {
struct Person *ptr;
int i, n;
printf("人数を入力: ");
scanf("%d", &n);
ptr = (struct Person*)malloc(n * sizeof(struct Person));
if (!ptr) {
fprintf(stderr, "Memory allocation failed\n");
return EXIT_FAILURE;
}
for (i = 0; i < n; ++i) {
printf("名前と年齢を入力: ");
scanf("%s %d", (ptr + i)->name, &(ptr + i)->age);
}
printf("\nDisplaying Information:\n");
for (i = 0; i < n; ++i) {
printf("Name: %s\tAge: %d\n", (ptr + i)->name, (ptr + i)->age);
}
free(ptr);
return 0;
}
実行結果:
人数を入力: 2 名前と年齢を入力: Harry 24 名前と年齢を入力: Gary 32 Displaying Information: Name: Harry Age: 24 Name: Gary Age: 32
この例は、ヒープ上にstruct Personのnインスタンスを作成し、ユーザー入力を各々に読み取り、結果を表示する流れを示しています。
C言語
- C# キーワードと識別子:ルール、一覧、ベストプラクティス完全ガイド
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
- C# 部分クラスと部分メソッドを理解する
- C# sealed クラスとメソッドをマスターする:使用判断、実例、コードの安全性とパフォーマンス向上
- C#構造体(struct)完全ガイド:定義、活用、クラスとの違い
- C言語キーワードと識別子:実践ガイド
- C言語ポインタ完全マスター: 実践的エキスパートガイド
- C言語における配列とポインタの関係を理解する
- C言語: アドレスとポインタを関数に渡す – 実践ガイド
- C言語 構造体 完全マスター: 定義・変数・アクセス・高度な例