第60章 構造体3

 構造体へのポインタを作ると、今までの方法だけだと、メンバを (*p).a のようにアクセスしないといけません。これはとても不格好ですね。今回はそういう話です。


 では、今回の要点です。


 では、いってみましょう。


 前回のプログラムを、参照でなくポインタを使って書き直してみましょう。

プログラム
// Struct1b.cpp
#include <iostream.h>

#define ELEM(array)  (sizeof (array) / sizeof *(array))

struct SStudent
{
    char szName[16];
    int  nJapanese;
    int  nMath;
    int  nEnglish;
};

void Disp(const SStudent* pstudent)
{
    cout << "名前 : "   << (*pstudent).szName    << endl
         << " 国語 : " << (*pstudent).nJapanese << " 点, "
            "数学 : "   << (*pstudent).nMath     << " 点, "
            "英語 : "   << (*pstudent).nEnglish  << " 点" << endl;
}

int main()
{
    SStudent students[] = {
        { "赤井孝",   73, 98, 86, },
        { "笠井大介", 64, 45, 40, },
        { "吉田叶",   76, 78, 69, },
    };
    int      i;

    for(i = 0; i < ELEM(students); i++)
        Disp(&students[i]);

    return 0;
}

 確かにできたことはできたのですが、(*pstudent).szName というのは何とも不格好です。(*pstudent.szName としないのは、これは優先順位の関係上 *(pstudent.szName) と同じ事になるからです。)

 これを解消するために、構造体のメンバへアクセスするためのもう1つの方法があります。それは、-> 演算子を使う方法です。

 使い方は簡単です。先ず、以下のプログラムを見て下さい。

プログラム
// Struct1c.cpp
#include <iostream.h>

#define ELEM(array)  (sizeof (array) / sizeof *(array))

struct SStudent
{
    char szName[16];
    int  nJapanese;
    int  nMath;
    int  nEnglish;
};

void Disp(const SStudent* pstudent)
{
    cout << "名前 : "   << pstudent->szName    << endl
         << " 国語 : " << pstudent->nJapanese << " 点, "
            "数学 : "   << pstudent->nMath     << " 点, "
            "英語 : "   << pstudent->nEnglish  << " 点" << endl;
}

int main()
{
    SStudent students[] = {
        { "赤井孝",   73, 98, 86, },
        { "笠井大介", 64, 45, 40, },
        { "吉田叶",   76, 78, 69, },
    };
    int      i;

    for(i = 0; i < ELEM(students); i++)
        Disp(&students[i]);

    return 0;
}

 pstudent->szName というのがそれです。実に単純明快ですね。<アドレス> -> <メンバ名> でメンバにアクセスできるということです。


 今回はもうこれで話すことがなくなってしまったので、ちょっと構造体に関する補足をしておきます。

 構造体はC言語とC++では仕様が違います。C言語での制限は一応少し書いてきましたし、C++の構造体は(第1部ではふれませんが)まだいろいろできることがあります。ここでは、C言語の構造体についてまとめてみようと思います。

 先ず構造体の宣言は、C言語でも今まで説明したとおりでOKです。メンバへのアクセス方法もC言語、C++で変わりありません。

 ただ、構造体変数の宣言だけが少し変わってきます。

struct SStudent students[] = {
    { "赤井孝",   73, 98, 86, },
    { "笠井大介", 64, 45, 40, },
    { "吉田叶",   76, 78, 69, },
};

 このように、C言語では構造体変数の宣言の時にも struct を書く必要があるのです。

 そして、C++では構造体にはまだいろいろできることがあるのですが、C言語ではここまでのことしかできません。しかし、実際にはC++で構造体を使うというときでも、普通はこれ以上のことはしません。これ以上のことをしたいときには、構造体ではなく「クラス」というものを使うのが普通です(クラスについては第2部で話します)。

 で、やはり struct を書くのは面倒ということで、C言語にも struct を書かずにすむ方法があります。それは typedef というものを使う方法です(typedef については第3部で話します)。

typedef struct dummy_SStudent
{
    char szName[16];
    int  nJapanese;
    int  nMath;
    int  nEnglish;
} SStudent;

 こうすれば、C言語でも

SStudent students[] = {
    { "赤井孝",   73, 98, 86, },
    { "笠井大介", 64, 45, 40, },
    { "吉田叶",   76, 78, 69, },
};

とすることができます。詳しい意味は後に譲るとして、とりあえず今はこういう方法があるんだと思っておいて下さい。

 この方法はC++でも通用するので、C言語とC++とのどちらでも使用できるソースを書く必要があるときにこの方法をよく使います。

 そして、逆もまた通用します。すなわち、C++でも構造体変数の宣言時に struct を書いても構いません。どちらでも使用できるソースにするためにどちらの方法を使うかは、趣味と状況に任せるとしましょう。


 今回の要点です。C言語についての要点は割愛します。


 次回は、構造体を離れ、すっかり忘れていた多次元配列について話します。では。


第59章 構造体2 | 第61章 多次元配列

Last update was done on 2000.7.25

この講座の著作権はロベールが保有しています