学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

C++ | 22 | 構造体へのポインター

↓↓クリックして頂けると励みになります。



21 | 構造体】 << 【ホーム】 >> 【23 | 構造体の中の構造体


構造体へのポインター
構造体へのポインター



C++における構造体へのポインター(Structure Pointer)は、構造体のメンバーにアクセスするためのポインターです。
構造体へのポインターを使用することで、メモリ効率が向上し、プログラムのパフォーマンスが向上する場合があります。
また、動的メモリ割り当てや関数への引数として構造体を渡す場合に便利です。

ポインターを使用してメンバーにアクセスする際には、アロー演算子(->)が使用されます。
最後に、delete演算子を使用して動的に割り当てられたメモリを解放します。


Visual Studio Codeで以下のcppファイルを作成して下さい。


新規作成 【Kouzoutai3.cpp】

#include<iostream>
#include <stdio.h>
#include <string.h>

struct xPen {
             const char *color;
             int  futosa;
};

void init( struct xPen *ppen){
       ppen->color = "black";
       ppen->futosa= 5;
}

int main(){
       struct xPen pen;
       init(&pen);

		std::cout << pen.color << std::endl;
		std::cout << pen.futosa << std::endl;
}



構造体は型の一種なので構造体へのポインタを考えるときには、その構造体型へのポインタになります。

例
     struct Pen {
        const char *color;
        int futosa;
    }pen;

    struct Pen *ppen;

この例では構造体Pen型を考え、構造体Pen型へのポインタppenを宣言しています。
従ってポインタppenは構造体Pen型の変数のアドレスを保持することができますので、

ppen = &pen;

のように使うことができます。


