[音楽再生] DOUG LLOYD:ポインタ、ここではあります。 これはおそらくに起こっています 最も困難なトピックであること 我々はCS50での話をすることを。 そして、あなたが読んだ場合 ポインタについて何か あなたが少しあるかもしれない前に、 このビデオに行く威圧的。 これは、ポインタ本当です あなたの能力を許可しません おそらく台無しにします かなりひどくあなたがいるとき 変数、およびデータの操作、 そして、、プログラムがクラッシュする原因となります。 しかし、彼らは実際には本当に便利です そして彼らは私たちは本当に素晴らしい方法を許可します バックデータを渡すと、 などの機能との間には、 ことを、私たちは、そうでなければ行うことができません。 だから私たちは本当に ここでやってみたい列車です あなたの良いポインタの規律を持っているので、 あなたが効果的にポインタを使用することができます より良いあなたのプログラムを作成します。 私が言ったようにポインタは、私たちに別のを与えます 機能間でデータを渡す方法。 今から思い出した場合 以前のビデオ、時 私たちは話していました 私が述べた変数のスコープ、 その私たちは間を通過するすべてのデータ C言語の関数は値で渡されます。 そして、私はそれを使用していない可能性があります 私が何を意味するのか用語、 我々は、データのコピーを渡しているということでした。 我々は、関数に変数を渡すと、 私たちは実際に変数を渡していません 関数に、右? 私たちは、のコピーを渡しています 関数へのデータ。 関数がどのようなことがないでしょう それはいくつかの値を算出し、 そして多分私達は、その値を使用 それをバック与えるとき。 唯一の例外にはありました 値渡しのこのルール、 私たちはどのようなものに戻ってきます このビデオでは、後にはほとんどです。 我々は、代わりにポインタを使用する場合 変数を使用します、 あるいはその代わりに変数を使用します 自分自身や変数のコピー、 我々は今の周りの変数を渡すことができます 別の方法で機能間。 これは、我々が行った場合ことを意味し 1機能の変化、 その変更は、実際にかかります 異なる機能の効果。 再び、これは、そのものです 我々は、以前に行うことができませんでした あなたが今までに交換しようとした場合 関数内の2つの変数の値、 あなたはこの問題に気づきました 忍び寄るの一種、右? 我々は、XとYを交換したい場合は、我々 スワップと呼ばれる関数に渡します、 関数の内部で交換します 変数は、為替の値を行います。 一つは2になり、2になります 1、私たちは実際にはありません 元に何かを変更 呼び出し元関数、。 我々は、我々は唯一だことはできませんので、 それらのコピーでの作業。 しかしポインタを、我々はできます 実際に関数にXとYを渡します。 その関数が行うことができます 彼らと何か。 そして、これらの変数値 実際に変更することができます。 だから、中にはかなりの変化です データを操作する能力。 我々はに飛び込む前に、 ポインタは、私はそれが価値があると思います 数分を取って ここに戻って基本に行きます。 そして、どのように見ています コンピュータメモリの動作 これらの2科目を行っているため、 実際にはかなりの相互にすることができます。 あなたはおそらく知っているように、 お使いのコンピュータシステム上の あなたは、ハードドライブを持っていますか、 おそらく、ソリッドステートドライブ、 ファイルの保存場所のいくつかの並べ替え。 それは、どこかで、通常です 250ギガバイトの近傍 今テラバイトのカップル多分に。 そしてそれはどこにあなたのすべてです ファイルは、最終的に生き、 お使いのコンピュータをシャットダウンした場合でも オフ、元に戻すことができます あなたは、あなたのファイルがある見つけることができます もう一度、あなたのシステムを再起動したとき。 しかし、ハード・ディスク・ドライブのようなディスク・ドライブ、 HDD、またはソリッド・ステート・ドライブ、SSD、 ちょうど収納スペースです。 私たちは実際に何もできません ハードディスク内のデータ、 またはソリッド・ステート・ドライブインチ 実際に変更するために、 データまたはそれを動き回ります、 私たちはそれを移動する必要があります RAM、ランダム・アクセス・メモリ。 今のRAM、あなたはたくさんあり​​ます お使いのコンピュータ内の以下です。 あなたがどこかを有することができます 512メガバイトの近傍 古いコンピュータを持っている場合、 多分に2つ、4つ、8、16、 おそらく少しでも それ以上のRAM、ギガバイト。 だから、はるかに小さいのですが、それはです ここで揮発性データのすべてが存在します。 私たちは物事を変えることができるところです。 しかし、我々はコンピュータの電源を切ると、 RAM内のすべてのデータが破壊されます。 我々はハードディスクを持っている必要がありますだから、なぜです それのより恒久的な場所のため、 それをだろうexists-ように、 本当に悪いことかのたびに我々 すべての、私たちのコンピュータをオフにし 私たちのシステム内のファイルが消失しました。 だから我々は、RAMの内部で作業。 私たちが話していると毎回 メモリ、かなり、CS50で、 我々は、RAMではなく、ハードディスクの話をしています。 だから我々は、メモリに物事を移動すると、 それは、空間の特定の量を占めます。 そのデータ型のすべて 我々はと協力してきました 異なる取ります RAM内のスペースの量。 だから、毎回あなたが整数を作成 メモリの変数、4バイト あなたので、RAMに脇に設定されています その整数を扱うことができます。 あなたは整数を宣言することができ、 それを変更し、それを割り当てます インクリメントされた値10に 1、というようにというようにすることによって。 で発生する必要があるすべて RAM、あなたは4バイトを取得 すべてのために動作するように あなたが作成する整数。 すべての文字あなた 作成は、1バイトを取得します。 つまりどれだけのスペースです 文字を格納するのに必要な。 すべてのフロート、本当 番号は、4バイトを取得します それは二重のない限り 単精度浮動小数点 あなたがすることができます番号、 より正確な桁以上を持っています 小数点以下 精度を失うことなく、 これはメモリの8バイトを取ります。 ロングlong型、本当に大きな整数、 また、メモリの8バイトを取ります。 どのように多くのメモリのバイト数 文字列が取るのですか? さてそれでは、その質問にピンを入れてみましょう 今のところ、私たちはそれに戻ってくるでしょう。 だから、バックメモリのこのアイデアなどに バイトサイズのセルの大きさの配列。 それは本当にそれがすべてです、それはです 細胞のちょうど巨大な配列、 ただ、他の配列のようなもの あなたが精通していると参照してください。 すべての要素を除いて1バイト幅です。 そして、ちょうど配列のように、 すべての要素は、アドレスを有します。 配列の各要素 インデックス、私たちを持っています いわゆる行うには、その索引を使用することができます アレイ上のランダムアクセス。 私たちはで起動する必要はありません 配列の先頭、 すべての繰り返し処理を実行 その単一の要素、 我々が探しているものを見つけることができます。 私達はちょうど私が取得したい、と言うことができます 第15回要素または100番目の要素。 そして、あなたはちょうどその数に渡すことができます あなたが探している値を取得します。 同様にすべての場所 メモリ内のアドレスを有しています。 だからあなたのメモリがかもしれません このような何かを見て。 ここでの非常に小さな塊です メモリは、これはメモリの20バイトです。 私のために最初の20バイト そこに一番下のアドレス 0、1、2、3、等です 19までのすべての方法に。 そして、私は、変数を宣言するときに 私は彼らと仕事を開始したとき、 システムは、設定しようとしています 私にとってはさておきいくつかの領域 このメモリで動作するように 私の変数を持ちます。 だから私は、char cが資本に等しい、と言うかもしれません H.そして、何が起こるだろうか? さて、システムをしようとしています 私のために脇に1バイトを設定します。 この場合、バイト数を選択しました 4、アドレス4のバイト、 そして、それは保存するために起こっています 私のためにそこに手紙資本H。 私は、int型の速度を言うなら 制限は、それはだ、65に等しいです 別に4を設定しようとして 私のためにメモリのバイト。 そしてそれはそれらを処理するために起こっています 単一のユニットとして4バイト 私たちが取り組んでいるもののため ここで整数です。 そして、それはそこに65を格納するために起こっています。 今すでに、私は一種のです あなたの嘘のビットを伝えます、 私たちがいることを知っているので、右 コンピュータがバイナリで働きます。 彼らは理解していません 必ずしも資本Hが何でありますか または65は、彼らだけで、何です バイナリ、0と1を理解しています。 だから、実際にどのような 我々はそこに保存しています 文字Hおよび番号65は、ではありません むしろバイナリ表現 その、これ見て このような小さなもの。 特に中 整数変数との関連、 それは、ちょうどにそれを吐き出すことはないだろう それは、1〜4のようにそれを扱うことはないだろう 必ずしもバイトチャンク、 それが実際に起こっています 4 1バイトチャンクとしてそれを治療するために、 これは次のようになります。 とにもこれではありません 完全に真のどちらか、 呼ばれるもののため、 我々はないですエンディアン、 今に取得するつもりはなく、 あなたが興味なら、 あなたは少し上に読むことができます ビッグエンディアン。 しかし、この議論のために、 このビデオのために、 ちょうどそれがあると仮定しましょう​​、で 実際、どのように数65を希望 で表すこと すべてのシステム上のメモリ、 それは完全に真実ではないものの。 しかし、それでは、実際には取得してみましょう すべてのバイナリを取り除く完全に、 ちょうどHとして考えます 65、それははるかに簡単です 以下のようにそれについて考えること 人間としてそれ。 すべての権利なので、それも多分そうです I've-私のシステムその小さなランダム バイト5、6、7、私に与えていません、 整数を格納する8。 その理由は、あまりにも、あります 我々は今に入るが、十分ではありません それはその何言って コンピュータがここにやっています おそらくその部分に良い動きです。 私のメモリを与えないために、 必ずしも背中合わせに。 それは今それを行うために起こっているが、 私は別の文字列を取得したい場合は、 姓と呼ばれ、私が欲しいです そこにロイドを配置します。 私は1つに合わせて必要するつもりです 文字、その者の各文字 1を必要とするだろう 文字、1バイトのメモリー。 だから私は私の配列にロイドを置くことができれば このように私は右、行くにはかなり良いですよ? 何が欠けていますか? すべての文字列我々は働くことを覚えておいてください C言語で、バックスラッシュゼロで終わると 私たちはどちらか、ここでそれを省略することはできません。 我々はさておき、1バイトを設定する必要があります 私たちのことを保持するためのメモリ 私たちの文字列が終了したときに知っています。 だから、再びこのような構成 物事の メモリかもしれないに表示されます 少しランダムで、 それが実際にどのように ほとんどのシステムが設計されています。 倍数でそれらをラインアップするには 再び理由のための4つの 我々はする必要がないこと 今に入ります。 しかし、これは、そうすることを言えば十分 次の3行のコードの後に​​、 これは、メモリがどのように見えるかです。 私は、メモリ位置を必要とする場合 4,8、および12は、自分のデータを保持します これは、私の記憶がどのようなものであるかです。 そして、ちょうど、特にすること ここで、知識をひけらかします 我々は、メモリの話をしています アドレス通常我々 進表記を使用して行ってください。 では、なぜ我々はこれらのすべてを変換しません 10進数から16進数へ それは一般的だという理由だけで どのように我々は、メモリを参照してください。 だからではなく、0〜という 19、私たちは持っていることはゼロであります ゼロX1 3を介してXゼロ。 これらは、私たちのメモリの20バイト 持っているか、私たちは、このイメージに見ています ここ。 それは言われているのだから、すべて、レッツ 第二のためにメモリから離れます バックポインタへ。 ここで最も重要です 覚えておくべき事 我々は、ポインタでの作業を開始します。 ポインタは何もありません アドレスより。 私はので、再びそれを言いますよ それは、その重要です ポインタは何もありません アドレスより。 ポインタは場所にアドレスです メモリ内の変数は、住んでいる場所。 それがうまくいけばなることを知って 彼らと一緒に仕事が少し簡単に。 私が好きなもう一つ 行うには、ソートすることです 視覚的に何を表す図の コー​​ドの様々な線で起こって。 そして、我々は、このカップルやります ポインタの時刻の、 我々は、動的について話すとき メモリの割り当てにも。 私はこれらの図と思うので 特に役立ちます。 だから私は、たとえば言うならば、int型のK 私のコードでは、何が起こっているのでしょうか? まあ、基本的に何をされて起こっています 私は、私のために確保されたメモリを取得しています しかし、私も好きではありません 私は、そのようにそれについて考えます 箱のようにそれについて考えるのが好きです。 私は箱を持って、それはです 色の緑私ので、 緑色のボックスに整数を入れることができます。 それは文字私だった場合 青色のボックスを持っている可能性があります。 私が作成していた場合しかし、私はいつも、言います 整数を保持することができますボックス そのボックスが緑色に着色されています。 そして、私は永久的なマーカーを取ります 私はそれの側にKを書きます。 だから私は、Kと呼ばれる箱を持っています その中に私は整数を置くことができます。 私はint型kを言うときに、それはです 何が私の頭の中で起こります。 私は、kは5に等しいと言うなら、私は何をやっていますか? まあ、私は5を入れています ボックスで、右。 これがあれば、非常に簡単です 私はint型のkは、Kと呼ばれるボックスを作成言います。 私は、kが5に等しいと言うなら、 ボックスに5を入れます。 うまくいけば、それは飛躍のあまりありません。 物事が行くのはここです しかし興味深い少し。 私はint型*のPKを言えば、よく私はしていない場合でも これは必ずしも意味を知って、 それは明らかに何かを持っています 整数とすることができません。 だから私は色に行きますよ 緑っぽいこのボックス、 私はそれが何かを持っている知っています 整数を行うには、 それは整数自体ではありません、 それはint型のスターだから。 何かが少しあります それについて異なります。 だから、整数の関与、 しかし、それ以外の場合はです とあまりにも違いはありません 私たちは話していました。 それはボックスだ、そのには、ラベルを持って それはラベルのPKを着て、 それが保持​​することが可能です それらがあるどのようなint型星、。 彼らは何かを持っています 整数と、明らかに。 ここで最後の行は、しかしです。 私が言う場合はPK =&K、おっ、 何がちょうど、起こったのですか? したがって、この乱数、一見ランダム 数は、そこにボックスの中に投げ込まれます。 つまりすべては、PKであります kのアドレスを取得します。 kは、メモリ内に住んでだから私はこだわっています、 そのアドレス、そのバイトのアドレス。 私がやっているすべては私が言っています その値は、私が行くよ何であります 私のボックスと呼ばれるPKの内側に配置します。 そして、これらのものであるため、 ポインタ、見ているため ゼロXのような文字列で 8ゼロC 7 4 8 2つのゼロと考えられます 非常に意味がありません。 我々は、一般的にポインタを視覚化すると、 私たちは、実際にポインタとしてそう。 Pkが私たちに情報を提供します 我々は、メモリ内のKを見つける必要があります。 したがって、基本的にPKがそれに矢印を持っています。 そして、我々は長さを歩けば その矢印の、想像 我々かどうかは、あなたが歩くことができる何か 矢印の長さに沿って歩きます、 その矢印の非常に先端に、我々 メモリ内の場所を検索します ここで、kが住んでいます。 そして、それは本当に重要です 私たちはここで、kの生活を知っていればいるため、 我々は、データを操作するために始めることができます そのメモリ位置の内部。 私たちは小さなを取得しているものの 今のところ先に自分自身のビット。 だからポインタとは何でしょうか? ポインタは、そのデータ項目です 値がメモリアドレスです。 これは、ゼロのx 8ゼロのものでした 起こって、それはメモリアドレスでした。 つまり、メモリ内の場所でした。 そして、ポインタの型 種類を記述する データのあなたがで見つけることができます そのメモリアドレス。 だからint型のスター部分権利があります。 私はその矢印に従った場合、それはです 場所に私をリードして行きます。 そして、その場所、どのような私 私の例でそこでしょう、 緑色のボックスです。 それはそれはどのような私ですが、整数です 私はそのアドレスに行けばわかります。 データ・タイプ ポインタが何を説明 あなたは、そのメモリアドレスにあります。 だからここにかかわらず、本当にクールなことです。 ポインタは、私たちが通過できるように 関数間の変数。 そして、実際に変数を渡します およびそれらのコピーを渡さありません。 私たちが知っている場合ので、場所を正確に メモリ内の変数を見つけるために、 我々は、のコピーを作成する必要はありません それは、私たちはその場所に行くことができます その変数で動作します。 だから、本質的にポインタでソート コンピュータ環境を作ります より多くの現実の世界のように、右。 だからここに類推です。 のは、私はノートパソコンを持っているとしましょう​​、 右、それはノートのフルです。 そして、私はあなたがそれを更新したいと思います。 あなたはその関数であります アップデートノート、右。 私たちがしてきたように 何、これまでの作業 あなたは私のノートを取るされて起こります、 あなたは、コピー店に行きますよ あなたは、ゼロックスのコピーを作成します ノートブックのすべてのページ。 あなたは戻って私のノートを残しておきます 完了したら、私の机の上に、 あなたは私に行くと物事を横断します 日付や間違っから外れているノートブック、 そして、あなたはバックに渡します 私ゼロックスページのスタック それは私のノートのレプリカであります あなたがそれに加えた変更。 そして、その時点で、それは、私次第です 呼び出し元の関数は、呼び出し元として、 あなたのノートを取ることを決定し、 戻って私のノートPCに統合します。 Soステップの多くがあります 右、ここに関与。 同様に、それは良いではないでしょう 私はと言えば、ちょっと、することができます 以下のための私のノートブックを更新 私は、あなたに私のノートブックを手 あなたは物事を取り、 文字通りそれらを渡ります 私のノートに私のノートを更新します。 そして私は私のノートブックを返します。 それが何のようなものです ポインタは、私たちが行うことができ、 彼らはこのような環境の多く作ります 私たちが実際にどのように動作するかのようなより。 すべての権利ので、それは何です ポインタは、の話をしましょう​​さ ポインタはC言語で作業し、方法について どのように我々は彼らと仕事を開始することができます。 だから、非常に単純なポインタがあります C言語でNULLポインタと呼ばれます。 何もNULLポインタを指します。 それはだようにこれはおそらく、そうです 実際には非常に便利なもの、 私たちが見るよう 少し後に、事実 このNULLポインタが存​​在すること 実際には本当に便利になることができます。 そして、あなたはポインタを作成し、いつでも あなたは、その値を設定していませんimmediately- 設定例 その値直ちに バックカップルのスライドになります 私はPKに等しい&K言ったところ、 PKはとして、Kのアドレスを取得します 我々は、それが何を意味するのかがわかります 我々はそれをコーディングする方法を説明しますshortly- 私たちは何かにその値を設定しない場合 すぐに意味のあります、 あなたは常にべき nullに指すようにポインタを設定します。 あなたはそれが何を指すように設定する必要があります。 それは非常に異なるです そのまま値だけを残します そして、その後の宣言 ポインタとだけ仮定 それはまれに真のだから、それはNULLです。 だから、常に設定する必要があります ポインタの値 あなたは、その値を設定しない場合は、NULLに すぐに意味のあるものに。 あなたは、ポインタの値かどうかを確認することができます 等価演算子を使用して、nullであります (==)、ちょうどあなたが任意の整数を比較したいです (==)を使用して、値または文字値 同様に。 これは、一定の特別な一種です あなたがテストするために使用できる値。 だから、非常に簡単でした ポインター、NULLポインタ。 作成する別の方法 ポインタは抽出することです 変数のアドレス すでに作成しました、 あなたは&を使用してこれを行います オペレータのアドレス抽出。 どの我々はすでに以前に見てきました 最初の図の例で私は示しました。 このため、xは、私たちがきた変数の場合 すでに整数型で作成され、 その後、&xは整数へのポインタです。 &X IS-覚え、&抽出しようとしています 右側のもののアドレス。 そして、ポインタのみがアドレスであることから、 より&xは整数へのポインタであります その値は、ここでメモリのxの生活の中です。 これは、xのアドレスです。 そう&xは、xのアドレスです。 のは、この一歩を見てみましょう さらに何かに接続します 私は前にビデオ内に言及しました。 ARRは、doubleの配列である場合、 &編曲:角括弧私はポインタであります 二重に。 OK。 私、もし角括弧をARR ARRは、doubleの配列であります その後、私は角括弧をARR その配列のi番目の要素、 そして、&角括弧をARR私がどこであります メモリARRのi番目の要素が存在します。 だからここに意味は何ですか? アレイ名、含意 この全体のものの、 配列の名前であるということです 実際に自身のポインタ。 あなたが取り組んできました すべてに沿ってポインタを持ちます あなたは配列を使用したすべての時間。 例から覚えておいてください 変数のスコープに、 私が提示したビデオの終わり近く 私たちは機能を持っている例 セットのint型とAと呼ばれます セット配列と呼ばれる関数。 そして、あなたの挑戦は決定します かどうか、あるいはどのような 我々はプリントアウトした値 関数の最後に、 メインプログラムの終わりに。 あなたはその例からリコールした場合 または、あなたがビデオを見てきた場合には、 あなたはへの呼び出しをyou-がときにことを知っています セットintは効果的に何もしません。 しかし、アレイを設定するための呼び出しが行われます。 そして、私は一種の理由の上に練り それは当時のケースでした。 私はちょうどよく、それは、それが配列のだ、と述べました 特別な、あなたが知っている、理由があります。 その理由は、配列のことです 名前は、実際には単なるポインタであります この特別ながあります 角括弧構文こと で動作するように物事が大きく進歩してください。 そして、彼らはのアイデアを作ります 多くはあまり威圧ポインタ、 そして彼らは、ソートしている理由です その方法で提示します。 しかし、実際の配列は単なるポインタです。 そして、それは、理由はときに我々を 配列に変更を加え、 我々は、パラメータとして配列を渡したとき 関数または引数として 配列の機能に、内容 実際に呼び出される側の両方で変更 呼び出し元インチ の他のすべての種類のどの 私たちが見た変数はそうではありませんでした。 だから、ただで保つために何か あなたはポインタで作業しているときに気にし、 であることの名前 配列実際にポインタ その配列の最初の要素に。 [OK]をので、今、私たちは、これらすべてを持っています 事実、右、続けるのをみましょう。 なぜ我々は気にしません ここで何かが住んでいます。 私が言ったようにまあ、それはかなりです 何かがどこに住んで知っておくと便利 あなたはそこに行くと、それを変更することができます。 実際にそれと協力し、 あなたの事を持っています その変数に有効にやってみたいです、 それのいくつかのコピーでは有効になりません。 これを逆参照と呼ばれています。 我々は、参照に移動し、 我々はそこに値を変更します。 だから我々は、ポインタを持っており、それが呼ばれる場合 PC、それが文字を指し、 その後、我々は* PCと* PCがあると言うことができます 私たちが行く場合は、我々は何を見つけるの名前 アドレスPCへ。 私たちはそこに見つけることが文字であり、 * PCは、私たちがその時にデータを参照する方法です 場所。 だから私たちは次のように言うことができます * PC = Dまたはそのような何か、 それはどのようなことを意味し メモリアドレスのPCであっ どんな文字が以前にありました 私たちは* PC = Dを言う場合があり、現在、Dです。 そこでここでは、再び行きます いくつかの奇妙なCのもの、右。 だから我々はあるとして以前に*を見てきました 何らかの方法で、データ型の部分、 今ではで使用されています わずかに異なるコンテキスト 場所にあるデータにアクセスします。 私はそれが少し混乱知っていると それは実際には、この全体の一部です 以下のように、なぜポインタがこの神話を持っています 彼らの周りの非常に複雑であるとして、 正直、文法問題の一種です。 しかし*両方のコンテキストで使用され、 両方の型の名前の一部として、 私たちは少し表示されます あまりにも他の後に、何か。 そして今であります 間接参照演算子。 だから、リファレンスになり、 そのデータにアクセス ポインタの位置に、及び あなたは意志でそれを操作することができます。 さて、これはと非常によく似ています あなたの隣人を訪問し、右。 あなたが知っていれば何あなたを 隣人はあなたがしている、住んでいます あなたの隣人との付き合いはありません。 あなたが知っているに起こります 彼らが住んでいる場所を知っています、 それはによってそれを意味するものではありません その知識を持っていることの美徳 あなたがそれらと相互作用しています。 あなたがそれらと対話したい場合は、 あなたは、自分の家に行かなければなりません あなたは彼らが住んでいる場所に移動する必要があります。 そして、あなたはそれを行うと、 あなたが対話することができます 彼らとあなたがしたいと思いたいです。 そして、同様に変数を使用しました、 あなたはそれらのアドレスに移動する必要があります あなたがそれらを相互に作用したい場合は、 あなただけのアドレスを知ることはできません。 そして、あなたはアドレスに行く方法です 、間接参照演算子*を使用することができます。 あなたが起こるどう思いますか 我々がしようとする間接参照する場合 値がnullのポインタ? nullのことを思い出してください ポインタが何を指しています。 だから、試してみて、間接参照場合 何もアドレス何に行きますか、 あなたは何が起こるかだと思いますか? さてあなたは、セグメンテーションを推測している場合 フォルト、あなたは正しいだろう。 あなたは試してみて、間接参照した場合 NULLポインタ、 あなたがセグメンテーションを受けます 障害が発生しました。しかし、待って 私は、あなたを教えていませんでした あなたがつもりはない場合 あなたのあなたの値を設定します 意味のあるものへのポインタ、 あなたがnullに設定する必要がありますか? 私はやったし、実際にセグメンテーション 故障が良い行動の一種です。 あなたは、変数を宣言し、持っています すぐにその値が割り当てられていませんか? だから、あなただけのint型のxを言います。あなたはそうしない 実際には何に割り当て し、その後にあなたのコード内で、 xの値を印刷 まだ持ちません 何に割り当てられました。 よくあなたが買ってあげます ゼロが、時にはあなた いくつかのランダムな番号を取得する可能性があり、 あなたはそれがどこから来た見当がつかない。 同様のことをすることができます ポインタを発生します。 あなたはポインタを宣言する場合 int型*例えばPK、 あなたは、値に割り当てません あなたは、メモリの4バイトを取得します。 どんな4バイト システムメモリは、することができます いくつかの意味のある値を持っていることがわかります。 そして、そこであったかもしれません すでにそこにその何か もはや別で必要とされていません 機能、あなただけの持っているので、 どんなデータがありました。 あなたは何を参照解除を行うにしようとした場合 あなたがそこにいたdon't-いくつかのアドレス すでにのバイト情報 そこに、それはあなたのポインタになりましたです。 あなたがしようとすると、そのポインタを間接参照する場合は、 あなたはいくつかのメモリをいじりされるかもしれません あなたが意図していなかったこと それがすべてを台無しに。 そして、実際にあなたが行うことができます 本当に壊滅的な何か、 以下のような別のプログラムを壊します、 または、他の機能を破ります またはその悪質な何かを あなたは全くやるつもりはなかったです。 そしてそうそれはそれはだ理由です 実際に良いアイデア あなたの場合はnullにあなたのポインタを設定します 意味のあるものにそれらを設定しないでください。 それは、おそらく良いでしょう あなたのプログラムのために一日の終わり それが何をするために、次にクラッシュします 何かのネジアップ 別のプログラムまたは別の機能。 その行動にもおそらくあります ちょうどクラッシュ未満理想的。 そしてそうそれはそれはだ理由です 実際に良い習慣 あなたのポインタを設定するに取得します あなたがそれらを設定しない場合は、NULLに 意味のある値に あなたが知ってすぐに、値 あなたは間接参照安全にできること。 それでは、すぐに戻って来て、見てみましょう 状況の全体的な構文で。 私はint型* pを言うなら;,私は何をしましたか? 私がやったことはこれです。 私は、pの値がアドレスを知っています すべてのポインタだけであるため、 アドレス。 私は、pを逆参照することができます *演算子を使用。 ここでこのような状況において、非常に トップ*は型の一部である思い出します。 INT *データ型です。 しかし、私は逆参照することができます *演算子を使用してP、 私はそうならば、私はそのアドレスに行けば、 私はそのアドレスで何を見つけるのだろうか? 私は整数があります。 だからint型* pは基本的に 言って、pはアドレスです。 私がすることができますP間接参照とする場合 私は、私は整数を見つけます そのメモリ位置に。 [OK]をので、私は別のがあったと述べ 星と迷惑なもの ここでどこにいるのです 星と迷惑な事があります。 あなたは今までに宣言しようとしています 同じタイプの複数の変数 コー​​ドの同じ行の? だから秒間、その行をふり、 私は実際に緑にそこに持っているコード 存在しない、それだけでint型のx、y、zの言う;. 何のことだろうと、実際に作成することです あなたのための3つの整数変数、 Xと呼ばれるもの、と呼ばれるもの yおよびzの一方が呼び出されます。 それはせずにそれを行うための方法です 3行に分割すること。 星が得るのはここです しかし、再び迷惑な、 *が実際に一部であるため、 両方のタイプの名前と一部の 変数名の。 そして私がint * PX、PY、PZを言うならば、どのような私 実際に取得するには、整数へのポインタです pxと二つの整数、PYおよびPZと呼ばれます。 そして、それはおそらく何ではありません 我々はしたい、それが良いではありません。 だから私は、複数のポインタを作成する場合 同じ行に、同じタイプの、 私は実際に必要なものや星、 行うにはint型* PA、PB *、* PCを言うです。 今だけのことを言いました そして今、あなたにこれを伝えます あなたはおそらくこれを行うことはありません。 そしてそれは、正直なところ、おそらく良いことです あなたが誤っている場合があるため、 星、そのようなことを省略します。 それは多分宣言するのが最善です 個々の行のポインタ、 それはちょうど別の一つです それらの迷惑な構文の 作る星との事 で動作するように非常に困難ポインタ。 それだけでこの構文的だからです あなたを介して仕事をしなければならない混乱。 練習で、それはありません 本当に第二の天性になります。 私はまだ、まだそれで間違いを犯します 10年のためのプログラミングの後、 何かが起こる場合は怒ってはいけません あなたに、それは正直かなり一般的です。 それは一種の本当にです 構文の欠陥。 [OK]をので、私は一種の約束しました 我々は、再検討することを どれだけ大きいかの概念は文字列です。 さて、私はそれをあなたに言った場合 文字列、我々は一種の本当にしました あなたに全体の時間を嘘をついています。 呼ばれるにはデータ型がありません 文字列、および実際に私 私たちのいずれかでこれを言及 データ型の最も初期のビデオ、 その文字列は、そのデータ型でした CS50.h.であなたのために作成されました あなたは、#includeする必要があります それを使用するためにCS50.h。 まあ文字列は本当にあります 何かの別名 、のchar *と呼ばれます 文字へのポインタ。 まあポインタ、リコール、 ちょうど対処しています。 だからサイズは何ですか 文字列のバイト単位の? まあそれは4つまたは8つです。 そして、その理由は、私が言う四、 8は、実際にはそれからです あなたが使用している場合、システムに依存します CS50のIDEは、のchar *は、charのサイズです *それは、64ビット・システムの、8です。 メモリ内のすべてのアドレスは64ビット長です。 あなたはCS50アプライアンスを使用している場合 または任意の32ビットマシンを使用して、 あなたはその用語の32ビットを聞きました マシン、32ビットマシンは何ですか? まあ、それだけですべてのことを意味し メモリ内のアドレスは32ビット長です。 だから32ビットは4バイトです。 だからのchar *は、4または8であります お使いのシステムに応じてバイト。 実際に任意のデータタイプ、 そして、任意のデータへのポインタ すべてのポインタがちょうどであるため、入力 アドレスは、4または8バイトです。 それでは、これを再検討しましょう それでは、結論図としましょう ここで少しの運動で、このビデオ。 だからここに私たちがオフに左の図です ビデオの最初に。 私は* PK = 35と言うのであれば、何が今起こりますか? だから、* PK = 35、私が言うとき何を意味するのでしょうか? 秒を取ります。 * PK。 ここで文脈において、*は 間接参照演算子。 だから、ときに間接参照 オペレータは、使用されています 指さ我々はアドレスに移動 PKにより、我々は我々が何を見つける変更します。 だから* PK = 35効果 画像にこれを行います。 だから、基本的には構文的です = 35と述べたkののと同じ。 もう一つ。 私はint型のメートルを言うなら、私が作成します メートルと呼ばれる新しい変数。 新しいボックスが、それは緑色のボックスのためです それは整数を保持するために起こっています、 それはMのラベルが付いています。 私は、M = 4と言うなら、私は置きます そのボックスに整数。 言えば、PK =&M、どのように この図の変更? PK =&M、あなたは何を思い出すん &演算子はないかと呼ばれていますか? その&いくつかの変数名を覚えておいてください 変数名のアドレスです。 それでは、私たちが言っていることです PKは、Mのアドレスを取得します。 だから効果的に何が起こりますか 図は、それはもはや点をPKで K、しかしメートルを指します。 再びポインタが非常にあります で作業するのが難しいです 彼らは多くのを取ります 実際、しかし理由 あなたを可能にする能力の 機能間でデータを渡すために 実際にそれらを持っています 変更が有効になり、 周りにあなたの頭を取得 本当に重要です。 これはおそらく、最も複雑です 我々はCS50で議論する話題、 ただし値が ポインタを使用してから取得します 遠く合併症を上回ります それは彼らの学習から来ます。 だから私はあなたのベストを望みます 運がポインタについて学びます。 私はダグロイドだけど、これはCS50です。