トーク:C言語/配列

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

"配列の文法についての制限" 節が間違っている[編集]

もし宣言時に、部分的に、ある要素の型を他の型と違うように思っても、そもそも、そのような構文じたいが用意されておらず、よって、部分的に型を違うものにする行為は不可能である。

なので、たとえば、配列では、けっして、例えば「山田の成績、国語は80点、数学は70点」の意味で「"山田"(文字型), 80(数値型), 70(数値型)」のような成績表などは、つくることはできない。

上記のように記述されていましたが、そんなことはありません。
共用体(union)を用いることで、配列の要素毎に異なる型を使うことができます。以下はその例です。

#include <stdio.h>

/* mix_t 型は char 型の配列、もしくは int 型 */
union mix_t {
    char string[100];
    int number;
};

int main(void)
{
    union mix_t student[3] = {
        {.string = "山田"},
        {.number = 80},
        {.number = 70}
    };
      
    printf("名前: %s, 国語: %d点, 数学: %d点\n",
           student[0].string,  /* student[0] は char 型の配列として扱う */
           student[1].number,  /* student[1] は int 型として扱う */
           student[2].number); /* student[2] は int 型として扱う */

    // => 名前: 山田, 国語: 80点, 数学: 70点
    
    return 0;
}

構造体の重要性について語りたいのかもしれませんが、それは構造体の項目で語ればいいのであって、この項目で語ることではないと思います。--Siglite3 (トーク) 2018年7月1日 (日) 11:51 (UTC)

少し悩みましたが、以下の理由から編集そのものを取り消しました[1]
  1. 前提が間違っている(節全体を書き直す必要がある)ため、記述を再利用できそうにないこと
  2. 配列の次元について、記述が重複しており、冗長であること
最初に配列の次元や2次元配列の話をされてもピンとこないと思いますし、2次元配列については後半に記述するほうがよいでしょう。 --Siglite3 (トーク) 2018年7月1日 (日) 13:18 (UTC)


  • (すじにくシチューのコメント) 了解しました。「共用体」の存在をすっかり忘れてました。もし配列の項目で構造体のハナシをしたら、配列も知らない初心者に「共用体」までも話さざるを得ず、教育的に非効率ですね。おっしゃるとおり、構造体の項目に構造体配列の説明を回しましょう。--すじにくシチュー (トーク) 2018年7月2日 (月) 01:36 (UTC)