アロー演算子 (->)
CoddyのCジャーニー「Logic & Flow」セクションの一部 — レッスン 45/63。
構造体へのポインタを扱う際、構造体のメンバにアクセスするには特別な構文が必要です。間接参照演算子(デリファレンス演算子)とドット記法を組み合わせて使用することもできますが、C言語にはこの目的のために特別に用意された、より便利な演算子があります。それがアロー演算子(->)です。
アロー演算子を使用すると、ポインタを介して構造体のメンバに、すっきりと読みやすい方法でアクセスできます:
ptr->memberこれは (*ptr).member と書くのと同等ですが、より簡潔です。
実際には次のように動作します:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// アロー演算子を使用する場合
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// これは以下と同じです:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);アロー演算子を使用すると、特に複雑なデータ構造を扱う際に、コードがより簡潔で読みやすくなります。これは、C言語プログラミングにおいてポインタを介して構造体(struct)のメンバにアクセスするための標準的な方法です。
チャレンジ
簡単ポインタを介して構造体メンバにアクセスするためのアロー演算子の使用方法を示すCプログラムを作成してください。プログラムは以下の内容を行う必要があります:
- 以下のメンバを持つ
Bookという名前のstructを定義します:- ブックIDを格納する整数型の
id - ブックのタイトルを格納するサイズ40の文字配列
title - 著者名を格納するサイズ30の文字配列
author - ブックの価格を格納する浮動小数点型の
price - ページ数を格納する整数型の
pages
- ブックIDを格納する整数型の
- main関数内で、
myBookという名前のBook変数を作成します bookPtrという名前のBook構造体へのポインタを宣言しますmyBookのアドレスをbookPtrに代入します- 以下の入力値を読み取り、ポインタを介してアロー演算子を使用して構造体メンバに代入します:
- IDとして整数を読み取り、
bookPtr->idを使用して代入します - タイトルとして文字列を読み取り、
bookPtr->titleを使用して代入します - 著者として文字列を読み取り、
bookPtr->authorを使用して代入します - 価格として浮動小数点を読み取り、
bookPtr->priceを使用して代入します - ページ数として整数を読み取り、
bookPtr->pagesを使用して代入します
- IDとして整数を読み取り、
- すべての値を読み取った後、アロー演算子を使用して以下の操作を実行します:
- 価格に10%の割引を適用します:
bookPtr->price = bookPtr->price * 0.9; - 50ページのボーナスページを追加します:
bookPtr->pages += 50;
- 価格に10%の割引を適用します:
- アロー演算子を使用して各メンバにアクセスし、以下の正確な形式でブック情報を出力します:
Book Information:ID: [id]Title: [title]Author: [author]Price: [price]Pages: [pages]
- アロー演算子を使用して、1ページあたりの価格を計算し、次の形式で出力します:
Price per page: [price_per_page]
このチャレンジでは、ポインタを介して構造体メンバにアクセスするためのアロー演算子の理解をテストします。構造体メンバの読み取りと書き込みの両方で ptr->member 構文を使用する練習を行い、それが (*ptr).member と同等でありながら、より便利で読みやすいことを確認します。
チートシート
アロー演算子 (->) は、ポインタを介して構造体のメンバにアクセスするための便利な方法を提供します:
ptr->memberこれは (*ptr).member と同等ですが、より簡潔で読みやすくなっています。
使用例:
struct Point p1 = {10, 20};
struct Point *ptr = &p1;
// アロー演算子を使用する
printf("x = %d, y = %d\n", ptr->x, ptr->y);
// これは以下と同じです:
printf("x = %d, y = %d\n", (*ptr).x, (*ptr).y);自分で試してみよう
#include <stdio.h>
#include <string.h>
// TODO: ここでBook構造体を定義します
int main() {
// TODO: myBookという名前のBook型変数を作成します
// TODO: bookPtrという名前のBook型へのポインタを宣言します
// TODO: myBookのアドレスをbookPtrに代入します
// 入力値を読み取ります
int id;
char title[40];
char author[30];
float price;
int pages;
scanf("%d", &id);
scanf("%s", title);
scanf("%s", author);
scanf("%f", &price);
scanf("%d", &pages);
// TODO: アロー演算子を使用して、入力値を構造体のメンバに代入します
// TODO: アロー演算子を使用して、価格に10%の割引を適用します
// TODO: アロー演算子を使用して、ボーナスページを50ページ追加します
// TODO: アロー演算子を使用して、本の情報を表示します
// TODO: アロー演算子を使用して、1ページあたりの価格を計算し表示します
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。