構造体へのポインタ
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プログラムを書くうえで不可欠です。
チャレンジ
簡単構造体へのポインターの扱いを示すCプログラムを作成してください。プログラムでは、次のことを行います。
- 次のメンバーを持つ
Productという名前のstructを定義します。- 商品IDを格納する整数型の
id - 商品名を格納する、サイズが25の文字配列
name - 商品の価格を格納する浮動小数点型の
price - 在庫数を格納する整数型の
quantity
- 商品IDを格納する整数型の
- main関数で、
itemという名前のProduct型の変数を作成し、次の値で初期化します。- ID: 501
- 名前: "Laptop"
- 価格: 899.99
- 数量: 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を出力してください。
この課題では、構造体へのポインターの宣言、アドレス演算子を使ったアドレスの代入、間接参照演算子とドット記法を組み合わせてポインター経由で構造体のメンバーにアクセスする方法についての理解を確認します。また、ポインターが構造体変数のアドレスを正しく保持していることも確認します。
自分で試してみよう
#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;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理と制御フローのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