構造体変数の初期化方法を知りたい!
構造体変数の初期化がうまくできない。
構造体を使ってたら、再定義ってエラーが出てきた。
この記事を読めば、これらの悩みは解決できます。
構造体の宣言方法について、まとめた記事があるのでまだ見ていない方は参考にしてみてください。
構造体変数の初期化(代入)方法の前に、構造体の基本!
先ほどの投稿と同じプログラムを使って、説明して行きます。
構造体変数を使うときの注意点とは?
構造体の説明は先ほどの投稿でほとんどしているので、ここでは構造体変数の注意点だけ確認してください。
・構造体変数と構造体メンバーは別物
・変数ではなく配列にすることも可能(構造体配列)
・構造体変数も変数宣言が必要
・構造体の宣言方法と、構造体変数の変数宣言方法の組み合わせ
これらを順に解説していきます。
間違えやすいポイントですが、構造体変数と構造体メンバーは別物です。「構造体メンバー」とは「名前」、「身長」、「体重」のような構造体でまとめて管理する変数や配列のことを言います。逆に、構造体変数は、構造体で構造体メンバーをまとめるためにある変数です。構造体メンバーを出力したり、計算式で扱ったりするには、
構造体変数.構造体メンバー
とすることで、通常の変数と同じように扱うことができます。
また、構造体配列というものもあります。構造体変数の部分を配列にするだけです。普通の配列と同じなので難しくないと思います。
配列が分からないという人は参考にしてみてください。
また、構造体変数も変数宣言が必要になります。最初に紹介した投稿で、構造体の宣言方法をまとめたのですが、実は構造体変数の変数宣言も同時にしています。
全種類の構造体の宣言方法
もう一度、全種類の構造体の宣言方法を見てみましょう。
これが、基本的な構造体の宣言方法です。
struct INFO
{
char name[20];
float height;
float weight;
};
struct INFO search[3];
次に、構造体の宣言と構造体変数の宣言を同時に行うことで、少し短くしたプログラムです。
struct INFO
{
char name[20];
float height;
float weight;
}search[3];
最後に、typedefというものを使った方法です。
typedef struct
{
char name[20];
float height;
float weight;
}INFO;
INFO search[3];
見てもらえれば、多分分かるかと思いますが、どの場合も一番最後で構造体変数の変数宣言をしています。つまり、必ず構造体の宣言をした直後に構造体変数の変数宣言をするということになります。
また、「一番上の構造体宣言と一番下の構造体変数の変数宣言を組み合わせる」などはできないので気を付けましょう。(3つとも全て別物だと思ってください。)
構造体変数の初期化(代入)方法を解説してみた!
構造体変数の初期化方法は全部で2種類あります。
構造体の初期化方法まとめ
まず初めに、前回解説した、一つ一つ初期化する方法です。
search[0] = { "Mark",165.4,47.8 };
search[1] = { "Tom", 159.5, 45.6 };
search[2] = { "John",167.8,52.3 };
けど、この方法だと少し時間がかかるのでもう一つの方法を紹介します。
それが、このようにして、カッコでまとめて入力する方法です。
INFO search[3] = { { "Mark",165.4,47.8 },
{ "Tom", 159.5,45.6 },
{ "John",167.8,52.3 } };
カッコを使った構造体変数の初期化(代入)の注意点とは?
この方法を使うときの注意点があります。
この初期化方法は、構造体変数の変数宣言も同時に済ませています。そのため、先ほど紹介した構造体の宣言方法では、最後の行を消すという変形が必要があります。
カッコでまとめて初期化するとき、構造体の宣言プログラムはこのように変形します。
「struct INFO search[3];」を消した変形です。
struct INFO
{
char name[20];
float height;
float weight;
};
最後の行の「search[3]」を消した変形です。
struct INFO
{
char name[20];
float height;
float weight;
};
最後の行の「INFO search[3];」を消した変形です。
typedef struct
{
char name[20];
float height;
float weight;
}INFO;
カッコでまとめた代入方法では、このように変形しないと、変数宣言を2回することになり、「再定義」というエラーが出てしまいます。
カッコを使った代入方法の方が簡単なので、構造体の変数宣言はどちらかといえば変形した形を覚えた方が良さそうですね。また、気づいた方もいるかと思いますが、1つ目と2つ目は全く同じなので、覚えるのは2種類だけです。
構造体の練習用プログラム
では、前回作ったプログラムを、カッコを使った構造体変数の初期化、「typedef」を使った構造体の宣言方法使って表します。
名前(name) | 身長(height) | 体重(weight) |
Mark | 165.4 | 47.8 |
Tom | 159.5 | 45.6 |
John | 167.8 | 52.3 |
一応この表も載せておきます。参考にしてみてください。
下は、とある3人の「名前」、「身長」、「体重」の3つをまとめて管理するために、構造体を使ったプログラムです。
#include <stdio.h>
#define N 3
int main()
{
int i;
typedef struct
{
char name[20];
float height;
float weight;
}INFO;
INFO search[N] = { { "Mark",165.4,47.8 },
{ "Tom", 159.5,45.6 },
{ "John",167.8,52.3 } };
for (i = 0; i < N; ++i)
{
printf("name :%s¥n", search[i].name);
printf("height:%.1fcm¥n", search[i].height);
printf("weight:%.1fkg¥n¥n", search[i].weight);
}
}
2行目の「#define」というのはマクロ定義です。分からない人は、こちらの記事を参考にしてみてください。
実行結果はこのように出力されます。
まとめ
この記事の内容を完璧に覚えたら、構造体はほとんど完璧に近いです。ただ、情報量が多すぎて、ほとんどの人は無理ですよね。
実際、完璧に覚えておく必要は全くないのですが、自分がそのその情報を知りたいときにすぐに見つけられるようにしましょう。例えば、このページをブックマークしておくなど、方法はたくさんあります。
次は、構造体で関数を使用する方法を紹介します。
コメント