構造体へのポインタが与えられたときにどのようにしてメンバーを指定すればよいかを説明します。
指定の方法には2種類あります。

  • ppen->futosa;
  • (*ppen).futosa;
    どちらを使ってもかまいません。
    アロー演算子「”->”」を使った方が記述は簡単です。
    次の例のようにして使います。

    例
        struct Pen {
            const char *color;
            int futosa;
        };
    
        void init( struct Pen *ppen );    /* 関数の宣言 */
    
        int main() {
            struct Pen pen;
            init(&pen);
        }
    
        void init( struct Pen *ppen ) {
            ppen->color = 'b';
            ppen->futosa = 5;
        }
    

    上の例ではmain()関数で関数init()を呼ぶ際に、構造体の変数penのアドレスをinit()に渡しています。
    呼び出される関数init()では、アドレスを受け取れるように引数にはポインタを用いています。
    したがってポインタppenはmain()関数で確保された構造体変数penを示しています。


    もし構造体自体にポインタが含まれていたらどうなるでしょうか。
    このサンプルプログラムでは構造体の定義自体が少し変更されています。
    文字型ではなく、文字型へのポインタがメンバーになっています。
    つまり構造体xPenは、文字列へのポインタをメンバーに持っているのです。


    実行結果です。

    ~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ Kouzoutai3.cpp -o Kouzoutai3 && "/Users/**/Desktop/Programming/CPP/"Kouzoutai3
    
    black
    5
    



    Visual Studio Codeで以下のcppファイルを作成して下さい。


    新規作成 【Kouzoutai4.cpp】

    #include <iostream>
    
    struct gakusei {
    
        const char *pname;
        const char *pnen;
        const char *pnumber;
        const char *pgakka;
        const char *pkumi;
    
        float zenki;
        float kouki;
        float report;
        float shutsuseki;
    
        char name[30];
        char nen[5];
        char number[10];
        char gakka[30];
        char kumi[30];
    
    };
    
    void input(struct gakusei *p) {
    
        std::cout << "名前を入力してください。" << std::endl;
        std::cin >> p->name;
    
        std::cout << "入学年度を入力してください。" << std::endl;
        std::cin >> p->nen;
    
        std::cout << "学籍番号を入力してください。" << std::endl;
        std::cin >> p->number;
    
        std::cout << "学科を入力してください。" << std::endl;
        std::cin >> p->gakka;
    
        std::cout << "組を入力してください。" << std::endl;
        std::cin >> p->kumi;
    
        std::cout << "前期の総合成績を入力してください。(100点満点)" << std::endl;
        std::cin >> p->zenki;
    
        std::cout << "後期のテストの成績を入力してください。(100点満点)" << std::endl;
        std::cin >> p->kouki;
    
        std::cout << "後期のレポートの提出回数を入力してください。(15回中)"<< std::endl;
        std::cin >> p->report;
    
        std::cout << "後期の出席回数を入力してください。(15回中)" << std::endl;
        std::cin >> p->shutsuseki;
    
        p->pname = p->name;
        p->pnen = p->nen;
        p->pnumber = p->number;
        p->pgakka = p->gakka;
        p->pkumi = p->kumi;		
    }		
    	
    void output(struct gakusei *p) {
    
        std::cout << "名前:" << p->pname  << std::endl;
        std::cout << "入学年度:" << p->pnen << std::endl;
        std::cout << "学籍番号:" << p->pnumber << std::endl;
        std::cout << "学科:" << p->pgakka << std::endl;
        std::cout << "組:" << p->pkumi << std::endl;
    
        float tsuunen =(p->zenki+(p->kouki/2)+(p->report*2)+(p->shutsuseki*20/15))/2;
    
        std::cout << "通年成績は" << tsuunen << "点です。" << std::endl;
    }
    
    int main() {
    
        struct gakusei xp;
    
        input(&xp);
        output(&xp);
    }
    



    自分の名前、入学年度、番号、学科、組を格納する構造体を宣言し、それらをディスプレイに表示するするプログラムです。
    名前、入学年度、番号、学科、組はキーボードから入力できます。
    さらに構造体メンバーには前期の総合成績、後期テストの成績、レポートの提出回数と出席回数があり、これらもキーボードから入力できるようになっています。
    後期の出席回数は15回で、点数は20点に換算しています。
    レポート提出回数も最高15回です。
    main関数で構造体メンバーに入力された値を用いて、以下の式で通年成績をつけて結果を表示するようにしています。


    通年成績=(前期の総合成績+(後期テスト*0.5 + レポートの成績*2 +出席点*20.0/15))/2.0


    入力部分の関数、出力部分の関数、メイン関数にプログラムを分割し、入力部分の関数、出力部分の関数のついては、引数は構造体へのポインタとなるようにしています。


    配列の型指定に構造体型を指定することができます。
    この場合、指定した構造体型の配列が確保できることになります。

    例
         struct Test {
            char name[30];
            int zenki;
            int kouki;
        };
    
        struct Test gakusei[100];
    

    この例では100個のgakuseiという配列を確保していますが、一つ一つの配列の要素は、struct Test型です。
    例えばgakusei[0]は、name[], zenki, koukiという3つのメンバーを持つことになります。


    個々のメンバーへのアクセス方法は、次のようになります。

    例
         gakusei[0].zenki = 80;
        gakusei[0].kouki = 60;
    



    このサンプルプログラムの説明をします。


    まず構造体のメンバーには、ポインタ変数と、配列を用意しています。
    これは入力には配列を使わなければならないことと、文字列の出力にはポインタ変数を使った方が楽だからという理由があります。


    標準入力cinから文字型の配列(入力する文字分のメモリを確保)に格納し、その後それぞれのポインタに配列の先頭のアドレスを格納しています。
    標準出力coutではポインタ変数を使い出力しています。


    メイン関数では構造体型の変数を宣言し、そのアドレスを関数に渡すだけのことを行っています。


    実行結果です。


    ~/Desktop/Programming/CPP $ cd "/Users/**/Desktop/Programming/CPP/" && g++ Kouzoutai4.cpp -o Kouzoutai4 && "/Users/**/Desktop/Programming/CPP/"Kouzoutai4

    名前を入力してください。
    nanashinogonbei
    入学年度を入力してください。
    2024
    学籍番号を入力してください。
    001
    学科を入力してください。
    物理
    組を入力してください。
    B
    前期の総合成績を入力してください。(100点満点)
    98
    後期のテストの成績を入力してください。(100点満点)
    96
    後期のレポートの提出回数を入力してください。(15回中)
    15
    後期の出席回数を入力してください。(15回中)
    14
    名前:nanashinogonbei
    入学年度:2024
    学籍番号:001
    学科:物理
    組:B
    通年成績は97.3333点です。



    21 | 構造体】 << 【ホーム】 >> 【23 | 構造体の中の構造体





    ↓↓クリックして頂けると励みになります。