C 構造体 新しいページはコチラ
提供: yonewiki
(→構造体) |
|||
1行: | 1行: | ||
− | ※このページではC言語にも存在していたという意味で記事タイトルがC | + | [[C PlusPlus#Cにもあった技術|C++]]へ戻る |
+ | |||
+ | |||
+ | ※このページではC言語にも存在していたという意味で記事タイトルがC 構造体になっていますが、<br /> | ||
[[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br /> | [[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br /> | ||
<br /> | <br /> | ||
== '''構造体''' == | == '''構造体''' == | ||
+ | |||
簡単に考えると、変数を一塊(ひとかたまり)にするためのものと言っていいですが、変数の中にポインタ変数も含めることが出来るし、関数だって組み込める。C++においてはクラスとよく似ている使い方もできるので、簡単なようで、なんとも奥深い仕組みです。あきらかに構造体を使うべきだと思うケースって、いわゆる二分木を使ったバイナリーツリーとかバイナリーサーチツリーとかという考え方に基づいてソート処理をしたり、検索処理をしたりするときのリスト構造やら、ヒープ、マルチウェイツリーを組むときとか、そんなときだったり、このデータを使うときはひとまとめにするわなってときなんです。 | 簡単に考えると、変数を一塊(ひとかたまり)にするためのものと言っていいですが、変数の中にポインタ変数も含めることが出来るし、関数だって組み込める。C++においてはクラスとよく似ている使い方もできるので、簡単なようで、なんとも奥深い仕組みです。あきらかに構造体を使うべきだと思うケースって、いわゆる二分木を使ったバイナリーツリーとかバイナリーサーチツリーとかという考え方に基づいてソート処理をしたり、検索処理をしたりするときのリスト構造やら、ヒープ、マルチウェイツリーを組むときとか、そんなときだったり、このデータを使うときはひとまとめにするわなってときなんです。 | ||
9行: | 13行: | ||
− | '''C++ではクラスと構造体には対した差はありません。'''敢えて言うならば、デフォルトのアクセス指定子が構造体では'''public'''になっていて、クラスは'''private''' | + | '''C++ではクラスと構造体には対した差はありません。'''敢えて言うならば、デフォルトのアクセス指定子が構造体では'''public'''になっていて、クラスは'''private'''になっているところです。似ていますが、構造体を使うパターンというのは継承とかを使わない構造がシンプルなものになるのが一般的なように思います。なので、細かい説明はクラスに譲るとして、よく使うパターンとしての構造体についてのみ、この項目で触れたいと思います。 |
59行: | 63行: | ||
− | なんのために構造体を使うのか、どういう具合に使うものなのか?そこまで理解してこそのプログラミング技術。そんなスタンスで謙虚に学ぼうという姿勢を崩さないのが大事。一流のプログラマ(例えば数人で起業したGoogleの人たちみたいな) | + | なんのために構造体を使うのか、どういう具合に使うものなのか?そこまで理解してこそのプログラミング技術。そんなスタンスで謙虚に学ぼうという姿勢を崩さないのが大事。一流のプログラマ(例えば数人で起業したGoogleの人たちみたいな)になるには、道は果てしなく遠く、ちょっとパソコンで簡単なプログラミングができるレベルの人がわんさかいる現状を考えれば、基本の技術をいかに応用できるのか?そういうところが大事なのです。自分も構造体はいまだに使いこなせていないと思っていますし…。謙虚に。謙虚に。構造体で実現されているpairとかのソースを見ると、あぁコレってすげぇなって感じると思う。 |
79行: | 83行: | ||
void stDatePrint(stDate* pstDateOutput,int nSize); | void stDatePrint(stDate* pstDateOutput,int nSize); | ||
− | int _tmain(int argc, _TCHAR* argv[]) | + | int _tmain(int argc, _TCHAR* argv[]){ |
int nSize = 3; | int nSize = 3; | ||
123行: | 127行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
上記のように構造体で定義された3つの変数をまとめて、関数に引き渡せるし、構造体を配列にしてしまえば、3つの変数をまとめて配列の要素の数だけ受け渡しできる。サンプルでは配列要素は3つなので、3変数×3要素で、一気に9つの変数を引数として渡すことができている。 | 上記のように構造体で定義された3つの変数をまとめて、関数に引き渡せるし、構造体を配列にしてしまえば、3つの変数をまとめて配列の要素の数だけ受け渡しできる。サンプルでは配列要素は3つなので、3変数×3要素で、一気に9つの変数を引数として渡すことができている。 | ||
+ | |||
128行: | 133行: | ||
− | + | 13行目および46行目の構造体のポインタを引数としているところは、配列の表現を使っても良いので | |
+ | <syntaxhighlight lang="text"> | ||
+ | … | ||
+ | void stDatePrint(stDate* pstDateOutput,int nSize); | ||
+ | … | ||
+ | void stDatePrint(stDate* pstDateOutput,int nSize){ | ||
+ | … | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | の部分は | ||
+ | <syntaxhighlight lang="text"> | ||
+ | … | ||
+ | void stDatePrint(stDate pstDateOutput[],int nSize); | ||
+ | … | ||
+ | void stDatePrint(stDate pstDateOutput[],int nSize){ | ||
+ | … | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | として、表記しても良いですし、ポインタで配列をnew演算子によって生成する部分も配列の変数を使っても良いです。もちろん選択演算子のドット記号を[[C -> アロー演算子|アロー演算子(->)]]に置き換えた表現にしても良いです。 | ||
+ | |||
+ | |||
+ | 構造体を使ったデータ構造プログラミングの例やらは複雑な話になりそうなので、回避したいところですが、それではあんまりなので、もうちょっと踏み込んだ話は、また後日にでも記述します。(2015/02/06書きかけの記事。いつ書くのかは誰の知る由もない。なんなら逃げ出す可能性もあります。しばらくは他サイトのプログラムとデータ構造あたりで検索したり、クイックソート、バブルソート、二分木、リスト構造、ヒープ、バイナリーツリー、バイナリーサーチツリー、マルチウェイツリー、線形探索、循環リスト、双方向リストといったキーワードとCサンプルプログラムあたりでひっかかるサイトを参照して下さい。例によって計算量O(Order)の話や対数についての話題が登場することになりますが、地道に勉強するという遠回りも時間があればやってみて欲しいですね。クイックソートは万能なように思えますが、既にソート済の要素を処理すると遅くなりますので、改良型クイックソートの話について触れている優良な記事に出会えると良いなぁと心配したりします。だったらおまえが説明しろや!って言う声もなんとなく想像しますが…。って言い訳しすぎだろオレ。) | ||
+ | |||
+ | |||
+ | [[C PlusPlus#Cにもあった技術|C++]]へ戻る |