最終更新:2018-11-22 (木) 14:23:56 (1974d)  

C言語/構造体
Top / C言語 / 構造体

struct タグ名{
データ型 メンバー名;
};

C言語/関数

  • 構造体型の引数は、受け取る側の関数に全ての値がコピーされます

代入

  • 配列と異なり、 構造体は一度にコピーすることができる
  • 右辺の構造体の全てのメンバが左辺の構造体の全てのメンバにコピーされる。
  • ただし、構造体のメンバにポインタを含む場合、 この方法ではポインタの値がコピーされ、 片方の構造体のポインタ先の値を変更すると、 もう片方の構造体のポインタ先の値まで変わってしまう、 いわゆる浅いコピー(シャローコピー)となる

structtypedef

使い方

  • 構造体定義を
    struct PointType{
    double x;
    double y;
    };
    として定義すると、この構造体を使用するとき
    struct PointType point;
    と宣言する(C++ではstruct無しでよいがC言語ではキーワードstructが必要)。 上記の構造体定義を行った上で
    typedef struct PointType Point_t;
    と別名定義を行うと、この型を使用するとき
    Point_t point;
    という風に改めてstructと宣言する必要がない。 上記の構造体定義と別名定義を同時に行うのが
    typedef struct {...} Point_t;
    という記述方法。この場合、構造体タグ(上記の例ではPointType?)を省略可能。
  • C言語ではtypedefしておかないと構造体を使用するとき毎回structと記述する必要があるため、typedefで型定義しておくことが多い。
  • C++ではstructで定義したものはstructと付けなくても宣言可能

初期化

  • struct Range range = {1, 2};
    struct Range r = {.location = 1, .length = 2};

標準Cライブラリ

stdlib.h

  • div_t? - int 型の商と剰余を格納する構造体
  • ldiv_t? - long 型の商と剰余を格納する構造体

locale.h

  • lconv? - 数値を記述する場合の書式に関する情報を格納する構造体

stdio.h

  • FILE - ストリームを制御するためのオブジェクト型(構造体とは限らない)

time.h

  • tm - 暦時刻の各要素(時分秒等)を格納する構造体

関連