Menu
CoddyTech

構造体へのポインタ

CoddyのCジャーニー「論理と制御フロー」セクションの一部。レッスン 44/63。

構造体の扱いに慣れてきたところで、次はそれをCのもう一つの強力な概念であるポインターと組み合わせてみましょう。intやcharのような基本データ型へのポインターを作成できるのと同様に、構造体変数のアドレスを保持するポインターも作成できます。

構造体へのポインターを宣言する構文は、他のポインター宣言と同じパターンに従います。

struct StructureName *pointerName;

たとえば、おなじみの Point 構造体を使うと、次のようになります。

struct Point p1 = {10, 20};
struct Point *ptr;

これにより、Point 構造体のアドレスを格納できる、ptr という名前のポインターが作成されます。ポインターが実際に構造体変数を指すようにするには、アドレス演算子を使います。

ptr = &p1;

ポインターを通じてメンバーを読み取るには、ポインターを逆参照してからドット演算子を使います。. は * よりも優先順位が高いため、括弧が必要です。

printf("%d", (*ptr).x); // p1.x と同じ

これで、ptrにはp1構造体変数のメモリアドレスが格納されています。これにより、構造体を扱う新たな可能性が広がります。特に、構造体を関数に渡す場合や、メモリを動的に管理する場合に役立ちます。構造体へのポインターは、より複雑なデータ構造を構築し、効率的なCプログラムを書くうえで不可欠です。

challenge icon

チャレンジ

簡単

構造体へのポインターの扱いを示すCプログラムを作成してください。プログラムでは、次のことを行います。

  1. 次のメンバーを持つProductという名前のstructを定義します。
    • 商品IDを格納する整数型のid
    • 商品名を格納する、サイズが25の文字配列name
    • 商品の価格を格納する浮動小数点型のprice
    • 在庫数を格納する整数型のquantity
  2. main関数で、itemという名前のProduct型の変数を作成し、次の値で初期化します。
    • ID: 501
    • 名前: "Laptop"
    • 価格: 899.99
    • 数量: 15
  3. itemPtrという名前のProduct構造体へのポインターを宣言します。
  4. アドレス演算子を使って、item変数のアドレスをitemPtrに代入します。
  5. ドット演算子を使って構造体のメンバーに直接アクセスし、元の商品情報を次の正確な形式で出力します。
    • Original Product Info:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  6. ポインターを介して構造体のメンバーにアクセスし(間接参照演算子とドット記法を使用: (*itemPtr).member)、同じ商品情報を次の正確な形式で出力します。
    • Product Info via Pointer:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  7. 次の正確な形式でメモリアドレスを出力し、ポインターが構造体を正しく指していることを確認します。
    • Address of item: [address]
    • Value of itemPtr: [address]
    • Address verification: [result]

アドレスの確認では、アドレスが同じ場合はMatchを、異なる場合はNo Matchを出力してください。

この課題では、構造体へのポインターの宣言、アドレス演算子を使ったアドレスの代入、間接参照演算子とドット記法を組み合わせてポインター経由で構造体のメンバーにアクセスする方法についての理解を確認します。また、ポインターが構造体変数のアドレスを正しく保持していることも確認します。

自分で試してみよう

#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;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理と制御フローのすべてのレッスン

自分で練習してみよう: Cオンラインコンパイラ