[Powered by Google Translate] 配列について説明しましょう​​。 では、なぜ我々はこれまでに配列を使用したいのでしょうか? さてさて、あなたは5の学生IDを格納するために必要なプログラムを持っていると言う。 それは、5つの個別の変数を持っている合理的なように思えるかもしれません。 我々は少しでわかるの理由から、我々は0から数え始めます。 我々はあるでしょう変数のデータ型はint ID0、ID1 int型などになります。 我々は、学生IDに実行したい任意のロジックは、コピーと貼り付けする必要があります これらの学生IDのそれぞれについて。 私たちは、学生はCS50にたまたまあるかをチェックしたい場合 我々は最初のID0がコースの学生を表しているかどうかをチェックする必要があります。 その後、次の生徒のために同じことをすること、我々は、ID0のコードをコピーして貼り付ける必要があります とID2、3、および4のようにID1のID0のすべてのオカレンスを置換します。 できるだけ早くあなたが我々がコピーして貼り付ける必要があることを聞くと、 あなたはより良い解決策があることを考え始めるべきである。 今度は何あなたが5学生証ではなく7を必要としません実現したら? あなたは、あなたのソースコードに戻って、ID5に追加するID6が必要 IDはこれらの2つの新しいIDのクラスに属している場合にチェックするためのロジックをコピーして貼り付ける。 一緒にすべてのこれらのIDを接続するものは何もありませんし、そう問う方法はありません 6を介してIDが0のためにこれを行うためのプログラム。 さて、あなたは100学生証を持って実現する。 それは、別々にこれらのIDのそれぞれを宣言する必要があると理想よりも少ないように見えるし始めている そして、それらの新しいIDの任意のロジックをコピーして貼り付ける。 しかし、多分私たちが決定され、我々はすべての100人の学生のためにそれを行うている。 しかし、あなたが実際に存在するどのように多くの学生が知らない場合はどうなるでしょうか? そこにいくつかのN学生はわずかであり、あなたのプログラムはnであることをユーザーに問い合わせる必要があります。 ああええと。これは非常にうまく機能するつもりはない。 あなたのプログラムは、学生だけのある一定数のために動作します。 これらの問題のすべてを解決することは、配列の美しさです。 だから配列は何ですか? いくつかのプログラミング言語では配列型は、もう少しやることができるかもしれない しかしここで私たちは、あなたがCでそれが表示されます同じような基本的な配列データ構造に焦点を当てていきます 配列はメモリの大きいだけのブロックです。それはそれだ。 我々は10個の整数の配列を持っていると言うとき、それはちょうど私たちはいくつかのブロックを持っていることを意味 10独立した整数値を保持するのに十分な大きさのメモリのその。 整数は4バイトであると仮定すると、これはつまり、10個の整数の配列 メモリ内の40バイトの連続した​​ブロックです。 あなたは私たちがここに行くことはありません多次元配列を使用する場合でも、 それだけで、まだメモリの大きなブロックだ。 多次元表記は単に利便性です。 あなたは整数の3多次元配列によって3を持っている場合は、 その後、あなたのプログラムは本当にわずか36バイトの大きなブロックとして扱います。 整数の総数は3回3であり、それぞれの整数は4バイトを占有します。 のが基本的な例を見てみましょう。 我々はここで宣言する配列の2つの異なる方法を見ることができます。 我々は、コンパイルするプログラムのためにそれらの1をコメントアウトする必要があります 私たちは二回xを宣言して以来。 我々は少しの宣言のこれらの2つのタイプの違いのいくつかを見てみましょう。 これらの行の両方は、サイズnの配列を宣言し、 ここで我々は#10としてNを定義しています。 我々は同じように簡単に正の整数をユーザーに尋ねたかもしれない 我々の配列の要素数と、その整数を使用していました。 前に私達の学生証の例のように、これは完全に独立した10を宣言するような種類のものである 虚数変数; XN-1までにX0、X1、X2、など。 我々は配列を宣言する行を無視して、角括弧はそのまま気付く forループの内側。 我々は、私はちょうどXブラケット3のように読んであげるX [3]のようにして、記述するときは、 あなたは虚X3を求めたいと考えることができます。 そのカッコの中に数字、サイズN、この手段の配列よりも注意してください 我々はインデックスと呼びます、、0からN-1まで何もすることができます これは、N個の指標の合計です。 これが実際にどのように動作するかを考えること 配列はメモリの大きなブロックであることを忘れないでください。 整数は4バイトであると仮定すると、全体の配列xはメモリの40バイトのブロックです。 だから、x0は、ブロックの非常に最初の4バイトを指します。 X [1]次の4バイトなどを指します。 これは、xの開始が今までが追跡するために必要なすべてのプログラムであることを意味します。 は、x [400]を使用する場合は、プログラムは、これが同等であることを知っている xの開始後わずか1600バイトまで。 我々から1600バイトを取得where didの縮約形?これは、整数あたりわずか400回4バイトです。 上に移動する前に、それが実現することは非常に重要だとCで 我々は配列で使用するインデックスのない執行はありません。 私たちの大きなブロックは、10個の整数長いですが、我々はx [20]と書いた場合、何も私たちを怒鳴りつけるません あるいはX [-5]。 インデックスが偶数である必要はありません。 それは、任意の式を指定できます。 プログラムでは、配列のインデックスにforループからの変数iを使用しています。 これは、i = 0のから配列の長さにループして、非常に一般的なパターンです その後配列のインデックスとしてiを使用して。 アレイ全体にわたってあなたが効果的にループこのように、 そしてあなたは、配列内の各スポットに割り当てるか、またはいくつかの計算のためにそれを使用することができます。 最初のforループでは、iは、0から始まります ので、それは配列の0点は、値を0回2に割り当てられます。 次にiをインクリメントしており、値が1回2配列の最初のスポットを割り当てます。 その後、我々は、配列内のN-1個の位置まで上に再びので、私は増分割り当てられるまで 値N-1回2。 だから我々は、最初の10個の偶数を使用して配列を作成しました。 多分、xよりも変数のビットより良い名前だっただろう追いついた それは離れて物事を与えているだろう。 2番目のforループは、ちょうど我々がすでに配列の内部に格納した値を出力します。 配列宣言の両方のタイプを使用してプログラムを実行してみましょう そしてプログラムの出力を見てみましょう。 限り我々が見ることができるように、プログラムは、宣言の両方のタイプの同じように動作します。 我々は、Nで停止しないように、最初のループを変更した場合にも、何が起こるかを見てみましょう むしろ万を言う。 配列の終端を越えて道。 おっと。たぶん、あなたは前にこれを見てきました。 セグメンテーションフォールトは、プログラムがクラッシュしたことを意味します。 あなたが触れるべきではないメモリの領域に触れるときは、これらを見始める。 ここでは、xの最初を超え万箇所に触れている これは明らかに我々が触れてはいけません、メモリ内の場所です。 だから、私たちのほとんどは、おそらく誤って、Nの代わりに10,000を我慢できないだろう 我々が言うように、より微妙な何かをしたら、何よりも小さいまたはNに等しい書き込み N未満とは対照的にするためのループ条件で 配列だけ0からN-1までのインデックスを持っていることを忘れないでください、 これは、インデックスNが配列の終わりを超えていることを意味します。 プログラムは、このケースではクラッシュしないかもしれませんが、それはまだエラーだ。 実際には、このエラーは、それはそれ自身の名前を持っていることが非常に一般的な 1エラーでオフ。 それは基本的なことはそれだ。 だから、配列宣言の2つのタイプの主な違いは何ですか? メモリの大きなブロックがどこに行く一つの差である。 私はブラケット配列型と呼ぶことにします最初の宣言、内 これは、従来の名前をしたものではまったくないにもかかわらず、 それはスタックに積まれます。 私はポインタ配列型と呼ぶことにします第二に、一方で、それは、ヒープ上に行きます。 これは、関数から戻るとき、ブラケットの配列が自動的に解放されることを意味します あなたはexplicitilyポインタ配列の空き呼び出す必要がありますように、一方 さもないとすると、メモリリークが発生している。 また、ブラケットの配列は、実際に変数ではありません。 これは重要です。それはただのシンボルだ。 あなたは、コンパイラはあなたが選択する定数と考えることができます。 これは、我々はx + +はブラケットタイプを持つような何かを行うことができないことを意味 これは、ポインタ型と完全に有効ですが。 ポインタ型は可変です。 ポインタ型のために、我々はメモリの2つの独立したブロックがあります。 変数x自身は、スタックに格納されており、ちょうど単一のポインタである しかし、メモリの大きなブロックは、ヒープに格納されています。 スタック上の変数xは単にアドレスを格納 ヒープ上のメモリブロックの大きい。 これの一つの含意は、演算子のサイズである。 あなたがブラケット配列のサイズを求めるなら、それはあなたのメモリの大きなブロックの大きさを与えるが、 40バイトのようなもの、 しかし、配列のポインタ型のサイズを求めるなら、 それはあなたのアプライアンスでは、4バイトだけ可能性がある変数x自体の大きさを与える。 ポインタ配列型を使用して、それを直接求めることは不可能である メモリの大きなブロックのサイズ。 我々は非常にまれにサイズがほしいと思っていませんので、これは通常、制限のあまりないです の大きなメモリのブロック、そして我々がそれを必要とする場合、我々は通常、それを計算することができます。 最後に、ブラケットの配列は、配列を初期化するためのショートカットを提供してくれることを起こる。 我々は、ショートカットinitilizationを使用して、最初の10個の偶数の整数を書くことができるか見てみましょう。 ポインタ配列を使用すると、このようなショートカットを実行する方法はありません。 これは、ちょうどあなたが、配列を使って何ができるかを紹介します。 彼らは、あなたが、ほとんどすべてのプログラムに表示される。 うまくいけば、あなたは現在、学生IDの例を行う良い方法を見ることができます 動画の先頭から。 私の名前はロブ·ボーデンであり、これはCS50です。