DAVIDマラン:こんにちは、と CS50に戻る歓迎。 だから、これは、週4の終わりです。 まずひとつ発表。 だから、いわゆる第五月曜日です この来る月曜日来る。 これはから変更する機会です 手紙グレードへ/ UNSATのSAT、またはから 手紙グレード/ UNSATを土 うるさく、そのプロセスが必要とし 署名は、入力する必要があるため それらのピンクのアド/ドロップのいずれかの形式外。 なぜなら技術的に、SAT / UNSAT バージョンと手紙グレードバージョン 個別のカタログ番号を持っている。 しかし、大したことない。 ただ、私のところに来るか、ロブに または任意の時点でローレンへ。 あなたが種を持っていない場合、または私達に電子メールを送り 書類のあなたは、今日必要とする、と私たち あなたが取る手助けして確実である 月曜日の前にそれの世話。 すべての権利なので、今日は - 実際に、エコーのビットがあります。 私たちは、私に少しトーンダウンすることはできますか? OK。 だから、今日、我々は、トピックを紹介 ポインタとして知られている。 そして、私は、これはの一つであることは認めるよ 私たちがする傾向があることを、より複雑なトピック このクラスでカバーするか、実際に任意の C.を使用しています入門コース しかし、特に、それは私の言葉を取る あなたの心はもう少し曲がっ感じるなら 今日と週間で来る。 それはあなたが得ることの代表ではありません これでどんな悪くそれだけであることを意味 それは特に高度なトピックだ 私が約束したので、数週間 それ故に、あまりにも驚くほどだと思われる 振り返ってみると分かりやすい。 私はまだこの日に覚えています。 私はエリオットのダイニングホールに座っていた、 私のTFニシャットメータの隣に座って、 エリオット家の居住者が誰であった。 そして、いくつかの理由のために、この トピックでは、ただクリック。 私も苦労していると言うことであるかどれ 一定の時間のためにそれが、私と そのようなを避けるのを助けるために最善を尽くします その最終的な話題と闘争 かなり強力です。 実際には、我々は説明しますのいずれかのトピック 週間で来ていることです のセキュリティ、およびどのようにあなたが実際にすることができます の方法でマシンを活用 それは、意図されていなかった。 そして、それらの悪用は通常です バグ、その我々のミスの結果 人々は、いくつかを理解しないで作る 基礎となる実装の 詳細はそれを介してプログラムが作られています。 さて、これはすべてのより多くのユーザーに見えるようにする 優しい、私は10をプレイしようと思いました 少しクレイメーションの第二プレビュー に持って来られたBinkyの名前の数字 スタンフォード大学の我々の友人によって生命、 教授ニックParlante。 だから私はあなたにこれを与えることができ ここBinkyののティーザー。 [ビデオの再生] - ねえ、Binkyの。 起きて。 これは、ポインタの楽しみのための時間です。 - どのようなそれはだ? ポインタについて学ぶ? ああ、グッディ。 [ENDビデオ再生] DAVIDマラン:スタンフォードです コンピュータサイエンス。 だからもっとそれに来ています。 [拍手] DAVIDマラン:申し訳ありませんが、ニック。 だから我々に終了し、最後の時間を思い出す これは本当にエキサイティングな接戦 それによって、この関数 単に動作しませんでした。 少なくとも直感的に、それはフェルト のようにそれが動作するはずです。 単に値をスワッピング 二つの整数の。 しかし、我々はプリントアウトしたときにことを思い出してください メイン、もう1つは元の値 二人は、彼らはまだ1つだったと 2としない2と1。 だから私は、実際に切り替えてみましょう アプライアンスにオーバー。 そして、私は内骨格コードのビットを書いた 私はXと主張するところ、ここで進める 1になり、yは2になります。 私はその後、彼らの両方をプリントアウト プリントfの値。 私はその後、ここでダウンして主張している 我々はそれらを交換するつもりだ。 私は、私たちにはここを空白のスポットを残し ほんの一瞬で、今日に記入。 その後、私はそれを主張するつもりだ 2つの変数が入れ替わっている。 それから私は印刷するつもりです 再びそれら。 そしてうまくいけば、私は1、2を参照する必要があります。 2、1。 それは超簡単です 今目標。 だから私たちはスワッピングについてどのように行くのですか 二つの変数? さて、私はこれらのカップことをここで提案している場合 コンピュータのメモリを表す場合があります。 これは、いくつか刺されている 別のいくつか刺されています。 我々は、最大でボランティアに来たかもしれないと おなじみの場合、私たちにいくつかの飲み物を混ぜて? までさあ。 あなたの名前は? JESS:ジェス。 DAVIDマラン:ジェス? 、アップジェスをさあ。 あなたが気にしないならば、我々は配置する必要があります あなたにGoogleのグラスたちができるので これを不死化。 OK、ガラス。 映像を記録します。 し、[OK]を、私たちは、にぴったり ここジェスと行く。 わかりました。 よろしくね。 それでは、私はあなたがここで何したいのです - 非常に迅速に、あなたができれば - ちょうど私達にオレンジの半分ガラスを注ぐ ジュース、牛乳の半分ガラス、 効果的に数字1を表す 他のカップに1カップと2インチ これは良い映像になるだろう。 JESS:申し訳ありません。 DAVIDマラン:いや、いや。 それはOKです。 ニース。 そうすべての権利、私たちは4バイトを持って オレンジジュースの価値がある。 我々は、それは値1と呼ばれるでしょう。 今、牛乳の価値が他の4バイト。 それは値2を呼び出します。 それぞれ、xおよびyはそう。 すべての権利、今手元の作業であれば - すべての前のあなたのために、ジェス、 クラスメートの - xとyなどの値を交換することです 我々は中にオレンジジュースを望んでいる 他のカップと、このカップに牛乳、方法 あなたかもしれない - あなたが実際に行う前に、 それは - これをやって行く? OK、決定を賢明。 だから、少しより多くのメモリを必要とする。 だから、一時的に割り当ててみましょう カップ、可能ならば。 そして今、xとyを入れ替えるに進みます。 優秀。 だから、非常によくやった。 、そんなにジェスをありがとうございます。 はい、どうぞ。 少しお土産。 [OK]を、ので、明らかに、超シンプルなアイデア。 我々はビットが必要であることを完全に直感的な より多くの記憶領域 - この形で、 カップ - 私たちが実際にしたい場合 これら2つの変数を入れ替える。 それでは、正確に行うことができます。 ここまでで、私は私が主張するところの間に いくつかのスワップを行うことになるだろう、私はよ 先に行くと、温度を宣言します。 そして、私は、言うに等しいxはそれを設定します。 それから私は、の値を変更するつもりです ただジェスのようなxがと一緒にここにいた 牛乳とオレンジジュース yに等しくなるように。 そして、私は等しくなるように、yを変更するつもりです 今、我々は次のようになりませんようにためのx、 サークルで立ち往生、むしろ温度。 どこで一時的に - 場所やジェス 一時的にオレンジジュースを入れて それをつかう前に ミルクカップ。 だから私は今、先に行くと、これを作ってみましょう。 それはnoswap.cと呼ばれています。 そして今、私は全くスワップを実行していないことができます。 私が展開すると、実際に、私は、以下を参照してください 窓少し、その xは1であり、yは2である。 そして、xが2であり、yは1である。 しかし、月曜日に我々は物事をしたことを思い出してください 少し違ったそれによってI 代わりに、ヘルパー関数を実装 あなたがする場合は、それが実際に無効であった。 私はそれがスワップと呼ばれる。 私はそれを二つのパラメータを与え、私が呼ばれる それらは、と私は彼らがBと呼ばれる。 率直に言って、私は彼らに、xとy呼び出すことができます。 停止は何もありません ことをやってから私。 しかし、私はそれがだと主張するだろう 少し曖昧。 なぜなら月曜日リコール私たち これらのパラメータがあったことを主張した 値のコピーが渡された あなたととてもそれだけで台無し 心、私が思うに、あなたが使用している場合 まったく同じ変数。 だから私は、代わりに呼ぶことにします aおよびbは、単に明確にするために。 しかし、我々はそれらのほとんどを呼び出すことができ 私たちが望む何でも。 そして、私はコピーして貼り付けるつもり そこにから効果的にこのコード ここにダウン。 私はそれが動作することを見たので。 だからかなり良い形でだ。 そして私は、私のXに自分Xを変更します に、私のY BとBに私のyに。 だから、他の言葉で、まったく同じロジック。 ジェスがしたことはまったく同じこと。 そして、私がしなければならない一つのこと ここでは、もちろん、今ではこれを呼び出すことである 関数、またはこの関数を呼び出します。 だから私は2で、この関数を呼び出します 入力、xとy、および保存を押してください。 すべての権利なので、根本的に 同じこと。 実際に、私はおそらくプログラムを作りました によって不必要に複雑な ただ取っている関数を書く コー​​ドの一部6行に対し、I 以前に実装されていた わずか3でこれ。 だから私は今、先に行くと、リメイクさせ これは、スワップをしない。 すべての権利、私はここで台無し。 これは、可能性があるエラーでなければなりません あなたのように、ますます一般的に見 プログラムが複雑になる。 しかし、簡単な修正はあり。 私はここに戻って上にスクロールしましょう​​。 そして、私は見ている最初のエラーは何ですか? 暗黙の宣言。 それは一般的に何を示すのでしょうか? ああ、私は試作品を忘れてしまった。 私はそのスワップコンパイラを教えるのを忘れて 存在するために起こっているにもかかわらず、彼 冒頭には存在しません プログラムの。 だから、僕は、無効、スワップを言うつもりです int型、int型、B、セミコロン。 だから私はそれを再実装するつもりはない。 しかし、今、それはここでダウンしていたものと一致。 、予告、セミコロンの欠如 ここで、これは必要ではないとき 実装。 だから私はこれをリメイクさせて、スワップをしない。 はるかに良い形。 全くスワップを実行しません。 と畜生。 我々は月曜日にいたところ今度は私達は戻って、 どこの事は交換しませんでした。 と直感的な説明は何ですか これがそうである理由のために? うん? 学生:[聞こえない]。 DAVIDマラン:その通り。 そうbはxとyのコピーである。 あなたがしてきたし、実際には、いつでも これまでその機能を呼び出す int型のように変数を渡し - スワップはここで期待しているのと同様に - 君たちにはコピーを渡してきた。 今では少しかかることを意味する のための時間の、一瞬、 1からビットをコピーするコンピュータ 別のビットに可変。 しかし、それはそのような大したことではありません。 しかし、彼らはそれにもかかわらず、コピーしている。 そして今では、スワップの文脈において、 私は正常、実際に午前 aとbを変更。 実際には、迅速に行うみましょう 正気をチェック。 私は、新しい行%であるFを印刷します。 とにしましょう​​プラグ。 今、Bと同じことをしてみましょう。 そして、ここで同じことをしてみましょう。 そして今、私はそれらの同じ行をコピーしてみましょう 再び機能の下部にある 興味深いの私の三行の後 実行され、ている可能性が 再びまだaとbを印刷します。 だから今のこれをしてみましょう、スワップをしない。 私はターミナルウィンドウを作ってみよう 少し背が高く、我々が見ることができるように 一度にそれ以上の。 と全くスワップを実行しません。 xは1であり、yは2である。 1であり、bが2である。 次いで、2であり、bは1である。 だからそれだけでジェスのように、取り組んでいる ここで内部スワップのでした。 もちろん、それは何も影響を及ぼさないだ メインの変数に。 だから我々は、それによって我々のトリックを見た 右に、この問題を解決するだろうか? あなたは、このスコープに直面しているとき 問題は、あなただけパントとXを作ることができる とyどんな代わりの変数? あなたは彼らがグローバル作ることができます。 ファイルの最上部に置く 私たちも、15のゲームで、行ったように。 私たちは、グローバル変数を使用しています。 しかし、ゲーム15の文脈において、 それはグローバルを有するのが妥当だ 、ボードを表す変数理由 15.cの全体が全てです そのゲームの実装について。 それはファイルが何を存在するものだ。 しかし、ここで、この場合、私はよ 関数スワップを呼び出す。 私は2つの変数を交換したい。 そして、それだけでずさんな感じ始めるべき もし我々のすべての解決策 我々はスコープに実行する問題 問題は、それがグローバルにすることです。 非常に迅速に私たちのプログラムであるため かなり混乱になろう。 そして我々はその非常に控えめにしました 15.c.で結果として そこうちしかし、それは変わり 完全に良い方法。 私は実際に戻って削除してみましょう ただ、このコードを簡素化するために、Fのを印刷してください。 そして、私はそれを提案してみましょう これは、確かに、悪いです。 しかし、私はその代わりに、いくつかのアスタリスクに追加する場合 そして星は、私の代わりにこれを回すことができる の一つに機能 実際に運用。 だから私はここに戻って行くと言って認めてみましょう アスタリスクは、常に困難である ので、私は星を言うよ。 私はちょうどそのいずれかに白状します。 わかりました。 そして今、何を私がつもり 代わりにするか? すべてのだから最初、私が指定するつもりです その代わりにint型を渡す スワップ機能は、私の代わりによ int型星を言おうとした。 さて、スターは何を示すのでしょうか? これは、ポインタの概念であること Binkyの、クレイメーションの文字があった 前の瞬間に言及。 だから我々はint型星、の意味を言えば これは今であることを行っていないということです その値によって渡された。 それはインチコピーするつもりはない むしろ、のアドレスである 渡されようとして だからあなたのコンピュータのその内部を思い出す そうしないと、メモリの全体の束である RAMとして知られている。 とRAMだけであることを バイトの全体の束。 お使いのMacまたはPCには、持っているのであれば 2ギガバイト、あなたは2を持っている メモリの億バイト。 今ちょうどそれだけを仮定してみましょう 我々は、物事が良いと整然と保つ アドレスを割り当てる - 数 - お使いのコンピュータ内のRAMのすべてのバイトに。 それらの2の非常に最初のバイト 億は数字のゼロである。 次は、数バイトのナンバーワンである までの2つの、すべての方法、ドットドット およそ20億にドット。 だから、バイト数缶 お使いのコンピュータのメモリ。 だから何だと仮定してみましょう 我々は、アドレスの意味。 だから私は何が起こっているint型星、見るとき 今スワップに渡される のアドレス。 はなく、その値が、どのようなその郵便 アドレスは、いわば、です - RAM内の位置。 同様にBのために、私は行くよ 同じことを言うこと。 int型、星、B。 余談ですが、技術的にはスターとして 他の場所に行くことができます。 しかし、我々はされて星に標準化します データ型のすぐ隣。 だから署名が今意味スワップ、私を与える int型のアドレス、およびコール そのアドレス。 と私の別のアドレスを与える そのアドレスbをint型と呼ぶ。 しかし、今ここに私のコードは変更する必要があります。 なぜなら私はint型温度を宣言した場合 - これは、int型はまだです - しかし、私は、それに格納 値の種類? 明確にするために、私はと入れています 今書かれたようなコード? 私は場所を入れている。 しかし、私は気にしない 今場所は、右? 温度は、ちょうどジェス '三杯を存在 存在し、どのような目的のために? 値を格納する。 牛乳やオレンジジュース。 実際のアドレスを記憶しない 感じているそれらのもの、のいずれか この現実の中で少し無意味 とにかく世界コンテキスト。 だから本当に、私は一時に入れたいもの のアドレスではなく、ある の内容。 123のような数であるのであれば、これは ちょうどそのメモリの第123バイト 、占領であることを起こる、その値 に占めることを起こる。 、私は、そのアドレスに行きたい場合は、 私は星と言う必要があります。 同様に、私は何に変更していた アドレスに、私が変更 これが起動します。 私がで何で保存したい場合 場所で何と場所 Bの、星B星。 これは非常にではないので、要するに、たとえ まだでシンク - と私は期待していない それはとても速いだろうと - 私がやっているすべての前置されていることを実感 これらの星私の変数へ、 と言って、値を取得しないでください。 値は変更しないでください。 むしろ、それらのアドレスに行く と値を取得します。 そのアドレスと変更に行く そこに値。 だから今、私が先頭に戻ってスクロールアップしてみましょう だけに、ここでは、この行を修正する 一致するプロトタイプを変更してください。 しかし、私は今ではもう一つのことを行う必要があります。 直感的に、私は種類を変更した場合 スワップは、期待されていることを引数の 私は他に何をする必要がありますか 私のコードに変更しますか? 私はスワップを呼び出すとき。 今、何が入っているので 私はまだ交換に渡す? 値xとyの値、または 牛乳とオレンジジュース。 しかし、私はそれを行うにはしたくない。 私の代わりに何を渡したいですか? 、xの位置および yの場所。 彼らの郵便のアドレスは、どのようなものがあります いわば。 だから、それを行うには、アンパサンドはあり。 アドレスのような音のアンパサンド一種。 そうN、アンパサンド、アドレス のx、およびyのアドレス。 だから、我々が使用することを意図的だ アンパサンド関数を呼び出し、 と星宣言しとき 機能を実現する。 としてそして、ちょうどアンパサンド考える 演算子のアドレス、などの星 オペレータはそこに行く - または、より適切に、 間接参照演算子。 だから、それはただの言葉の全体の多くは、だ 今、うまくいけば、スワップが起こっていると言う 正しいように。 私が先に行くと作ってみよう - 実際にはないように、ファイルの名前を変更てみましょう このプログラムはまだないスワップと呼ばれません。 私たちは、今ではswap.c呼ぶだろうことを主張している。 だからスワップ、作る。 ドット、スラッシュ、スワップ。 そして今実際に、xは1であり、yは2である。 そして、xは2であり、yは1である。 まあ我々はこれを行うことができないかどうかを確認してみましょう 何のように異なって少し ここで起こって。 まず、私は我々の上にズームインさせ ここで画面を描画。 と私は一瞬提案してみましょう - と 私はここに描く時にミラーリングされます 今そこに - 私はそれを提案してみましょう ここでは、メモリの全体の束です、または RAM、私のコンピュータの内部。 そして、これは、一口数になります の言う、1を聞かせて。 これは、バイト数2になります。 そして、私はより多くの全体の束を行い、よ その後にドットドットドットの束 20億があることを示している これらの事。 4,5、等が挙げられる。 だから、最初の5バイトがあります 私のコンピュータのメモリ。 大丈夫? 20億のうち、ごく少数。 しかし、今私が提案するつもりです 次。 私はxがしようとしていることを提案するつもりだ 番号1を格納し、yが起こっている 番号2を格納する。 と私は今、先に行くと表してみましょう これらの値は以下の通りである。 次のようにこれを実行しましょう​​。 私だけ一秒を与えます。 一秒。 OK。 私はこの小さなを作りたい - 再びこれを行うてみましょう。 そうでなければ私はに行って使用しています 同じ数字、思わず、 複数回。 だから私たちは異なる番号を持っている について話をする、のはこのバイトを呼び出してみましょう 番号123、124、125、126、 ドットドットドット。 そして、私は私がするつもりだ今主張してみましょう ここで値1、値2を入れて ここで、そうでなければ、xとyとして知られています。 だから、それはちょうどようになりますか これは、xが、これはyです。 そして、ちょうどいくつかの偶然によって、 コンピュータ、オペレーティングシステム、 場所にXを入れて起こった 数123。 とyは位置124で終わった - 畜生。 私はこれを修正しているはずです。 男はああ、私は本当にこれをやりたいのですか? はい、私はこれとを固定したい 今日はこれについて適正なB。 申し訳ありませんが、これに新しい。 127、131、、私はこのようにしたくなかった 複雑な、しかし、なぜ私が変更したの そこに数字? 私はint型にしたいので、 実際には4バイトである。 それでは、これについてスーパー肛門とする。 だから1が対処しなければ発生した場合という 123、2は、アドレスであることを行っている 127それだけで4不戦勝距離だから。 それがすべてです。 そして我々はすべてのことを忘れるだろう 世界の他のアドレス。 だからxが、位置123にある yは位置127にあります。 そして今、私は実際に何をすべきか やってみたい? 私は今、スワップを呼び出すと、何です 実際に起こっている? まあ、私はスワップを呼び出すときに、私が渡しています xとyのアドレスのアドレス。 だから例えば、もしこれら二つ 紙から今2を表す 引数と私は何を、交換するB 、これらの最初に書くつもり 私はを参照して呼び出すつもりれる? 正確には、123。 だから私は主張するこれは。 これはパラメータです。 私はそこのxのアドレスを入れている。 何それ? 何それ? いや、いや。 それでOKです。 まだ良い、まだ良い。 だから、これはです。 そして今、紙の2枚目に、 これは、Bになるだろう、と私は何です に書くことになるだろう この紙? 127。 だから以降に変わっただけだ この物語の我々の以前語っている、 むしろ文字通り1と2よりも、私は私 123と127に渡すつもり。 そして私は今、これらの内部を置くつもりです このボックスの、大丈夫? だからブラックボックスは現在を表し スワップ機能。 一方、今、誰かを持ってみましょう スワップ機能を実装しています。 ここで誰かがアップするでしょう ボランティアしたい? までさあ。 あなたの名前は? チャーリー。 すべての権利、チャーリー。 までさあ。 だからチャーリーは遊ぶために起こっている 我々のブラックボックスの役割。 私はあなたがやりたいのかとチャーリー、 今、このような方法でスワップを実装され 、それらの2つのアドレスを与え、その あなたが実際に行っていた 値を変更します。 そして、私はあなたの耳にささやくよ ここでは、テレビを実行する方法について説明します。 だから先に行く、あなたはブラックボックスだ。 そこにリーチ。 あなたは何の値をを参照しない あなたは、Bのためにどのような値を見ていますか? CHARLIE:123であり、bは127です。 DAVIDマラン:OK、まさに。 今、ちょっとそこに一時停止します。 あなたが今やろうとしている最初のもの、 コー​​ドに従って - どの 私は今、画面上にプルアップします - 少しを割り当てることになるだろう メモリのビットは、温度と呼ばれる。 だから私は先に行くつもりだと あなたにそのメモリを与える。 だから、これは3番目の変数になるだろう あなたは、にアクセスできる持っていること あなたは、温度と呼ばれる。 そして、何を書こうとしている 紙の一時作品で? CHARLIE:ポインタ、右? DAVIDマラン:OK、よくありません ポインタを必ずしも。 だから、私がしたことをコードの行 右側に強調表示され、 そこから始めましょう。 それは、星氏は述べています。 だから、現在保存している 数123。 そして、ちょうど直感的に、どのような 星123もしかして? しかし、具体的には、ある場合 123、星の何を意味する? の値。 以上何気なく、そこに行く。 だから私はに保持することを提案させて あなたの手は、先に行くとそれを扱う あたかもそれはマップです。 とコンピュータのに自分自身をオーバー歩く メモリ、何か私たちを見つける 場所123で。 まさに。 だから我々は、場所123で見 明らかに、何ですか? [OK]を、ので、今、あなたはどのような値である 一時に置くつもり? まさに。 だから先に行くとそれを行う。 との部分に番号1を書き込む 現在温度というタイトルの論文。 そして今、次のステップでその あなたが実装するつもり 何になるだろう。 まあ、の右側に コー​​ドの次の行では、星のBです。 A、Bの コー​​スは、アドレスを格納します。 それは127に対応しています。 星bが何気なく話し何を意味? その場所に移動します。 だから先に行くと何私たちを見つける 場所127で。 OK。 もちろん、位置127において、 まだ値2です。 だから、で今何を保存しようとしている 内の場所でどのようなのですか? だから星は場所に行くことを意味します。 場所は何ですか? まさに。 だから今、あなたが変更したい場合 その場所で何が - 私が先に行くと実行することになるでしょう 消しゴムはここにある。 そして今、ブラシの上に戻す。 何番のように書くつもりです その空白のボックスになりました? まさに。 だから、このコード行は、明確にするために - せ チャーリーはやっているのか、私を一時停止 ここで指摘し、どのような彼はまさに行われていることである 場所123でその箱に書き込む Bの前にあった値。 そして我々は今、確かに実装しました コー​​ドのこの二行。 さて、残念ながら、そこ 残りまだ一行。 文字通り、一時に今は何ですか? それは明らかにナンバーワンだ。 それはアドレスではありません。 それは一種の、ほんの数だ 週1から変数。 そして今、あなたは、星bが、その意味すると言うとき あるアドレスBに行く ここのコース。 だから、一度そこに着く - 私が先に行くと、実際に何を消去します そこに - あなたは、何である 位置127で今書くつもり? CHARLIE:温度、一つです。 DAVIDマラン:温度、一つです。 そして最後には一時に何が起こる? さて、私たちは本当にわからない。 私たちは本当に気にしない。 我々は機能を実装しましたいつでも これまで、すべてのローカル変数は、あなたが持っている 確かにローカルです。 そして、彼らはただ消えてしまう。 彼らは、オペレーティングによって回収している 最終的にシステム。 だから温度がまだ持っているという事実 値1は、基本的に一種である 私たちに面白くない。 すべての権利なので、拍手 我々はチャーリーできれば。 非常によくやった。 すべての権利は​​、なおさらどういう これは我々が行うことができます意味ですか? だから、私たちがしてきたことが判明 いくつかの白い嘘をつく かなりの時間のために。 確かに、それは、その文字列が判明 この時間のすべてが、本当にない 自体の文字のシーケンス。 の種類は、直感的にそれです。 しかし、技術的に言えば、文字列は 我々は内部で宣言したデータ型 世界を簡素化するためにCS50ライブラリ クラスの最初の数週間のために。 どんな文字列が本当にあることはアドレスです どこかでRAM内の文字の。 文字列には、123のように、本当に数です 区別するために起こるまたは127、 文字列がで始まる場所 コンピュータのメモリ。 しかし、それは表していません 文字列、それ自体、それ自体。 そして我々は、これは次のように見ることができます。 私が先に行くと開放しましょう 間のいくつかのコード 今日のソースコードの例。 そして、私は先に行くと開くつもりです まで、比較-0.c、のは言わせて。 これが起こっているバグのプログラムです 次のように実装される。 最初。 私が何かを言うつもりです。 それから私は先に行くつもりだと ユーザーからの文字列を取得 その次の行である。 その後、私は再びそれを言うつもりです。 それから私は別のを取得するつもりだ ユーザから文字列。 と通知は、私は次のいずれかを示しています Sと呼ばれる変数内の文字列、および これらの文字列の別の Tと呼ばれる変数である。 そして今、私は非常に、請求するつもりです sが等しい場合に合理的に、それは、Tに等しい 文字列は同じです。 あなたが同じことを入力します。 そうでなければ、文字列は しないと同じこと。 結局のところ、我々は、入力2つのint、2を場合 文字、2フロート、2つのdoubleのいずれか 我々はについて話したデータ型 これまで、それらを比較する - 我々はしばらく前に非常に明確にしたリコール これを実行しないこと、なぜなら 単一の等号はもちろんですが 代入演算子。 だから、それはバグでしょう。 我々は平等​​な等号を使用し、 確かに比較する 真の平等のためのもの。 しかし、私は、これはバグであると主張。 私が先に行くとゼロを比較する場合、 その後ドットスラッシュゼロを比較しないでください。 と私は、こんにちは、のは言わせて、入力します。 その後の、再び挨拶しましょう​​。 文字通り同じこと、コンピュータ 私は別のものを入力したと主張している。 今、多分私はちょうど何かをミスタイプ。 私は私の名前、この時間を入力します。 私は意味、こんにちは。 こんにちは。 それは毎回違う。 まあ、理由です? 何が本当に起こっているの ボンネットの下に? さて、何が本当に下に起こっている フードは、文字列である 私は、例えば、最初の時間で入力 ワードはもちろん、ハローある。 しかし、我々の下に、これを表している場合 ボンネット、そのリコール 文字列が配列になっています。 そして、私たちは、過去に同じくらいと言ってきました。 私はこのように、その配列を描くのであれば、私はよ 非常に何かを表現しようとし 我々は一瞬前にやったことと似ています。 そして、何かが実際にあり あまりにも、ここに特別な。 にいた我々は何を決定するた すべての文字列の末尾に? ですええ、このバックスラッシュゼロ、 表現だけの方法、 文字通り、00000000。 行の八0ビット。 私は、率直に言って、わかりません この後何。 それはちょうど束より多くのRAMだ 私のコンピュータの内部。 しかし、これは配列です。 我々は前に配列の話。 そして、私たちは一般的に配列の話 場所はゼロであるとして、 次いでその後一つ、二つ。 しかし、それは利便性のためだけだ。 そして、それは完全に相対的です。 あなたが実際にからメモリを取得しているとき 、それはもちろん、任意のコンピュータの 20億いくつかの奇妙なバイト、潜在的に。 だから本当にボンネットの下に、 すべてのこの時間、はい。 これは非常によく、ブラケットゼロであるかもしれません。 しかし、あなたは下にさらに深く掘る場合 本当にだフード、 番号123に対応する。 これは、アドレス124である。 これは、アドレス125です。 そして、私はこの時間を台無しにしませんでした。 これらは現在、1バイト 別に何の理由で? char型の大きさは? char型は、ちょうど1バイトです。 int型は通常4バイトです。 私は123それを作った理由ようです、 127、131等が挙げられる。 今、私は数学が簡単に保つことができ とだけプラス1を行う。 そして、これは今、本当に何が起こっているのです ボンネットの下に。 ですから、このような何かを宣言するときに、 文字列sは、これは実際にある - それが判明 - charのスター。 スターもちろん、手段 アドレス、別名ポインタ。 だから、何かのアドレスです。 それのアドレスは何ですか? まあ - 私は非常に見ることができる唯一の​​人です 重要な点は私が作り、または思うよ 私が作ってるんだ。 だから文字列 - 悲しいことは、私はモニターを持っている 右がどこ ことを見たかもしれない。 すべての権利なので、文字列sとは何か 私は以前に宣言した。 しかし、それは、少しのおかげで判明 CS50ライブラリ内の魔法、すべてこの 時刻文字列は、文字通り持つ charの星でし。 星は再び意味 ポインタまたはアドレス。 それが隣接であるという事実 言葉のcharは、それがあることを意味 文字のアドレス。 だから文字列が呼び出され得る、と私は入力した場合 H-E-L-L-Oには、取得したものになりまし提案 文字列は文字通りのすべてを返してき 我々はむしろしたにも関わらず、今回は、 世界を単純化しすぎ? 実際に文字列を何を得るん その戻り値として返すこと? 例えば、この場合は123、。 我々は以前の文字列を得ることを言ってきた 単に文字列のシーケンスを返します 文字。 しかし、それは嘘のビットです。 方法は、文字列が実際に動作を取得 ボンネットの下にそれを取得で ユーザから文字列。 それは、その文字をplops 彼または彼女は、メモリ内のタイプ。 それは最後にバックスラッシュゼロを置く 文字のそれらの配列の。 しかし、その後の文字列を何を得るん 文字通り戻る? それは文字通りのアドレスを返します RAM内の非常に最初のバイトその その強さに使用されます。 そしてそれはただで返すことが判明 単一のアドレス 文字列の最初の文字であり、 全体を見つけるために十分 文字列。 言い換えれば、文字列はありません得る 123と124と125を返します。 それは私に長い間を与えることはありません そのバイトのすべてのリスト 私の文字列は使用しています。 1ので、バックアップするすべてのバックです。 最初のアドレスに基づいており、2、I 文字列が終わるところを見つけ出すことができます。 どうやって? 特別なNULL文字、 末尾にゼロをスラッシュ。 そう言い換えれば、もし あなたの周りに渡す - 変数の内側 - char型のアドレスを、あなたが前提としてい 任意の文字列の末尾に、任意のその 私たち人間のように一連の文字 あなたがそれを想定した場合、文字列を考える そのような文字列の末尾にあり スラッシュゼロは、あなたは黄金だ。 いつでも見つけることができますので、 文字列の終わり。 今、本当に次に何が起こっているか このプログラム内で? なぜ、このプログラムは、です 比較-0.c、バギー? 実際に何が比較されている? うん? 学生:[聞こえない]。 DAVIDマラン:その通り。 それは場所を比較している 文字列の。 ユーザーはこんにちは一度に入力しているのであれば、 私が行ったように、メモリが終わるかもしれない このように見える。 再びこんにちはでユーザがタイプした場合、 しかし、再び文字列を取得する呼び出すことによって、cがある あなたが教えない限り、特に賢くない コー​​ドを記述して巧妙であるためにそれ。 C - より一般的とコンピュータ - あなたは、こんにちは再びワードに入力した場合 あなたが得ようとしているのかを知っています。 あなただけの二番目の配列を取得するつもりだ メモリが、はい、ことが起こること H-E-L-L-O記憶等が挙げられる。 それは、同じに見えるだろう 私たち人間が、このアドレス 123ではないかもしれません。 それはちょうどように起こるかもしれない オペレーティング·システムは、いくつかの利用可能を有する 場所でインスタンスのためのスペース - 任意の何かを言ってみましょう、 このような場所200です。 そして、これは場所201です。 そして、これは場所202です。 私たちは、それはだ見当がつかない メモリにするつもり。 しかし、これが意味することは何かであるということです s単位で最終的に保存することになるだろう? 数123。 、Tに格納されて何が起こっているのか この任意の例では? 番号200。 そして、つまり、すべてが明らかにされ 123は200と等しくない。 ので、この条件であれば決して trueと評価されます。 GET文字列が別の使用しているため メモリのチャンク毎回。 今、我々は再びこれを見ることができます 別の例である。 私が先に行くと、コピー0.cを開いてみましょう。 私は、この例では、しようとしていることを主張する 試す - しかし失敗 - 2つの文字列をコピーする 以下のとおりです。 私が何かを言うつもりです ユーザーに。 私はその後、取得するつもりだ 文字列とそれの呼び出し。 そして今、私はここで、このチェックをやっている。 私たちは、しばらく前にこのことを言及した。 しかし、文字列の戻りはnullを取得する可能性がある場合、 別の特殊文字、または特殊 シンボルましょうと言う。 それはメモリ不足ましょう。 例えば、ユーザが実際にある場合 凶悪難しいと型であること で文字数 キーボードとヒットが入力します。 文字のその数がちょうどできない場合 クレイジー何用のRAMに収まる 理由は、よく文字列はともかく取得 非常によく、nullを返します。 またはあなたのプログラム自体は多くのことを行っている場合 他のものとだけあり 文字列を取得するための十分なメモリがありません 成功するために、それは終わるかもしれない ヌルを返すまで。 しかしみましょうより正確に これが何であるかにように。 Sのデータ型が実際には何ですか? シャアスター。 だから、今、私たちが剥がれることができ判明 ヌルの層をバックアップします。 結局、ヌルは - はい、明らかに 特殊記号。 しかし、それは本当に何ですか? 本当に、ヌルは単なる記号であることを我々 人間は同様にゼロを表現するために使用します。 Cの著者、およびコンピュータだから より一般的には、数年前に決定した つまり、あなたは何を知っています。 なぜ我々は無いことを保証するものではありません データは、これまで、これまでに、これまでです さようならゼロで保管? 実際にも、私の任意の例では、 前に、私はナンバリング起動しませんでした ゼロでバイト。 私は1から開始しました。 私は世界の人々を知っていたので ゼロを予約することにしました 誰のRAMなどのバイト 何か特別なもの。 その理由は、いつでもあなたがしたい 何かがうまくいかなかったことを通知 アドレスに関して、返さ ヌル - そうでなければゼロとして知られて - そして、あなたは何があることを知っていないので、 明らかに、アドレスがゼロでデータを合法 それはエラーを意味します。 そして、それは、我々は、慣例により、チェック理由です ヌルとリターン何かのため これらのケースの1つのような。 我々は今、下にスクロールしそうだとすれば、これはただです その後いくつかのエラーチェック、念の 何かが[と間違っていた?保釈?] 完全にとプログラムを終了 早期に返すことによって。 この行は、現在書き直すことができ このように、これは何を意味する? 左側に、私に別のものを与える 文字へのポインタ、それT呼ぶ。 私はベース、Tの内側に何を格納しています この1行のコードで? 私は場所を格納しています。 具体的場所 そのsであった。 だからユーザーはこんにちはで入力している場合、および 最初の挨拶が終わるために起こること ここでは、その後数123です 取得から戻って来ることを行って 文字列と保存される - 先ほど言ったように - のである。 私は今まで別のポインタを宣言する場合 charおよびそれを呼び出すtは、数字は何ですか 文字通りで終わるつもり 話によるとT? 123だから。 だから技術的には今のと両方 tは正確に指している メモリの同じチャンク。 だから私はここでやろうとしているものに気づく このプログラムにバグがあることを証明する。 と最初に私は、請求するつもりです 印刷fは、活かし 文字列のコピー。 それから私は少しを行うつもりだ エラーチェック。 私は確認するつもりです。 Let 'sは、文字列tがであることを確認してください 少なくとも長さがゼロよりも大きい、 ので、いくつかの文字がそこにあり 実際に活用する。 そして、あなたはこれを思い出すかもしれません 前の例から。 上位2 - にある ctype.hファイル。 Tブラケットゼロの私にゼロを与えます 文字列tの文字。 と同じ値の上限と2、 もちろん、それは大文字に変換します。 だから直感的に、これはラインを強調した コー​​ドの最初を大文字にされる Tの文字。 しかし、それは、直感的に、活用していない s内の最初の文字。 しかし、あなたは私が何を、先に考えている場合 私はこのプログラムを実行するときに表示する約 そして、オリジナルの両方をプリントアウト sであり、所謂コピーのT? 彼らは、実際には同じことになるだろう。 そして、なぜ、彼らは同じことを行っている? 彼らは両方を指している まったく同じこと。 だから、これを行うてみましょう。 コピーはゼロにします。 これは、[OK]をコンパイルします。 私はコピーゼロを実行してみましょう。 私のタイプのハローのようなものにしましょう すべて小文字で入力し、Enterを押してください。 そしてそれは主張して、元の両方 およびコピーは確かに同じです。 だから何が本当にここで起こった? 私はちょうどこの絵を描画しましょう で話をする わずかに異なる方法。 何が本当にの下で起こっている 私のような何かを宣言するフード charの開始秒、または文字列s、 私はポインタを取得しています - これは4バイトであることを起こる CS50アプライアンスで とコンピュータの多くである。 そして、私はこのSを呼ぶつもりです。 そして、これは、現在持って いくつかの未知の値。 あなたがいない限り、変数を宣言するとき 自分では、そこに誰が価値を置く そこに何を知っています。 これは、いくつかのランダムシーケンスのかもしれません 前回の実行からのビット。 だから私は、コードの私のラインで取得を行うとき その後、文字列、およびリターンを保存 s内の値は、何とか文字列を取得する - そして我々は最終的に取得する方法裏よ 文字作品は、何とか割り当て おそらく見え配列 このようなビット。 H-E-L-L-O、バックスラッシュゼロ。 これがアドレスであると仮定してみましょう 123ただ最初の一貫性。 そこらで、文字列のリターンを得る そこのラインを強調し、それを返します 我々が言った数字、123。 だから、何が本当にここに秒の内部に入る? まあ、実際に何を行く 内部のSのは123です。 しかし、率直に言って、私は少しを得て 、これらのアドレスのすべてで混乱 これらの任意の数字がすべて。 123、124、127。 それでは、実際に簡素化させて 世界が少し。 我々は率直に言って、ポインタについて話すときに 一体気に私たち人間が、 物事はメモリ内にある? それは完全に任意です。 それはどのように依存するように起こっている 多くのユーザーが持っているRAM。 それはその日にに依存するだろう あなたは、おそらく、プログラムを実行し、 何を入力ユーザーがあなたを与える。 私たちは、重要でない細部に住居している。 だから、抽象的なの離れて聞かせていると言う あなたはこのようなコードの行を実行すると、 charの星sがリターンを得る GET文字列の値。 なぜ我々だけではなく、私たち描画しない それはあたかも、ポインタを呼び出し続ける 何を指して? だから私は、その、今までの主張 ポインタがあります - ボンネットの下に、それはアドレスです。 しかし、それだけを指している 内の最初のバイト 文字列が返されていること。 私は今ここにコードに戻ると、 何がこのラインで起こっているのでしょうか? さて、今、この強調表示された行で、 私は明らかに別の宣言だ Tと呼ばれる変数。 しかし、それはまた、ポインタだので、私は行くよ 正確な、理論的には、としてそれを描画する 同じサイズのボックス。 そして、私はそれがt呼ぶつもりです。 そして今、我々は再びコードに戻った場合、 とき、tのI店舗sの内部、 私は技術的には何です Tの内側に入れて? まあ技術的には、この 数123だった。 だから、本当に私が執筆されるべきである そこに数123。 しかし、のは、それより高いレベルを取ることができます。 T、それだけでポインタである場合、 直感的に、そういうことだ。 それがされているすべてのことです そこに格納されている。 だから今最後の興味深いラインにおける 私は実際に取り掛かるコードの ゼロの文字を大文字に Tで、何が起こっている? まあ、Tブラケットゼロが今指している にどのような文字、おそらく? それは時間を指しています。 なぜならTブラケットゼロ - リコールは、これは、古い構文です。 Tブラケット tは、tの文字列である場合は、ゼロはただ意味 ブラケットゼロがゼロになって意味 その強さの文字。 本当に意味だから何 この配列に行くされて - とはい、これは、123かもしれない これは124かもしれません。 しかし、それはすべての相対だ、覚えておいてください。 配列の話をするたびに、我々は持っている について話しての利点 相対的な指標。 そして今、我々は単に仮定することができます そのTブラケットゼロがhである。 だから私は、その上に2がアッパー呼び出す場合、それが何 実際に活用されてやって 大文字Hに小文字のhの しかし、もちろん、sは何ですか? これは、同じくそ文字列を指しています。 だから、これは何が起こっているなら、すべての このコードで、これまで。 だから含意は次に何ですか? 我々は、これらの2つの問題をどのように修正すればよい? どのように我々は実際の文字列と比較するのですか? まあ直感的に、どのようにだろう 次の2つを比較して取り掛かる 真の平等のための文字列? 2場合、それはどういう意味ですか 文字列は等しい? はっきりしない自分のアドレスがあることを それが低いだから、メモリに等しく レベルの実装の詳細。 すべての文字は同じです。 だから私は提案してみましょう、と私が紹介させて compare.cのバージョン1で ここで、いわゆる1.Cを比較します。 私は、我々はまだ得ることを提案しましょう Sと呼ばれるポインタ、それに保管 取得する文字列の値を返す。 Tと同じことをしてみましょう。 だからコードのどれも違いはありません。 私は少しを追加するつもりだ 今すぐチェックを複数のエラー。 だから今我々は戻って剥離の一種だということ どんな文字列のCS50でこの層 実際には、我々はより多くの肛門にする必要があり 我々は乱用しないことを確認することについて nullのような無効な値。 だから、僕は確認するつもりです。 sが等しく、nullをせず、tがない場合は 等しいnullの場合は、それは我々がOKしていることを意味します。 文字列が取得台無しなかっゲット これらの文字列のいずれか。 そして、あなたは多分、今推測することができるもの STR CMPはおそらくのでしょうか? 文字列を比較。 あなたは前にJavaでプログラムをしましたのであれば、 これは内のequalsメソッドと同様です。 文字列クラス。 しかし、いない人のために 前にプログラム、 これはただのCの関数である。 それはに来て起こる string.hで呼ばれるファイル。 それが宣言されたところです。 と文字列を比較 - 私は、その使用を実際に忘れて、 しかし、それを気にすることはありません。 私たちにできることを思い出してください 男は、比較をかき混ぜる。 そして、これは起動しようとしている Linuxのプログラマーマニュアル。 そしてそれは、率直に言って、少し不可解だ。 しかし、私はうん、ことをここで見ることができます。 私はstring.hでを含める必要があります。 そしてそれは、 "説明の下ここで言う 文字列比較関数を比較 S1とS2の二つの文字列。 "とS1 とS2は明らかに2アール 引数が渡された 私は本当に覚えていないのか constのですが、今では気付く - いつ、あなたはすでにこれを見たことがあるかもしれませ あなたがあれば、manページを使用してきた それをすべて持っている - charの星はただ同義であることを 文字列を持つ。 だから、二つの文字列、S1とを比較し、 S2、そしてそれは以下の整数を返し 小さいか等しいかゼロより大きい S1があることが、それぞれ、検出された場合 未満、あるいは一致、または S2よりも大きくなる。 それはちょうど言って、非常に複雑な方法です その文字列はリターンを比較する ゼロ二つの文字列が直感的である場合 で同一で、文字 文字の文字。 場合は負の数を返します。 S、アルファベット順には、想定される T前に来ています。 または正の数は、次の場合に返されます sがtの後に来ることになっている アルファベット順に。 だから、この単純な機能を持つ、可能性 あなたは、例えば、ソート 言葉の全体の束? したがって、この新しいバージョンでは、私は行くよ 先に行くとコンペア1を作る。 ドットスラッシュが1を比較します。 私はすべて小文字でこんにちはを入力します。 私はこんにちはを入力するつもりです すべて小文字で再び。 そして、ありがたいことに今では実現 私は同じことを入力しました。 その間、私は下にこんにちはに入力した場合 ケースと大文字でハローと 私が入力し、それらを比較 異なるもの。 だけでなく、アドレスがあるので 異なるが、我々は比較している 何度も何度も別の文字。 まあのは、1つを行って修正してみましょう 現在、他の問題。 私はバージョンの1つを開いてみましょう 今アドレスコピー、 この問題は次の通り。 、この1つは見ることになるだろう 少し複雑。 しかし、あなたはどのような問題を考える場合、私たち 解決する必要があり、うまくいけばこれは次のようになります 今ちょうど瞬間にオフにします。 したがって、この最初の行、charをスタートT、で 普通の言葉では、誰かが提案することができ この行がここで何を意味? シャア星tは、やっていることは何ですか? グッド。 一部へのポインタを作成 メモリのスポット。 そして、私はそれを少し改良しましょう​​。 格納する変数を宣言 単にメモリ内のいくつかのcharのアドレス、 もう少し適切になるように。 [OK]を、ので、今右側に、私がしました これらの関数のいずれかを見たことがない 前に、malloc関数。 しかし、それは何を意味するのでしょうか? メモリの割り当て。 メモリの割り当て。 だから、我々は、これまで、判明 本当に強力な方法がありませんでした オペレーティング·システムに求め、 私にいくつかのメモリを与える。 むしろ、我々は今呼ばれる機能を持って まさにそれを行いますmalloc関数。 これはのビットであるにもかかわらず 気晴らし今、気付くのその 2括弧の間にある ただ数字になるだろう。 私は質問に入力した場所 マークは、番号を指定できます。 そして、その数は、意味 私に10バイトを与える。 私に20バイトを与える。 私に100バイトを与える。 とmallocがために最善を尽くします オペレーティングシステムに依頼 - この場合はLinuxを、 - ねえ、彼らの100バイト 利用可能なRAMの? もしそうなら、が私にそれらのバイトを返す うちのアドレスを返す おそらくそれらのバイト、? 非常に最初のもの。 だからここにあまりにも - これは支配的である C、あなたがしている任意の時間内に アドレスを扱う? あなたは、ほとんどの場合を扱っている 最初にそのようなアドレス、どんなに大きな あなたがされているメモリのチャンク いわば、戻って手渡した。 だからここでのダイビングみましょう。 私はどのように割り当てしようとしています 正確に何バイト、? まあ。 Sの文字列の長さ - レッツ 具体的な例を行う。 sが何、こんにちは、H-E-L-L-Oである場合 Sの文字列の長さ、明らかに? だから、5です。 しかし、私はそれにプラス1をやって、なぜですか? なぜ私は6バイトをしたいですか 代わりに5の? ヌル文字。 私はこれをオフのままにしたくない 特殊ヌル文字。 ので、私はハローのコピーを作成した場合 ただ、H-E-L-L-Oを行うが、私は入れてはいけません その特殊文字は、コンピュータ 偶然、バックスラッシュが、持っていない可能性があり 私のためにそこにゼロ。 そして、私が把握しようとしている場合 コピーの長さは、私は、と思うかもしれません それは、20文字、または億だ 私は決して起こらない場合、文字の長さ スラッシュゼロをヒットする。 だから我々は、6バイトを格納する必要があります H-E-L-L-O、バックスラッシュゼロ。 そして、これはただです スーパーアナルすること。 私は何を忘れているとし 文字の大きさである。 我々は、それが1バイトだと言っておいてください。 そして、それは通常。 理論的には、何かかもしれ 別のMacや上に、異なる 別のPC。 この演算子があるうちだからそれは回り sizeof演算子と呼ばれることは、それを渡すと データ型の名前 - 様 char型、またはint型、またはフロート - それはどのように多くの、動的に、あなたを教えてくれる charがこれに占めるバイト 特定のコンピュータ。 だから、これは事実だけです。 回1を言ってような 全然時間は何もありません。 しかし、私はちょうどスーパー肛門であるためにそれをやって、 念のためにcharが異なること コンピュータ対地雷、この方法で 数学はいつもチェックアウトするために起こっている。 最後に、ダウンしてここで私は、nullをチェック それは常に良い習慣です - 再び、 我々はポインタを扱っているいつでも。 malloc関数は、与えることができなかった場合 私6不戦勝 - です ありそうもないが、念のため - すぐにいずれかを返す。 そして今、先に行くと、コピー 文字列は次のとおり。 そして、これは、おなじみの構文です 異なる役割にもかかわらず。 私が先に行くと、文字列を取得するつもりだ sの長さとnに格納します。 私はその後、私は等しいから反復するつもりです 、までゼロとnを含む より大きいか等しい。 各反復で、私が置かれるように i番目の中のSのi番目の文字 Tの文字。 だから、本当に下に何が起こっているのか ここにフード? さて、この場合、例えば、sです - と私は言葉H-E-L-L-Oで入力した とバックスラッシュゼロはそこだ。 そして再び、これはsがここで指している。 そして今ここtである。 そして、これはここで指している メモリのコピー、右? malloc関数は私の全体を与えている メモリのチャンク。 私は何最初は知らない これらの場所のいずれかである。 だから私は、これらのように考えるつもりです 疑問符の全体の束。 しかし、すぐに私は、ゼロから始めるとループ S、Tの長を通じて、最大で ブラケットゼロとtブラケット1 - そして私は今、これを置くよ オーバーヘッドで - Tブラケットゼロとsブラケットゼロ意味 私は、コピーするつもりだ ここで反復して、H、E-L-L-O。 プラス、私はプラスでしたので、 1、バックスラッシュゼロ。 だから今、コンペア1.Cの場合には、 最後に、私はプリントアウトする場合 Tの大文字、我々はすべき sが変更されていないことがわかります。 私は今、先に行くと、これをやってみましょう。 だからCOPY1を行います。 ドットスラッシュCOPY1。 私はこんにちは、Enterキーを入力するつもりです。 そして今、コピーだけに気付く 資産計上されています。 私は本当に持っているので、2 メモリのチャンク。 残念なことに、いくつかのかなりを行うことができます ここで悪いとかなり危険なもの。 私は今ここに例をプルアップしましょう​​、 それは私たちにいくつかの例を示し 異なる行。 だから直感的にここで、最初の行 コー​​ド、int型星xが、宣言している Xと呼ばれる変数。 とデータ型は何ですか その変数の? その変数のデータ型は何ですか? それは接戦ではなかった。 データ型はint型星である。 だからそれが何を意味するのでしょうか? X意志 int型のアドレスを格納します。 分かりきったことだ。 Yは、保存するために起こっている int型のアドレス。 三行目は何ですか コー​​ドそこやって? それはどのように多くを割り当てている バイト、最も可能性が高い? 四つ。 なぜならint型の大きさである 一般的には4の4、malloc関数は、与え 私に背中のチャンクのアドレス メモリ、そのバイトでの最初の Xに今保存。 今、私たちは、すぐに少し移動している。 すた×は何を意味する? これは、そのアドレスに行くことを意味し とどのような数があり置く? そこに番号42を置く。 スターyはYで何に行くことを意味し そしてそこに13番を置く。 しかし、ちょっと待って。 一瞬でyは何ですか? どのアドレスがyの保存している? 我々は右、分からないのですか? 我々は、一度割り当てを使用したことがない Yが関与する演算子。 だからyはとしての2行目に宣言された コー​​ドは、単にいくつかのゴミ値、大きい 疑問符は、いわば。 これは、ランダムに指すことができます メモリ内の何に、どの 一般的には悪いです。 だからできるだけ早く我々はそこにその行を打つように、 星yを13に等しく、何か悪いこと、 非常に悪い何かについてです Binkyのに起こるように。 だから、最後まで何が起こっているのか見てみましょう この分でここBINKYに起こっ またはそう見える。 [ビデオの再生] - ねえ、Binkyの。 起きて。 これは、ポインタの楽しみのための時間です。 - どのようなそれはだ? ポインタについて学ぶ? ああ、グッディ。 まあ、開始するために、私たちはしていると思います カップルのポインタが必要になる。 -OK。 このコードには、2つのポインタを割り当てる これは、整数に指すことができます。 -OK、まあ、私には、2つのポインタを参照してください。 しかし、彼らはされていないようです 何を指している。 - そうです。 最初は、ポインタはない 何を指している。 それらが指し示すものは呼ばれています 指示先、最大それらを設定することです 別のステップ。 - ああ、右、右。 私はそれを知っていた。 指示先は別のものです。 それでは、どのように指示先を割り当てるには? -OK。 さて、このコードは、新しい整数を割り当て 指示先、そしてこの部分は、xを設定 それを指すように。 - ねえ、それが良く見えます。 だから、何かを作る。 -OK。 私は、逆参照ポインタxを格納するよ その指示に数42。 このトリックのために、私は私の魔法が必要になるでしょう 間接参照の杖。 間接参照の - あなたの魔法の杖? ええと、それは素晴らしいことだ。 - これは、コードがどのように見えるかです。 私はちょうど数を設定し、よ - - ねえ、見て。 そこにそれは行く。 だから、xは次の上の逆参照を行う その指示にアクセスするための矢印。 この場合には、そこに42を格納する。 ねえ、番号を格納するためにそれを使用してみてください 他のポインタを通じて13、Y。 -OK。 私はちょうどyにこっちに行くよと 番号13は、設定を取得。 その後の杖を取る ただ間接参照と - ちょっと待って! - ああ、ちょっと。 それは動作しませんでした。 Binkyの、言う、私はないと思う Yを逆参照すると、良いアイデアです 指示先を設定するため 別個のステップです。 と私は、私たちが今までそれをやったとは思わない。 - うーん。 グッドポイント。 - ええ、私たちは、ポインタyを割り当てられた。 しかし、我々はそれを設定することはありません 指示先を指す。 - うーん。 非常に注意深い。 - ねえ、あなたが探している Binkyの、そこに良い。 yのポイントようにあなたはそれを修正することができます xと同じ指示先へ? - 確かに。 私は私の魔法の杖を使用します ポインタ代入。 - であることがあることを行って 前のような問題? - いいえ。 これは、指示先に触れていない。 それだけを指すように一つのポインタを変更 別のと同じものに。 - ああ、私は参照してください。 xと同じ場所に今、yがポイント。 だから、待ってください。 今、yが固定されています。 それは指示先を持っています。 だから、杖を試すことができます 再び参照解除の 上の13を送信する。 -OK。 ここに行く。 - ねえ、それを見てください。 今、Y上の作品を間接参照。 とポインタは共有しているため、 その1指示先、それら 両方とも13を参照してください。 - うん。 共有。 ものは何でも。 だから我々は現在のスイッチの場所に行くのですか? - ああ、見える。 我々は時間の外出。 - しかし - - わずか3を覚えている ポインタルール。 ナンバーワン、基本構造 ポインタを有することである。 そしてそれは、指示先にポイント以上。 しかし、ポインタと指示先 別のものです。 と一般的なエラーは、することです ポインタを設定し、これに 指示先を与えられたことを忘れない。 ナンバー2、ポインタデリファレンスが開始 ポインタで、以下その 矢印の上にその指示にアクセスする。 我々はすべて知っているように、これはのみ動作している場合があり に戻って取得ポインティング先であり、 ルール番号1。 3番、譲渡にかかるポインタ 1ポインタと変化、それが指すように 別のポインタと同じポインティング先。 だから代入後、 二つのポインタ意志 同じ指示先を指す。 時には、それは共有と呼ばれています。 そして、それは本当に、これだけです。 今バイバイ。 [ENDビデオ再生] DAVIDマラン:だから複数のポインタで、 Binkyの来週の詳細。 私たちは、月曜日にお会いしましょう​​。