質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1103閲覧

先頭要素のアドレスの表し方を教えていただきたいです。

nana.na

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/05/13 11:16

最近、C言語の勉強を始めました。
そこで、すっきりわかるC言語という本で学習しています。
その中の課題でどうしてもわからないものがあったので、教えていただきたいです。

typedef struct MONSTER {
char* name;
Element element;
int maxhp;
int hp;
int attack;
int defense;
} Monster;
typedef struct DUNGEON {
Monster* monsters;
const int numMonsters;
} Dungeon;

こちらのDungeon構造体の内容の意味がわからないです。
本には、ヒントとして、「先頭要素のアドレス」と「繰り返し」の2つの情報を構造体メンバーとしてもっていると書いています。
先頭のアドレスについて調べてみても”&変数”と出てきます。
Monster* monsters;
const int numMonsters;
こちらは、どういった意味なのか教えていただきたいです。
宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Dungeon内には常に10匹のMonsterがいるのなら

C

1typedef struct DUNGEON { 2  Monster monsters[10]; // 10匹分のMonster配列 3} Dungeon; 4... 5Dungeon d; 6... 7for ( int i = 0; i < 10; ++i ) { 8 d.monsters[i] に対してなんかする 9}

これ↑でOK。

ところが何匹いるか固定されていないなら

C

1typedef struct DUNGEON { 2  Monster* monsters; // numMonsters匹のMonsterが格納された配列の先頭 3 int numMonsters; // ダンジョンには monsters[0]~monsters[numMonsters-1] が棲んでいる 4} Dungeon; 5... 6Dungeon d; 7... 8for ( int i = 0; i < d.numMonsters; ++i ) { 9 d.monsters[i] に対してなんかする 10}

ってやります。

投稿2021/05/13 11:34

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nana.na

2021/05/14 22:38

教えていただきありがとうごうございます。 個数が分かる場合は、配列で要素数を決めたらいいですが、個数が決まっていない場合は、配列の先頭の情報を渡すことで後に、モンスターの個数の変更ができると分かりました。 ありがとうございました。
guest

0

それがわからないとすれば、それ以前の問題として「配列」が理解できていないのではないかと思います。

C言語では、配列とはある要素を密にメモリ上に並べたものです。
密に並んでいるので、最初の要素の場所(=ポインタ)がわかれば、芋づる式に2個目、3個目の要素にもアクセスできるはずです。なので、Cでは配列を扱うときに最初の要素へのポインタを以て扱うことがしばしばです。というか、配列を([ ]などナシに)記述すると、先頭要素へのポインタとして評価することになっています。逆に言えば、あるポインタが指している場所から同じ型のデータを密にならべてやればそれは配列として機能することになります。ただし、この扱い方をすると配列の要素数は自動ではくっついてこないので、必要ならプログラマが別途要素数を管理してやらなければいません。

つまり、今回の構造体で扱いたいのは実はモンスターの群れ(配列)なのです。
Monster* monsters; には、モンスターの並びの一番先頭へのポインタを格納します。
const int numMonsters;には、モンスターの並びの数を格納します。

投稿2021/05/13 13:04

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nana.na

2021/05/14 22:42

質問に答えていただきありがとうございます。 配列の構造が理解できていないことを知れて良かったです。 Monster*には先頭のアドレスが入っていることだと理解できました。 ありがとうございます。
guest

0

ベストアンサー

ネットでざっと探してみました。

ちょっと長いですが、C言語入門。ポインタと構造体を読むことをお勧めします。

投稿2021/05/13 22:41

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nana.na

2021/05/14 22:44

ご回答ありがとうございます。 この記事を読んで、ポインタ、構造体、配列が理解できていなかったことに気が付きました。 また、ポインタについてよく知れて、他の疑問だったことも解決できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問