構造体へのポインタを作ると、今までの方法だけだと、メンバを (*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言語についての要点は割愛します。
次回は、構造体を離れ、すっかり忘れていた多次元配列について話します。では。
Last update was done on 2000.7.25
この講座の著作権はロベールが保有しています