• ベストアンサー

配列のポインタ?

3つ質問があります。 1  if ( ! *name [ loc ] ) break ;    ポインタ宣言もせず、    配列に*を付けて使用する事は問題ないんですか? 2  この文は、何になったら、breakするんですか?    教えてください。 3  breakは、if文を抜けますか? for文を抜けますか?    教えてください。    お願いします。 char name [100][40]; char number [100][40]; int loc=0; void a(void) {    for (;loc<100;loc++){     if (loc<100){       printf ("名前、電話番号を入力\n");       gets (name[loc]);       if (!*name[loc])break;       gets ( number[loc]);    }   } }

質問者が選んだベストアンサー

  • ベストアンサー
noname#22650
noname#22650
回答No.3

配列宣言した変数の変数名だけを使うと、 配列の先頭要素のアドレスが分ります。  char n[10];  printf("%x\n",&n[0]); //配列の先頭の要素のアドレス  printf("%x\n",n); //配列宣言した変数をそのまま使う 上記のprintf文は同じ内容を表示します。 つまり n は &n[0] と同様に働きます。 また、それをポインタ変数のように使えます。  char n[10];  char *p;  p = n; // p = &n[0]; と同じ意味になります。  *n = 'a'; //*p = 'a'; つまり n[0] = 'a'; と同じ意味になります。  printf("%c %c %c\n", *n, *p, n[0]); // a a a と表示されます。 今回の質問1ですが、2次元配列になって少し複雑ですが、 name[loc] は、配列の先頭要素のアドレス &name[loc][0] と同じですから、 *name[loc] は name[loc][0] と同じ意味になります。 質問2 入力された文字列の先頭要素がヌル文字(0)であればbreakします。 つまり何も入力されなかった場合ですね。 質問3 break文は内側のループを抜ける命令なので、この場合for文を抜けます。

noname#168725
質問者

お礼

すばやい回答ありがとうございます。 配列とポインタの関係勉強になりました。 ヌル文字を読み取っていたんですね! 詳しい回答どうもあいがとうございました!

その他の回答 (3)

回答No.4

蛇足ながら。 該当行はこう書き換えた方が判り易そうですね。 if (name[loc][0] == '\0') {   break; } それから、gets()をfgets()に置き換えるなら例えばこうなります。 fgets(name[loc], sizeof(name[loc]), stdin);

noname#168725
質問者

お礼

回答ありがとうございます。 if (name[loc][0] == '\0')は解りやすいですね! fgetsの書き方も教えていただきありがとうございました。

noname#22058
noname#22058
回答No.2

本題とは特に関係ないことですが、 ・gets関数は、入力文字列の長さをチェックしません。  そのため、別の変数用に割り当ててある領域を破壊し、  思わぬ不具合の原因となりかねません。  fgets関数を使う方がよいでしょう。 ・if(loc < 100) のif文は不要です。  その上のfor文の継続条件と重複しています。

noname#168725
質問者

お礼

すばやい回答ありがとうございます。 いろいろ気ずかなかったポイントを教えてもらい ありがとうございました。

  • crew21
  • ベストアンサー率26% (58/222)
回答No.1

1. 問題ないです。でも要は、名前が入力されてるかどうかのチェックなので、name[loc][0]とかの方がパッと見で分かり易いかも。 ※もっと分かり易い変数の宣言・定義がありますが、失礼ながら質問者さんのレベルだと混乱すると思うのでやめておきます。 2. 名前の入力が為されないでリターンキーを押したときです。 3. for分を抜けます。従ってgets ( number[loc]);は実行されません。 。。。て答え書いちゃいましたけど、自分でprintf分を随所に入れれば分かることですよ。人に訊くのは容易いですが、そういう作業がご自分のプログラミング上達に確実に繋がります。

noname#168725
質問者

お礼

すばやい回答ありがとうございます。 解りやすいお答えどうもです!

関連するQ&A