C言語 入門 小学生でもわかるC言語2

十二日目 構造体とポインタ

「わかりやすく!」がテーマです!

HOME/小学生でもわかるC言語2 目次/十二日目 構造体とポインタ/

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

新品価格
¥2,462から
(2016/5/10 22:16時点)

もっと!C、C++言語本

目次へ戻る

?と思ったら

わからなそうな用語集

構造体とポインタ

しばらく離れておりましたが、再びポインタのお時間です。

ため息が聞こえてきそうですが、避けては通れない道なのでがんばりましょう!

まずは構造体の変数をポインタにしてみます。

構造体ポインタ

/*プログラム40*/
#include <stdio.h>

struct DENWABOOK{
	char *name;
	char *tel;
};

int main(){
	struct DENWABOOK no1;
	struct DENWABOOK *no1_p;

	no1.name = "鈴木一郎";
	no1.tel = "09011111111";

	no1_p = &no1;

	printf("お名前:%s 電話番号:%s\n",no1_p -> name,no1_p -> tel);

	return 0;
}

■実行結果■

実行結果(e-12-1)

構造体でポインタを使う場合もキホンは変わりません!

ポインタの事は覚えておりますでしょうか?

先頭に「*」アスタリスクをつければポインタ変数になるんでしたね!

int *p;

これを構造体に変えるだけです!

struct DENWABOOK *p;

これだけで大丈夫です!

さきほどのプログラムでは「*no1_p」ですね!

そして同じようにアドレスを保存します!

アドレスは先頭に「&」アンパサンドでしたね!

no1_p = &no1;

これで「no1_p」にアドレスが保存されました。

では最後に使う時ですね!見たことのない記号がありますね!

「->」

こちらです。前回までの「no1.name」の「.」コンマの部分が「->」になりました。

これもまあ・・・。そのまま覚えてください!

no1_p -> name;
no1_p -> tel;

とにかく!

ポインタの場合は「->」です。これを「矢」のようなカタチをしている所から「アロー演算子(えんざんし)」っていいます!

他の関数に構造体を渡す(ポインタの場合)

/*プログラム41*/
#include <stdio.h>

struct DENWABOOK{
	char *name;
	char *tel;
};

void func(struct DENWABOOK *);

int main(){
	struct DENWABOOK no1;

	no1.name = "鈴木一郎";
	no1.tel = "09011111111";

	func(&no1);

	printf("お名前:%s 電話番号:%s\n",no1.name,no1.tel);

	return 0;
}

void func(struct DENWABOOK *no1_p){
	no1_p -> name = "佐藤三郎";
	no1_p -> tel = "09012345678";
}

■実行結果■

実行結果(e-12-2)

他の関数に渡す場合もキホンは変わりません。

まずはプロトタイプ宣言ですね!

普通の変数でポインタを関数に渡す時は

void func(int *);

でしたね。では構造体の場合は

void func(struct DENWABOOK *)

同じように「*」アスタリスクをつけます。

そして「int main()」内で関数「func」に渡します!

func(&no1);

先頭に「&」アンパサンドですね。

あとは関数「func」の内容ですね!

void func(struct DENWABOOK *no1_p){

	no1_p -> name = "佐藤三郎";
	no1_p -> tel = "09012345678";

}

受け取る変数名を「*no1_p」に決めました。

内容を知りたい時はやっぱり「->」アロー演算子です!

構造体の中に構造体

構造体は変数なので、構造体の中に他の変数と同じように構造体を入れる事もできます!

ちょっとややこしいので一つ一つやっていきましょう!

まず内容ですが、ロールプレイングゲームのキャラクターのステータスを構造体で作って、

その装備としてもう一つ構造体を作ろうと思います。

まずはキャラクターのステータスですね!

名前「太郎」年齢「20」構造体の名前「PARTY」

これを構造体にします。

struct PARTY{
	char *name;
	int age;
};

ここまでは何度もやっているので大丈夫ですね!

名前「char *name」年齢「int age」としました。

次にその装備を構造体として作ります。

武器「鉄の剣」防具「鉄の鎧」構造体の名前「SOUBI」

こんな内容で作ってみます!

struct SOUBI{
	char *buki;
	char *bougu;
};

これも別々に考えれば簡単ですね!

武器「char *buki」防具「char *bougu」としました!

構造体の中に構造体を入れる

ではこれをさっきの構造体「PARTY」に入れるには、どうしましょう?というお話ですね。

普通の変数は「int age」というようにできます。

構造体の場合も変わりません。

という事は

struct SOUBI tarou_soubi;

これを中に入れれば良さそうです。

他の変数と同じくここで「tarou_soubi」と変数の名前を決めている所に注意です。

まとめると

struct PARTY{
	char *name;
	int age;
	struct SOUBI tarou_soubi;
};

このようにそのまま構造体を入れます。

ではプログラムを組んでみましょう!

構造体を書く順番に注意

/*プログラム42*/
#include <stdio.h>

struct SOUBI{
	char *buki;
	char *bougu;
};

struct PARTY{
	char *name;
	int  age;
	struct SOUBI tarou_soubi;
};

int main(){
	struct PARTY tarou;

	tarou.name = "太郎";
	tarou.age = 20;
	
	tarou.tarou_soubi.buki = "鉄の剣";
	tarou.tarou_soubi.bougu = "鉄の鎧";

	printf("名前:%s 年齢:%d\n",
		tarou.name,tarou.age);
	printf("武器:%s 防具:%s\n",
		tarou.tarou_soubi.buki,tarou.tarou_soubi.bougu);
	
	return 0;
}

■実行結果■

実行結果(e-12-3)

2つの構造体を書く順番に注意です!

「struct PARTY」の中で「struct SOUBI tarou_soubi」と変数名まで決めているので、その前に「struct SOUBI」の内容を書かないとエラーになります。

あとはさきほど説明したとおりですね!

ではその内容を見たい時は、

tarou.tarou_soubi.buki;

「構造体の中の構造体の中の内容」って感じですね!

「.」ドットで区切りを入れてますね!

構造体「SOUBI」の中に武器の性能として構造体を入れたりなんかすると

tarou.tarou_soubi.buki.buki_seinou;

みたいにえんえんと奥に奥に続けられるワケです。

関数〜ポインタ〜構造体

さきほどの構造体にポインタなんかを入れたりしたら

taoru->tarou_soubi.buki;

みたいに途中が「->」アロー演算子になったりします。

とにかくややこしい!

ので何回も関数らへんからプログラムを組んでみて、きちんと覚えてから先に進む事をオススメします!

次回は関数とポインタについて見ていきます。

次回

十三日目 関数ポインタ

□ページの先頭へ□

□目次へ戻る□

広告

↓2014年06月20日発売↓

14歳からはじめるC言語わくわくゲームプログラミング教室 Visual Studio 2013編

新品価格
¥2,500から
(2016/5/10 22:17時点)

↓2014年10月25日発売↓

超本格! サンプルで覚えるC言語 3Dゲームプログラミング教室

新品価格
¥3,110から
(2016/5/10 22:18時点)

↓2013年07月25日発売↓

小学生からはじめるわくわくプログラミング

新品価格
¥2,052から
(2016/5/10 22:21時点)

↓2016年05月13日発売↓

小学生からはじめるわくわくプログラミング2

新品価格
¥2,052から
(2016/5/10 22:22時点)

もっと!C、C++言語本