構造体とは、プログラミング言語において複数のデータをまとめるためのデータ構造の1つである。
プログラムで扱われるデータには、同時にまとめて扱われるものが存在する場合がある。そのようなデータを扱うのに便利なのが構造体である。
例えば、複素数の計算を行うプログラムを考えてみよう。複素数を標準で扱えないプログラミング言語も多いが、そのようなプログラミング言語では、その複素数の実部と虚部は別のデータとして異なる変数に格納されなければならない。構造体を用いない場合のコードは以下のようになるだろう。
int multiply_real(int a_real, int a_imaginary, int b_real, int b_imaginary) {
return a_real * b_real - a_imaginary * b_imaginary;
}
int multiply_imaginary(int a_real, int a_imaginary, int b_real, int b_imaginary) {
return a_real * b_imaginary + a_imaginary * b_real;
}
これでも複素数計算が実装できると言えばできるのだが、実部と虚部という本来同時に扱われるものを別々に扱わなければならないとなると、コードが読み辛くなり混乱の元にもなる。そういう本来同時に扱われるべきデータは同じ変数にまとめてしまえるようにする、というのが構造体の基本的な考え方である。構造体を使った疑似コードは以下のような感じになる。(実際のコードはプログラミング言語によって書き方が異なる。)
struct complex {
int real;
int imaginary;
}
complex multiply(complex a, complex b) {
complex result;
result.real = a.real * b.real - a.imaginary * b.imaginary;
result.imaginary = a.real * b.imaginary + a.imaginary * b.real;
return result;
}
虚部と実部が一つのcomplex構造体に格納された結果、最初のコードに比べて随分と読みやすく且つ扱いやすいコードになったことがお分かりいただけただろうか。C言語だとmallocとかしないといけないが……ごにょごにょ。
オブジェクト指向言語では、変数だけではなくメソッドをまとめることもできるクラスと呼ばれる概念が用意されているが、その言語が構造体をサポートする場合にそれがクラスとどう違うかは言語によって異なる。
掲示板
1 ななしのよっしん
2012/10/23(火) 01:40:03 ID: 52DFnxKn/k
複素数演算ってわりと使うのに標準でサポートしてない言語が多いのはなんでだぜ?(Fortranなんかはちゃんと型としてある)
あと、「構造体」って呼び方が使われるのって言語としてはC/C++だけじゃないの??
「複数のデータをまとめ」て一変数みたいに扱う言語はいくらでもあるけど
2 ななしのよっしん
2014/01/06(月) 19:42:42 ID: 6wIfrVLgNp
構造体の例として複素数が出てくるのに吹いた
むしろオブジェクト指向とか演算子カスタマイズの方で例に出すべきだろう
構造体はレコード型データベースにぴったりフィットする機能
住所録とか伝票とかの方が自然
>>1
複素数が必要なのはおおむねアカデミックな分野だからFortran,Lispで十分なんじゃないの
業務・ビジネス系が主戦場だと小数すら使わないなんてこともw
3 ななしのよっしん
2016/07/24(日) 17:44:29 ID: PVRlh4RbN+
遅レスだが、リテラルの扱いが面倒くさいからだろう。虚数をどう表記するかとか、+という非常に単純なオペレーターの解釈がややこしくなるのは辛い。
ちなみに、Cの場合言語の粒度から言って構造体+関数で実現すべき内容だからfirst classにならないのは同然。ただしライブラリは標準規格に入ってる。
急上昇ワード改
最終更新:2025/12/05(金) 20:00
最終更新:2025/12/05(金) 20:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。