【C言語】配列をマスターしよう!
  • facebookページ
  • twitterページ
  • 2017.09.23

    【C言語】配列をマスターしよう!

    配列はC言語特有の言語仕様ではなく、ほとんどのプログラミング言語が持つ機能です。
    複数の同じ型のデータを添え字を使って使い分ける事が出来る便利な機能です。

    基本的な考えとしては5個の配列を宣言すると、使えるのは添え字が0, 1, 2, 3, 4の5の領域となります。
    添え字が0からというのは少しわかりずらいかもしれませんね。でも、C言語のforループは以下のように記述すると思います。

    C言語はとても合理的に設計されている言語ですので、そういう意味において配列は他のプログラミング言語とは少し異なる部分がありますが、その点をしっかり理解すればそれほど難しいものではありません。

    C言語での配列の宣言、初期化、バリエーション


    C言語は変数は必ず宣言が必要ですが配列も同じく使用するには宣言が必要です。
    C言語には配列の宣言としていくつかバリエーションがありますが、ここでは代表的なものを見てみましょう。

    配列の基本的な宣言

    コメントにもあるようにint型の変数を配列として30個使えるようにした宣言です。

    例えば、30人のテストの得点を配列を使わず宣言すると、

    のように30の変数を宣言する必要がありますが、配列では上記のように1つの変数を宣言するだけで30人分の得点を処理する事が出来ます。

    宣言時に配列を初期化する場合

    次に宣言時に配列を初期化してみましょう。

    このように右辺に{}囲った値を書くことで変数の初期化が行えます。
    この場合、配列を初期化する場合、要素数は必ずしも必要ではありません。ですので、tokuten1とtokuten2に対する初期化はいずれも同じ結果になります。

    次の配列を多次元で宣言する方法です。多次元と言っても大体は2次元までの配列であることが多いと思います。

    配列の多次元宣言

    30人の生徒の5科目の得点を格納するケースを想定してみました。一般には上記のような場合は構造体を配列として格納する事が多いと思いますが、
    コーディング量を減らすには、上記のようなプログラミングもありと思います。他の人(3日後の自分も含めて)がこのプログラムを読むとなんの事か分かりにくくなるため推奨はしません。
    100歩譲って。であれば、科目の添え字はdefineくらいはしたいですね。

    配列宣言のシンタックス

    ここまでの配列の宣言をより普遍的に表現すると、配列の宣言は以下のよう記述する事が出来ます。
    <データ型> <配列の変数名>[[要素数]] = [初期値, 初期値2, …];

    データ型 必須。また、C言語で扱えるデータ型であれば、どのようなデータ型であっても配列として宣言、使用する事ができます。
    変数名 必須。C言語で扱える変数名ルールに則る必要があります。
    要素数 必ずしも必要ではありません。
    初期値 必ずしも必要ではありません。初期値を記載しなければ、他の変数同様、初期値は不定になります。

    C言語の第二の鬼門 配列


    このように30人の生徒の5教科の得点を格納するだけであればさほど難しいものではなかったと思います。
    ですが、配列はC言語の第二の鬼門と呼んでもいいものです。
    当然、第一の鬼門はポインターですが、これまでの例から配列がポインターに匹敵するような鬼門であると想像される方は少ないかもしれませんが、
    配列とポインター自体がとても密接な関係にありますし、文字列とも密接な関係にあるのです。

    例えば、

    この違い分かるでしょうか?
    まぁ日頃のプログラミングでこのようなコーディングはほとんどしないと思いますが、コメントにもあるようにこのstr1とstr2はまったく異なる文字列を格納しています。
    なんだか一気に分かりずらくなりましたが、以降で詳しく見ていきましょう。

    C言語は文字列も配列で表現

    まず、1つ目のstr1の列ですが、この初期化を分解すると以下のようになるのです。

    ここまでは分かりやすいと思います。宣言と初期化を分けただけですからね。では、この初期化した内容をprintfで出力する場合、どうなるでしょうか?

    1つ目のprintfは初期化の書き方に充実ですので分かりやすいかと。しかし、一般的には2つ目のprintfの書き方になります。
    これは何を言っているかと言うと、C言語では文字列をchar型変数の配列として扱うためです。

    C言語には文字列型という型がありません。
    K&R(カーニハン&リッチー。C言語の神様)がC言語に文字列型を作らなかった理由は分かりませんが、char型の配列十分。と判断したのではないでしょうか。

    もっと直感的に記述すると以下のような記述になります。これで文字列と配列が密接であると理解頂いたのではないでしょうか。

    配列とポインター

    ここまでの例では配列のデータ型にintやcharしか使ってきませんでしたが、str2のようにポインター型の配列も宣言する事ができます。
    当然、他のどんなデータのポインターであっても宣言に使うことができます。

    静的、動的


    配列の宣言時に要素数は必ずしも記述必要がないと言いましたが、要素数を指定した配列を静的。指定しない配列を動的と言います。
    他のプログラミング言語も同じような考えですが、C言語は静的に宣言した配列の要素数を後から変更する事はできません。
    ですので、データの個数によって要素数を変更したい場合は動的に配列を宣言する事になります。
    動的に配列を宣言する場合は以下のようなコーディングになります。

    ここでもポインターが出てきましたね。
    この例ではint型で要素数が5個の動的配列を宣言したのと同じ事になります。

    このようにC言語の配列は言語仕様自体がシンプルなC言語において、他の言語仕様と密接な関係にあるいう事を理解して頂けたと思います。
    まずは基本としての配列をしっかり理解したあと、文字列のおさらいとして配列の理解をさらに進め、鬼門であるポインターとの関係、ポインター自体の理解につながればC言語マスターはあと少しでしょう。


    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料10万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテキャンバナー ポテキャリバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア

    関連ワード

    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE