今回は多次元配列を学びます。配列は「変数の箱の集まり」だと説明しました。多次元配列を使うと、より多くの変数を便利に管理することが出来ます。早速ですが、下の表を見て下さい。上の図は今まで学んだ配列のイメージ図です。下の図が今回学ぶ多次元配列の 二次元配列 「【c言語】図で理解!二次元配列の基礎を丁寧に解説」の記事に詳しく解説しています。 二次元配列も使うので、ぜひ一緒に読んでみてください。 最後に一言+配列の課題. ・大学では経済学を専攻し、国際経済・情報経済・金融経済を主に学び、派生として現代アジア経済学・行動経済学・心理学・法学・経営学を学ぶ。 Copyright © 2019 モノづくりC言語塾 All Rights Reserved. 「extern宣言」というものを見たこと・聞いたことはあるけど、その正体がいったい何なのかを理解していない方って結構います。, C言語において「extern宣言」は複数ファイルによるシステム構成において、グローバル変数を共有するための仕組みです。, 「extern宣言」はグローバル変数と強い関連性を持った機能です。そのため、まずは「グローバル変数」について理解しましょう。, C言語の変数には大きく分けて「グローバル変数」と「ローカル変数」の2つが存在します。, このように変数を定義する場所によって、「グローバル変数」と「ローカル変数」が変化します。, 「グローバル」と「ローカル」の名が表す通り、この違いは参照可能な範囲に違いがあります。, C言語におけるこのようなシステムは、主に3つの参照範囲(スコープ)で構成されることになります。, グローバル変数とは、③のシステムスコープを標準で備えている変数です。つまり、異なるファイルからでも参照することが可能です。, 「extern宣言」とは、この③の「システムスコープ」に関するグローバル変数の参照を可能にするための機能なのです。, ②の「ファイルスコープ」の変数に関しては『C言語 staticを変数と関数に付ける価値【保護の仕組みを解説】』で解説しています。, main.c側において次のように「定義されていない識別子」というビルドエラー(正確にはコンパイルエラー)が発生します。, コンパイラは「main.c」を翻訳する際に、「gNumber」というシンボルが何者なのかを把握しておく必要があります。, しかし、コンパイラは唐突に登場した「gNumber」シンボルに対して「定義されていません!」とエラーを発行したのです。, 別ファイルである「sub.c」に定義された「gNumber」をコンパイラは知ることができないのです。, コンパイラについて詳しく知りたい方は『C言語 コンパイラの役割【エラーの取り除き方の鉄則教えます】』の記事を見ておきましょう。, コンパイラやリンカに関する知識は、プログラミングと関係ないように思うかもしれませんが、すごく大事な知識なんです。「コンパイラ」や「リンカ」を知ることは、C言語の仕組みを知ることなんですよ。, 「extern」とは「外部」という意味です。つまり、変数に対する「extern宣言」とは, この時に注意しなければならないのは、決して初期化してはならないことです。つまり、次のようなプログラムは書いてはいけません。ビルドエラーが発生します。, 「extern」とは宣言なのです。初期化とは「定義」に対して行うものであり、実体を持たない宣言に対しては実施できません。, 具体的にプログラムで示しましょう。先ほどのプログラムは次のように変更することでビルドが通るようになります。, main.cの中に「extern」を付与した変数定義を行いました。これにより、コンパイラに対して「別のファイルで定義された変数です」と伝えることができます。, 「extern」を付けた変数定義は「定義」ではなく「宣言」という扱いとなり、変数がメモリに実体化されません。, externを伴う「グローバル変数の外部参照宣言」と「グローバル変数の定義」はソースファイルとヘッダファイルに分けて定義します。, このあたりのルールに関して把握していない方は『C言語 ファイル分割の考え方【何を基準に分けるのかを解説】』を見ておくとよいでしょう。, sub.cの管轄となっている「gNumber」グローバル変数は、sub.hに「extern宣言」を行うのが正しい構成です。, ヘッダファイルを経由して参照したい側のファイルは「extern宣言」を取り込むのです。, このような部品をファイルのどこに配置するかは暗黙のルールで決まっています。しっかりと覚えておきましょう!, ここまでさんざん「extern宣言」を解説しておいてはなんですが、20年近く開発した経歴の中でわたしは「extern宣言」を実際の開発の中で使用したことがほとんどありません。, 変数とは「データ」を管理するための箱であり、「データ」とはプログラムの世界において厳重に保護されるべき対象なのです。, グローバル変数にするということは、無防備にデータへのアクセスを許すということになります。, 意図するか意図せずかは関係なく、誰でも変数の情報を読み書きできる状態となるということです。それはとても危険なことなのです。, 大規模開発では、様々な人たちが各担当のソースファイルを管理しています。最終的にはそれらが1つのシステムとして結合されて動くのです。, 皆さんが管理するグローバル変数を、どこかの誰かが誤って書き換えてしまうかもしれませんよ!, グローバル変数をファイル間で共有することが良くないとするのであれば、いったいどのように共有すればよいのでしょう。, オブジェクト指向言語に触れたことがある方は「カプセル化」という概念を聞いたことがあるかもしれません。, C言語はオブジェクト指向言語ではありませんが、疑似的に「カプセル化」を作り出すことができます。, 例えば「gNumber変数」には0~500の値しか設定できない情報だったとしましょう。「カプセル化」を行ったプログラムは次のようになります。, グローバル変数にstatic修飾子を付けることにより、「main.c」からはグローバル変数「gNumber」に直接アクセスできないようにしています。, ※static修飾子を知らない方は『C言語 staticを変数と関数に付ける価値【保護の仕組みを解説】』参照。, setNumber関数では引数の値をチェックし、問題なければgNumber変数へ設定しています。不正な引数であれば設定できないようにしています。, システムをモジュールという形でうまく分割すると「extern宣言」という機能は使うことはほとんどなくなるはずです。わたし自身、「extern宣言」が絶対必要というシーンに出会ったことがありませんから。, 本格的なモジュール分割のやり方について知りたい方は『マイコン入門編』を体験するとよいでしょう。, これは関数の「プロトタイプ宣言」と呼ばれるものです。「関数のプロトタイプ宣言にextern宣言なんて付けたことないよ~」という方も大勢いることでしょう。, そうなんです。関数のプロトタイプ宣言の「extern宣言」は省略することが可能であり、実践的には「extern宣言」をしている方はほとんどいないのです。, プロトタイプ宣言について詳しく知りたい方は『C言語 プロトタイプ宣言の効果【関数を安全に呼び出す仕組み】』を見ておくとよいでしょう。, わたしもプロトタイプ宣言には「extern宣言」を付けることはありません。付ける手間が増えるだけです。, しかし、ファイルを跨いで共有したい状況を生み出している考え方自体を改善する力を蓄えましょう。, 年間200人以上のプログラミング初心者・未経験者を直接指導で教育している現役エンジニアです。, 本サイトでは開発経験20年のノウハウ・学習ポイント・カリキュラムを全力でわかりやすく解説します!, 関数のプロトタイプ宣言が、何を目的として書かなければならないのかを知っていますか?目的を知ることでプロトタイプ宣言を書く重要性を感じることができます。プロトタイプ宣言が存在する真の意味を理解しましょう。, C言語を扱う上でよく利用する機能を紹介します。標準ライブラリ関数の使い方やC言語で利用するキーワードの解説など、様々なC言語に関する情報をお届けします。, 独学でプログラミングを始めようとしている方へのC言語入門学習カリキュラムです。C言語を学ぶために必要な知識を順序立てて解説します。順に進められる構成となっており、課題が用意されているため理解を確認しながら進めることができます。. ・社会人新卒ではIT企業でエンジニアとして就職。. 2次元配列って使ってますか?2次元配列はポインタを使うと1次元配列と同じように扱うことができます。 文字列と同じように扱うことができるということですので簡単に扱うことができて便利です。3次元や4次元と多次元になればなるほど一見扱うのが難しいと感じるかもしれませんが、結局 … プログラムにおける配列とは同じデータ型の変数が複数連続でメモリに並んだものです。配列を使う便利さとは何かを学びます。配列を扱うルールや2次元配列も学びましょう。 Copyright © 2019 モノづくりC言語塾 All Rights Reserved. 2次元配列では、複数ある配列を2回でグループ分けが可能です。分かりやすく言えば、学校のクラス名と同じです。小学校のクラス分けは、, のようになりますが、この場合だと、クラスという配列を学年、組で分けています。この分け方が、まさに2次元配列だと言えます。, 2次元配列を「文字列を分けて代入する」という目標に向かって説明していきます。最初に覚えるべきポイントをまとめます。, 2次元配列に文字を代入すると、その文字には2つの数字が割り当てられます。2つの数字は, 例えば、「Blog」と「Muu」の2つの文字列の場合、文字列の多い「Blog」の文字数に合わせて「5」という数字で変数宣言する必要があります。「a」という配列名だと, ですが、今回はより簡単な「変数宣言と同時に文字列を配列に代入する方法」を使います。, その方法が分からない人、もしくは何で変数宣言で5を使うか分からなかったひとは、こちらの記事を参考にしてください。, 出力するときはa[0]、a[1]という文字列を指定すればそれぞれの文字列を出力することができます。, 今回学習した2次元配列をうまく使いこなせばとても便利になります。例えば、他のファイルの文章を「for文」と「scanf」で読み取って、1文ずつ分けることもできます。他にもできることはたくさんあります。今回学習した2次元配列の「グループ分け」の概念は、「構造体」に少し似ています。, 理系大学生で、プログラミングなどを学んでいます。主にC言語、C++をいじっています。Python、Julia、HTML、CSSも勉強中です。 最近はGuidemanというSNSサイトを作成しています。, C言語での文字列の使い方が分からない。文字列の文字数と用意した配列の数が一致しないのは何で?¥0って何?今回はこんな悩みを解決していきます!, 構造体変数に配列を使いたい!構造体が難しくて分からない。複数の情報をまとめて管理できるプログラムを知りたい!この記事を読めば、これらの悩みを解決できます。, 他のファイルに保存された文章をプログラムで読み取り出来たらなあ。Visual Studioのコマンドプロンプトの使い方が分からない。この記事を読めばこれらの悩みを解決できます。, C言語はプログラミングスクールに行かなくても習得出来ます。このサイトでは現役大学生が0から学習する初心者のために、全46回でC言語の基礎を学習できるようにまとめました。少し勉強するだけでも1か月後にはだいぶ変わるはずです!想像してみてください。1か月後にC言語をマスターしている自分の姿を。0円でC言語をマスターしてみ, ポインタとアドレスの関係を知りたい!ポインタを分かりやすくまとめて欲しい。どうしたら他の変数のアドレスをポインタのアドレスに代入することができるの?この記事を読めば、これらの悩みを解決できます。.