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

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

C++プログラミング入門その25 構造体へのポインタ

>>この記事には書き直した新しいページがあります。<<


<<前  [TOP]  次>>


Visual Studioで新規プロジェクトを作り、以下のcppファイルを作成して下さい。


【Kouzoutai3.cpp】

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

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

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

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

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



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

例
     struct Pen {
        char color[20];
        int futosa;
    }pen;

    struct Pen *ppen;

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

ppen = &pen;

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


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

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

    例
        struct Pen {
            char color[20];
            int futosa;
        };
    
        void init( struct Pen *ppen );    /* 関数の宣言 */
    
        void 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は、文字列へのポインタをメンバーに持っているのです。


    実行結果です。



    Visual Studioで新規プロジェクトを作り、以下のcppファイルを作成して下さい。


    【Kouzoutai4.cpp】

    #include <iostream>
    
    struct gakusei {
    
            char *pname;
            char *pnen;
            char *pnumber;
            char *pgakka;
            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;
    
    }
    
    
    void 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では、ポインタ変数を使い出力しています。


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


    実行結果です。



    <<前  [TOP]  次>>