構造体へのポインタ
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 44/63。
構造体の扱いに慣れてきたところで、それらをC言語のもう一つの強力な概念であるポインタと組み合わせてみましょう。int や char のような基本データ型へのポインタを作成できるのと同様に、構造体変数のアドレスを保持するポインタを作成することもできます。
構造体へのポインタを宣言するための構文は、他のポインタ宣言と同じパターンに従います:
struct StructureName *pointerName;例えば、おなじみの Point 構造体を使用すると次のようになります:
struct Point p1 = {10, 20};
struct Point *ptr;これにより、Point 構造体のアドレスを格納できる ptr という名前のポインタが作成されます。ポインタを実際に構造体変数に向かわせるには、アドレス演算子を使用します:
ptr = &p1;これで、ptr は p1 構造体変数のメモリ番地を保持するようになります。これにより、特に構造体を関数に渡したり、メモリを動的に管理したりする場合など、構造体を扱うための新しい可能性が広がります。構造体へのポインタは、より複雑なデータ構造を構築し、効率的なCプログラムを記述するために不可欠です。
チャレンジ
簡単構造体へのポインタを扱うCプログラムを作成してください。プログラムは以下の内容を行う必要があります:
- 以下のメンバを持つ
Productという名前のstructを定義します:- 商品IDを格納する整数型の
id - 商品名を格納するサイズ25の文字配列
name - 商品価格を格納する浮動小数点型の
price - 在庫数を格納する整数型の
quantity
- 商品IDを格納する整数型の
- main関数内で、
itemという名前のProduct変数を作成し、以下の値で初期化します:- ID: 501
- Name: "Laptop"
- Price: 899.99
- Quantity: 15
itemPtrという名前のProduct構造体へのポインタを宣言します- アドレス演算子を使用して、
item変数のアドレスをitemPtrに代入します - 構造体のメンバに直接アクセス(ドット演算子を使用)して、元の製品情報を次の正確な形式で出力します:
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- ポインタを介して構造体のメンバにアクセス(逆参照演算子とドット記法:
(*itemPtr).memberを使用)して、同じ製品情報を次の正確な形式で出力します:Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- メモリアドレスを次の正確な形式で出力して、ポインタが正しく構造体を指していることを確認します:
Address of item: [address]Value of itemPtr: [address]Address verification: [result]
アドレス検証では、アドレスが同じ場合は Match を、異なる場合は No Match を出力してください。
このチャレンジでは、構造体へのポインタの宣言、アドレス演算子を使用したアドレスの代入、および逆参照演算子とドット記法を組み合わせたポインタ経由の構造体メンバへのアクセスに関する理解をテストします。また、ポインタが構造体変数のアドレスを正しく保持していることも確認します。
チートシート
構造体へのポインタは、他のポインタ宣言と同じ構文を使用して作成できます:
struct StructureName *pointerName;ポインタを構造体変数を指すようにするには、アドレス演算子を使用します:
struct Point p1 = {10, 20};
struct Point *ptr;
ptr = &p1;デリファレンス演算子とドット記法を使用して、ポインタ経由で構造体のメンバにアクセスします:
(*ptr).member自分で試してみよう
#include <stdio.h>
#include <string.h>
// TODO: ここで Product 構造体を定義します
int main() {
// TODO: ここにコードを記述してください
// 1. Product 型の変数 'item' を作成し、初期化します
// 2. 'itemPtr' という名前の Product へのポインタを宣言します
// 3. 'item' のアドレスを 'itemPtr' に代入します
// 4. ドット演算子を使用して元の製品情報を表示します
// 5. (*itemPtr).member を使用してポインタ経由で製品情報を表示します
// 6. アドレスを表示して確認します
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。