[音楽再生] DAVID J.マラン:すべての権利。 これはCS50であり、この 第4週の終わりである。 そしてトピックのいずれか、今日 デジタルフォレンジックの、すなわち、 情報を回復する技術。 そして実際、たとえ あなたは真っ只中にいる 今、平和の三つの時 そしてブレイクアウト、来週、 フォーカスがオンになります 正確にこのドメイン。 だから、私が今までクールな仕事の一つに バック大学院でだった、 私は地元のために働いていたとき ミドルセックス郡地方検事の オフィス、フォレンジック作業を行う。 だから基本的に、マサチューセッツ州 州警察​​、機会に、 ケースで作業するときだろう ハードドライブのようなものを持ち込む フロッピーディスクや メモリカード等である。 そして、彼らはそれらを渡したい 私と私のメンターに、 私たちの目標は、証拠を見つけることだった、 これらのメディア上のいずれかを、があった場合。 今、あなたが見ている可能性があります見え隠れ フォレンジックのこの世界の メディア、テレビ、映画で。 しかし、仕事は私が持っていたし、 、その世界をあえて あなたはそれを見ることは非常に似ていない。 それでは何を見てみましょう おそらく見てきました。 [ビデオ再生] -OK。 それでは、あなたをよく見を紹介しています。 [音楽再生] それを-hold。 その背中を実行します。 分-wait。 右に行く。 -There。 それをフリーズします。 - フルスクリーン。 -OK。 それをフリーズします。 その上に-Tighten、あなたでしょう? その上にある - ベクトル 後輪による男。 右こここの場でで-Zoom。 適切な機器 - 抜け、 画像を拡大して先鋭化することができる。 それは - 何ですか? - それは、強化プログラムです。 その最大明確なあなたが-CAN? -Iは知らない。 のはそれを強化しましょう​​。 -Enhance節A6。 私は細部を高め、and-- -Iは向上させるのに十分ながあると思う。 私の画面にそれを解放します。 -Iは彼女の目の中に反射を強化した。 を介してこれを実行するのを-LEt ビデオ強化。 -Edgar、あなたはこれを強化することができますか? 上-hang。 この反射に取り組んでき-I've。 -Thereの誰かのリフレクション。 -Reflection。 人間の顔の反射が-Thereです。 -The反射! 反射が-Thereです。 ミラー上での-Zoom。 あなたは反射を見ることができます。 あなたは、ここからイメージを高める-CAN? あなたはそれを強化-CAN? あなたはそれを強化-CAN? 私たちはこれを強化する-CAN? あなたはそれを強化-CAN? 第二に-hold。 私は高めでしょう。 ドアに中-Zoom。 10 -Times。 -Zoom。 中-move。 - より多くの。 -wait、停止します。 -stop。 それを-Pause。 私たちに75度を-rotate 垂直の周りでお願いします。 -stop。 パートに戻る 再びドアに関する。 ビットマップができるイメージ·エンハンサーを-Got? 私たちはプラディープ·シンを使用することができます-Maybe この方法は、ウィンドウに表示します。 -Theソフトウェアは、従来技術である。 -The固有値がオフになっています。 右 - 抜け algorithms--の組み合わせ -Heの撮影照明 次のレベルへのアルゴリズム、 そして私は、それらを使用することができます この写真を向上させる。 上-lock z軸を拡大する。 -Enhance。 強化します。 -Enhance。 -freezeと高め。 [END VIDEO再生] DAVID J.マラン:だからものがある すべての単語が、彼らはありませんでした 正しく文章で使用。 そして実際、将来的に、いつでも、 、誰かが言葉を言うのを聞くしてください、 少し含み笑いを「強化」。 あなたが強化しようとするので、 例えば、これは何が起こるかです。 だからここにゴージャスな写真です。 これはCS50自身祈るです。 そして、私たちがしたかったとし 彼の目に輝きに焦点、 または反射 明らかにした悪いやつ セキュリティカメラで撮影。 これは何が起こるかです あなたはそのイメージにズームイン 有限個しかを持って それに関連したビットの。 それはあなたが得るであろうものである。 そして実際、祈るの目の中 多分6ピクセルですが、4 それが正確に何を構成する そこにかすかた。 だから、問題を設定し、最終的には四があります あなたは、特に、この世界を探検 何かの性質によって、 私たちはここで、I / Oファイルを呼び出す I / Oは、ただの空想の方法です 入力と出力を言って。 だからこれまで、相互作用のすべて 私たちは、コンピュータとの過去 あなたに主になっている キーボードと画面、 ハードディスクではなく、あまり、 または1を超えてのファイルで保存します 自分で書きます。 あなたのプログラムは、これまで持っている 作成、保存されていない、 そして自分のファイルを更新する。 さて、ファイルは何ですか? さて、JPEGのようなもの。 これは、かもしれないイメージです 持っているか、Facebookを利用してアップロードし、 またはWeb上のどこを参照してください。 確かに、その写真私たちは 祈るののこぎりは、JPEGであった。 そして、何が面白い JPEGファイルのようなファイルについて それらが同定され得ることである、 一般的に、ビットの特定のパターンによる。 言い換えれば、それは何であること GIFからJPEGを区別する WordからPINGから Excelファイルからドキュメント? まあ、それだけで違う ビットのパターン。 そして、それらの異なるパターンがあります 通常、これらのファイルの先頭に。 お使いのコンピュータは、Wordを開いたときにするように ドキュメント、またはコンピュータは、JPEGを開いたときに、 それは、典型的に見える ファイルの最初の数ビット。 そして、それはパターンを認識した場合、 それがああ、これはイメージです、と言います。 私はそれを表示してみましょう グラフィックなどのユーザ。 または、ああ、これはWord文書のように見えます。 私はエッセイとしてユーザに見せましょう。 だから例えば、JPEGファイル、 それは結局のところ、ある かなり高度な ボンネットの下に。 しかし、ほとんどすべての中で最初の3バイト JPEGは、これらの3つの数字で始まる。 そうバイトゼロ、1、および2である ほとんどすべてのJPEG、255の場合、数 216は、数255。 そして、何あなたができるようになります 来週やって起動する 実際に下に突っついている JPEGファイルのようなファイルのフード 等のビットマップファイル、および見 いつものように長い間そこに何をされています あなたはコンピュータを使用してきたように。 しかし、一般的に存在しないものだ このような小数のように書かれて。 コンピュータ科学者はそうではない 小数で話す傾向がある。 彼らは本当にバイナリで話すことはありません。 一般的には、私たちが望むとき 数字を表現するために、 私たちは実際に進を使用し、 そのあなたが思い出すかもしれ 問題セット、たとえば、から 挑戦の一つ、 あなたは別のシステムを考えること。 私たちは、当然ながら、よく知られている ■10進数で、0〜9。 私たちは、バイナリについて話しました。 そして、私たちは本当に持っていない それだけここに使用する うちに、コンピュータがそれを使用するため。 しかし、プログラマは非常に意志 多くの場合、常にではないが、 ちょうど意味し、進数を使用 あなたのアルファベットの16文字を持っている、 2または10に対向するように。 それでは、どのようにそれ以上に数えない 進数で9よりも? あなたが行く0、1、2、3、4、5、6、7、8、9、 A、B、C、D、E、F、単に慣例により。 しかし、何がキーなのはそれぞれのことです これらの単一のシンボルである。 何10はありません。 各ので、全く11は、それ自体が、存在しない あなたの数字の、ちょうど進数のよう 単にバイナリのようにして、ただすべき 慣例により、単一の文字である。 だから、私たちが持っているアルファベットは、 進のための私達の処分で。 だから、JPEGは、あなたの場合のように、何を見ていない これらの最初の3を書き出すためにあった 小数ではないバイトですが、 例えば16進数として? そして、なぜ六角でもすべてのことに役立ちましたか? さて、例を簡単に見て。 だから私はビットを書き出す場合に これらの小数を表すnumbers-- これは少しさびたかもしれない すぐに戻って数週間から、 左1と 右は非常に簡単です。 255は、最大の数の私たちでした 8ビットで表すことができます。 それはすべてのものでした。 だから、軽度の唯一の 興味深いのは、真ん中の一つです。 そして、あなたは種類から行う場合 数学では、あなたは、確かに、それを推測します 1のパターンと、 ゼロは216を表す。 それでは、ただのために規定しましょう 今、これらが正しいこと。 しかし、なぜこれが面白い? さて、バイトは、当然のことながら、8ビットである。 そして、それはあなたが考える場合は、ことが判明 4ビットの2つのチャンクとしてバイト、 このように。 私はいくつかのスペースを追加してみましょう。 だから前、後。 私はいくつかの空白を追加しました ここで可視化のために。 どのように私たちは今では表すことができ、 進ビットの各クワッド、言う、 4ビットの各セット? だから例えば、左側の 今、私たちはバイナリで1111を持っています。 進数でその数は何ですか、 あなたは数学を行う場合は? あなたは、一の位、2の場所を持っている 四つんばいの場所、およびエイト場所。 聴衆:15。 DAVID J.マラン:それは15です。 だから私たちは8プラス4を行う場合 プラス2プラス1、私たちは15を得る。 だから私は、以下の15を下に書くことができる 1111が、ここでは全体のポイント 16進数、小数ではない。 だからではなく、書き留めの15、1-5、 私は、ヘックスにそれを書くつもりだ そのお持ちの場合は、戻って思えば ゼロからf、何15は、になるだろう? 聴衆はf。 DAVID J.マラン:だからそれはそれのfで判明。 そして、あなたは言ってそれをうまくすることができ、 10であればよく、[OK]を、fは15である。 だから確かに、私たちは書き換えることができます F fとしてこの数値の同じセット。 そして、私たちは数学のビットを行う場合には、 私たちはそれをdだと推測するでしょう。 エイトは、非常に簡単です私たちのため エイトの場所に1つを持っています。 そして、私たちはF Fのカップルより多くを持っている。 それでは人間は慣例により行う傾向 彼らは、16進数を使用する場合、彼らはただです もう少し簡潔にこれを書いて、 そのホワイトスペースの大部分を取り除く。 そして、ちょうどにスーパークリアすべき これは16進であることを読者に、 の中で、単純な規則 人間は、ゼロを書き込むことが 他の意味を持たないのx、 の視覚的な識別子よりも、 ここ進数が付属しています。 そして、あなたは、fの2桁を置く この場合はF、そしてDは、F F。 だから長い話を短く、 進はちょうど傾向 有用であることが、それぞれ、その 数字、aからfゼロ、完璧にライン 4ビットのパターンで最大。 ですから、2桁の16進数を持っている場合、 ゼロからF、何度も何度も、 それは完全にあなたを与える 8ビットまたは1バイト。 それがする傾向だから、なぜです 従来は便利です。 全く知的ではありません 本当にそれを超えたコンテンツ、 その実際の有用性以外の。 今、JPEGファイルだけではありません グラフィックスのファイル形式。 あなたが存在することを思い出すかもしれません 世界でこのようなファイルは、 少なくとも数年前から。 だから、これは実際にあった Windows XPでインストールされて 世界中で何百万台ものコンピュータ上に。 そして、これは、ビットマップファイル、BMPた。 そして、ビットマップファイルには、次のように表示されます 週、単にドットのパターンを意味し、 彼らが呼ばしているようにピクセル、 本当にビット、上のマップ。 それでは、しかし、興味深いのは、 このファイル形式、BMPについて、ある そのフードの下に、それを ちょうど3バイト以上のものを持って それはそう、そのヘッダを構成する 、最初のいくつか刺さ話す。 それは実際に少し見える 一見すると複雑。 そして、あなたはPセットでこれを表示されます。 そして、何かを得て 今、このうち特定の ただ事実として、それほど重要ではありません そのすべてのビットマップの先頭に ファイル、グラフィカル形式、 数字の全体の束があります。 さて、マイクロソフト、 この形式の著者、 それらをコールする傾向がある 物事はないintと文字 と山車が、言葉と、d 言葉やlongとバイト。 そこで、彼らは単に別のデータ型をしている。 彼らは、異なる名前をしている 同じことのために。 しかし、あなたはPセット4人にそれを表示されます。 しかし、これは人間の場合と言うことだけです。 彼にいくつかの.BMPファイルをダブルクリックする または彼女のハードドライブ、およびウィンドウが開きます 彼または彼女その画像を示すまで、 それは、オペレーティングので起こった システムだけでなく、おそらく気づいた .BMPファイルの拡張子 ファイル名に、 だけでなく、事実があることをいくつか ビットのパターンに大会 非常に初めに そのビットマップファイルの。 しかし、それではこれから注目しましょう このような複雑なファイル、 その代わりに、このようなものについて。 私は、geditの中でここにあるとし ちょうど始まりを持っている 非常に単純なプログラムの。 私はいくつかがトップを備えて持っている。 今私は、#include "structs.h」を持っているが、 私は、現時点で戻ったのと来る。 しかし、これは今のために有用である。 だから、これはプログラムであり、 それが実現するために起こっている レジストラのデータベースのように。 だから、学生のデータベース、 そして世界のすべての学生 名前と家、おそらくいくつかを持っています 他のものが、私たちはそれをシンプルにしておこう。 すべての学生には、名前と家を持っています。 私が書きたいのであれば その目的は生活の中でのプログラム ちょうどから反復処理することであった 最大3つのゼロ、 3人の学生があるかどう ハーバード大学。 そして、私はただのGetStringを使用して、取得したい、 各学生の名前と家、 してからちょうどそれらをプリントアウト。 これは一種の週のようです 一方、2週のものになりました、 私はちょうどのためにしたい場所 ループまたはそのような何か。 そして、私はいくつかのgetString呼び出したい 時間は、その後、数回fを印刷します。 だから私は、しかし、これを実行する方法を、 ときに名前と家の両方 各生徒のために関与している? だから私の最初の本能は、かもしれない このような何かをすること。 私が最初によく、私を与える、と言うかもしれない、 名前と呼ばれる文字列の配列を言う。 そして、私はここにハードコード3を望んでいない。 私はそこに置くために何をしたいですか? だから学生、それはただだから 先頭で宣言定数、 ちょうどので、私はハードコーディングする必要はありません 複数の場所で3。 このように、私はそれを一つの場所を変更することができ、 そしてそれはどこにでも変化に影響を与えます。 そして、私が行う可能性があります 文字列には、学生を収容する。 そして今、私のような何かをするかもしれない 私は学生を<;のために(i = 0のint型私+ +。 だから私は、高速入力しているが、これはある 今、おそらくお馴染みの構文。 そして今、これは最近のだった。 私は、i番目に配置したい場合 学生の名前、私はこれを行うと思います。 そして、名前ではなく しかし家は私を囲む。 私は、これを行うのGetString、としましょう 私は戻って、この行を修正します。 あなたはこの意見に? 同意しない? それは非常にユーザーフレンドリーではありません。 私は何をすべきかをユーザーに告げていない。 しかし、今、私の場合も 後で、みましょうしたい たとえば、これらの事を印刷 そうTODO後でかゆうパックで。 私はそれ以上とするつもりです IS間違いなくこれをthis-- の正しい実装 名前や家屋、3を取得 ユーザーからの各それらの合計、。 しかし、これは右、非常に良いデザインではないでしょうか? どのような学生だけではなく名前を持っている場合 そして、家だけでなく、ID番号、 電話番号、 電子メールアドレス、 多分、ホームページ、および 多分Twitterのハンドル、 およびその他の詳細、任意の数の 学生や人物に関連した、 より一般的。 どうすれば追加し始める このプログラムへの機能性? まあ、私はかもしれない最も簡単な方法のように感じる 、のような何かをするのは、言わせてすることで、 IDが学生をint型。 だから私はそこにすべてのIDを入れることができます。 そして、何かのために 電話番号のような、 私はどのようにわからないんだけど まだそれを表している。 それでは、先に行くとちょうど呼ぶことにしましょう これは、学生をTwitterのメッセージ 少し奇妙、but--です そしてたくさんのフィールド。 私は効果的に開始しました コピーしてここに貼り付けます。 そして、これはかなり成長しようとしている かなり迅速に扱いにくいですよね? があった場合、それは素晴らしいと思いません 世界のデータ構造は既知 しないintや文字列ではなく、何かのような これより高いレベル、抽象化、 話すように、学生として知られている? Cは、内蔵の付属していない 学生のための機能性、 私はそれがそのような与えたいと思った場合はどう? まあ、それは結局のところ、私はするつもりです 、ここstructs.hというファイルを開く あなたが正確にそれを行うことができます。 そして、私たちは今、これをやって起動するつもりだ。 そして、Pセット三のボンネットの下に、 あなたは既に、今これをやってきました。 グラムRECTなどというものは存在しないか、 プログラミング言語Cのグラムオーバル スタンフォード大学の人たちは、それらを実装し ここでこのアプローチを使用して、データ型、 自分自身の新しいデータを宣言 newキーワードを使用したタイプ 構造体と呼ばれ、他の 1と呼ばれるのtypedef。 そして実際、たとえ構文 スタッフから少し違って見える 私たちは中に、前に見てきた 原理は、それは超簡単です。 これは単に、「型を定義する」を意味する。 それはなるだろう 構造、構造 ただコンテナのようなものです 複数のもののために。 そして、その構造が起こっている nameという文字列を持っている、 と文字列が家を呼んだ。 そして、ちょうど便宜上、呼ぶことにしましょう​​、 このデータ構造全体の学生。 あなたが取得するので、瞬間 セミコロン、あなたが今持っている 独自のデータを作成した 学生と呼ばれるタイプ それは今、int型と並んで立っている フロート、およびchar型、文字列、 およびg矩形、およびg楕円形、及び任意の数の 他のものの人が発明した。 だから、これに関する有益なものだ 今私は戻っている場合ということです 0をSTRUCT、これを終了します 私が書いた実装、 ここでは、事前に、その全てがわかり 避けられない散らかっの 私が追加されたように起こって出発しようとしていた 電話番号やTwitterのメッセージとすべての これらの他のものに 学生の定義、 今では簡潔に包まだ 学生のほんの一配列として。 そして今、これらの学生のそれぞれ その中の複数のものを持っています。 だから、ただ一つの質問を残します。 どのように名前で入手できますか、 、家、およびID、 とelse何でもあり 学生の内側? スーパーシンプルなだけでなく、。 新しい構文が、シンプルなアイデア。 配列へのあなたは、単にインデックス、 私たちは先週、これと同じように。 そして、明らかに何 構文の新しい作品? ただ、「中に入ることを意味する 構造とフィールドが呼び出される 名前は、家と呼ばれるフィールドを取得 学生というフィールドを取得します。 " だからPセット三に、あなたはなら まだその上で作業し、 そしてほとんどの人はまだ あなたのようなことを実現している のようなものを使用して起動 グラムrectsおよびg楕円 していないようだし、他のもの 週ゼロ、1つ、または2つから来る、 それはスタンフォードためだと認識 いくつかの新しいデータ型を宣言した。 そして実際、それはまさに私たちがよ Pセット4人にだけでなく、実行し、時 私たちは物事に対処し始める イメージ、ビットマップ、および多くのような。 だから、ちょうどティーザーとです 来ては何のためのメンタルモデル。 今、私はprocrastinated ビット今朝。 私は何を見てちょっと気になっていた 実際にマイクロソフトの壁紙 今日のように見えます。 そして、それは2006年に、誰かが判明 実際にはほぼ正確に行ってきました 実際に撮影する同じスポット 何は、これらの日のようになります。 フィールドには、今少し生い茂っている。 だから、画像の今言えば、 それでは、ここで祈るを取り戻すましょう 画面とニコラス上、 ちょうどあなたを思い出させる そのあなたが昼食のために私たちに参加したい場合 今週の金曜日、いつものURLへのヘッド ここに。 だからここで私たちは月曜日にオフにしておいたのですか? 私たちは右、この問題を導入? これは一見正しかった スワップの実施、 それによってあなたは、2つのintを取る 一方、Bと呼ばれるもの、と呼ばれる ローラがここでやったよう、それらを交換 牛乳と水とのステージ上で、 一時を使用して、 変数、または空のコップ、 私たちは、と中にBを入れことができるように、 物事の混乱を行うことなく、B。 私たちは、変数を使用していました。 これは、一時と呼ばれています。 しかし、根本的には何だった 月曜日のこのコードの問題? ここでの問題は何でしたか? うん。 聴衆:それはより多くのスペースを占有します。 DAVID J.マラン:詳細を占める スペース、私は変数を使用しているので、 それはOKです。 それは本当ですが、私は今 それはOKだと言うつもり。 それは壮大で唯一の32ビットだ 物事のスキーム、そうではない大したこと。 その他の考え? 聴衆:それだけスワップ ローカルでの変数。 DAVID J.マラン:その通りです。 これは、ローカルでのみ変数を入れ替えます。 いつでもあなたはfunction--を呼び出しているため 私はアネンバーグからトレイを持っていたとき 最後の時間、あなたは一番下のメインがあります。 とすぐに呼び出される関数を呼び出すように スワップ、スワップはxとyを取得していません、 元の値。 何をスワップは、取得しない私たちは主張しましたか? 聴衆:コピーします。 DAVID J.マラン:それらのコピーだから。 だから、それはあなたがした場合、1と2を取得 前回からの例を思い出して、 しかし1と2のコピー それは正常に交換されます。 しかし残念ながら最終的には、 これらの値は同じである。 だから私たちは私たちでこれを見ることができます 新しい友人、うまくいけば、GDB、 あなたやのTFおよびCaのは持っていることを 次のように向かってあなたを導くれて。 だから何スワップリコールしてみましょうlike--見えない このようになりますthis--開く。 私たちは2つに、1にyとxは初期化。 プリントFのの束を持っていた。 しかし、その後、キーコール ここでは、交換することであった 正確にコードたちである ちょっと前に見た。 最初は正しいものはどれ 一見、しかし、機能的に、 このプログラムはあるため、動作しません それは永久に、xとyを交換しません。 だから、迅速な暖かいのは、これを見てみましょう ここでは、GDB、./noswapで最大。 その圧倒的な情報の束 私は今のところ、コントロールLのを取り除くでしょう。 そして今、私はするつもりだ 先に行くと、それを実行します。 そして、残念ながら、その その有用ではありませんでした。 これは内部のプログラムを実行した GDBと呼ばれるプログラムは、デバッガ、 それは私の周り突くことはできませんでした。 それでは、どのよう私は実際に一時停止することができます このプログラム内部の実行? だから破る。 そして、私は、任意の上で破損することがあり 行番号は、1〜10、15。 しかし、私はまた象徴的に破ることができる ブレーク主を言って。 そして、それはブレークを設定するために起こっている ポイント、明らかにメインライン16で。 そして、ここで、16行目である? のコードにまで行ってみよう そしてNOSWAPに上がる。 そして実際、16行目は、 非常に最初のプログラムである。 だから今、私が先に行くとタイプした場合 今回の実行、入力し、それが一時停止しました。 それではつつくましょう。 Xがゼロである理由X--印刷? ドル記号を無視します。 それはちょうど手の込んだのためだ プログラムの使用方法。 なぜ現時点でのxがゼロですか? うん。 聴衆:それは右の前に一時停止 16行目ではなく、実際にライン16上の。 DAVID J.マラン:その通りです。 GDBは、デフォルトでは、一時停止しています ちょうど16行目の前に実行。 だからそれは、実行されなかった xはいくつかの未知の価値があることを意味します。 そして、私たちはそれがだと幸運 ゼロのようなきれいなもの。 だから今私は、次の入力した場合、 今では16を実行した。 私は17を実行することが待っている。 私が先に行くと、印刷のxましょう。 それは一つだ。 私が先に行くと、プリントyをしてみましょう。 私は今、何を見るべきか? 聴衆:[聞き取れない] DAVID J.マラン:少し大きな声。 聴衆:[聞き取れない] DAVID J.マラン:ない非常に合意。 そうです、私たちはいくつかのごみ値を参照してください。 さて、yがあり134514064です。 まあ、それはいくつかのガベージ値です。 私のプログラムは、RAMを使用しています 異なる目的のために。 他の機能があります。 他の人が自分のコンピュータの中に書いている。 そのように、これらのビットは使用されてきた 他の値は、私は何を見ている いくつかの残党である そのメモリの先使用。 だから大したことない、とすぐに理由 私は次の、その後の印刷yを入力すると、 それはに初期化だ 私が欲しいの値。 だから今、のは少し速く先に行きましょう。 次のためのN。 それでは、もう一度それをやってみましょう。 それでは、もう一度それをやってみましょう。 しかし、私はヒットする必要はありません ここで、私の場合のため 内側に何が起こっているのか見てみたい スワップにより、コマンドは何ですか? 聴衆:ステップ。 DAVID J.マラン:ステップ。 だから、これはに私を、手順 むしろそれ以上のより機能、。 そして今、それは少し不可解だ 正直、これはただである 私は今、33行の中にいる私に言って。 そしてさんは再びこれをやらせる。 印刷の一時。 ごみ値、負の今回は、 それは単に、まだガベージ値です。 それでは、次に、印刷の一時をやらせる。 これは、1に初期だする 別名、xの値であった。 さて、ここで私たちのaがあり、から来るX? さて、私たちは、主に気付く xとyこれらの値を求めた。 それから、次のようにスワップするためにそれらを渡す。 Xはコンマyと、最初に来た。 そして、スワップはxとy、それらを呼び出すことができます。 しかし、明確にするために、それがだ aとb、それらを呼び出す。 しかし、aとbは今であることを行っている xとyのコピーであった。 だから私は戻って、GDB、一時に行けば 今一つであり、今や一つです。 私は今、次に何をしている場合でも、印刷を行う 、aは既に上に移動されました。 ミルクは前者に注がれた オレンジジュースのガラス、またはその逆。 そして私は今、次の再び行う場合、および 私は健全性チェックのようにして印刷する場合、 まだ2ですが、bは、今一つです。 率直に言って、それはまだあります。 私は一時が何であるかを気にしない。 しかし、すぐに私は今、入力中に、のは言わせて、 今私は最後に来ている、戻って続ける プログラム。 そして残念ながら、xは まだ1つであり、yはまだ2である。 だから、GDBの有用性は何でしたか? それは私が解決し助けていない 問題自体は、 それがうまくいけば私を助けて 実現することでそれを理解する はい、私の論理が正しいことが、 私のコードは、最終的には持っていないされている 恒久的な影響。 だから、私たちがしている問題だ 今今日解くつもり。 しかし、ここで、この例によりそこに取得しましょう​​。 文字列は嘘です。 また、あまりにも、しないデータ型 それは、C。それの中に存在する いくつかの同義語であっ 何か他のもののための時間、 次のように、私たちはそれを明らかにすることができます。 私が先に行くと開いてみましょう 比較-0と呼ばれるプログラム。 そして、この1つを入力するのではなく、 私たちは、コードをウォークスルーすることから始めましょう 私はすでに書いたが、 それはわずか数行です。 だから、これは、コンペア0である。 そして、私はやっている最初の事 テキストの行を得ている。 しかし、私は何に気づく 初めてやって。 何が21行程度明らかに違うのですか? 実際には、ちょっと待って。 これはコピー2です。 それはあっても、右プログラムではありません。 すべての権利、スポイラー警告。 すべての権利なので、それを気にしない。 つまり、将来の質問への答えです。 ここでは、コンペア0であり、私はよ テキストの行を取得しようとして。 はるかに簡単なプログラムの。 だから、これは簡単です。 これは1週、2週のもののようです 現時点では。文字列s =のGetString。 今、私はダウンして、ここでもそれを言う。 文字列T =のGetString。 この中でそして、最後の事 プログラムは、その名の通り、 私はそれらを比較しようとするつもりされている。 だからsの場合、最初の文字列、 = tの場合、私はに等しい あなたが同じことを入力すると言うつもり。 そうでなければ、私は言うつもりです あなたが異なるものを入力します。 それでは、このプログラムをコンパイルして実行してみましょう。 だからゼロを比較してください。 よさそうだ。 コンパイルエラーはありません。 私は、今先に行こう と./compare-0を入力します。 私が先に行くと何かを言ってみましょう :祈る何か:ロブ。 そして、私は別のものを入力します。 これまでのところ、とても良い。 プログラムは、正しいと思われる。 しかし、ここで再びそれを実行してみましょう。 ゲイブ:何かを言う。 ゲイブ:何かを言う。 かしこまりました。 たぶん私は、スペースバーをヒット またはファンキー何か。 それでは、もう一度それをやってみましょう。 Zamylaそう。 Zamyla。 別物。 だから何が起こっている? だから私たちは、次の2行を持っている コー​​ドのGetString二回呼び出されている。 そして、私は単純によ sとtを比較しようとしている。 しかし、本当にそれから、何が起こっているの? さて、私の手書きの約 ややこの例を肉屋。 そして、それでは実際に投げてみましょう このアップこっちだけでなく、。 だから私たちは次のような行を持っている 文字列s =のGetString。 だから、単純に最初の そのプログラムからの興味深いライン。 しかし、このすべての時間がされているもの ボンネットの下に起こっている? さて、左側に文字列である、 その変数のいくつかのタイプであり、 そしてそれは、Sと呼ばれています。 だから私は、これは、メモリを使用していることを知って、 またはRAM、何とか自分のコンピュータにある。 だから私は、抽象的に行くよ 正方形としてそれを描画します。 32ビット、結局のところ、しかし 将来的にはその詳細。 そして、何がこっちが起こっているの? まあ、当然のgetString ユーザーから文字列を取得します。 とのGetString GOT Zamylaまたはゲイブまたは祈る。 それでは、最初に選択させる それらの、祈るあった。 だから効果的に、のGetStringが得たもの 私は、その最初のケースでは、D--V-E-nのだった。 そして、他に何していた それは私を密かに与えるか? 聴衆:[聞き取れない] DAVID J.マラン:ええ、 / 0またはnull文字。 だから、効果的に私に文字列を与えた。 しかし、私たちはすでに前から知っている 文字列は単なる配列であることになります 文字の、そしてそれはによって終了だ この特別なセンチネル文字、/ 0。 しかし、これが真の場合 これは正方形である、 これは明らかにはるかに大きい長方形である。 実際、これは、 私は、32ビットのみを主張。 そして、これは明らかに32以上である ビット、これはおそらくですので 8プラス8プラス8 プラス8プラス8、 という理由だけで、ASCIIのバイト。 どのように一体私たちは収まるようにしようとしている ここで、この小さな箱に祈る? さて、のGetStringは実際に何をしているのですか? さて、ここで、このグリッドは表し 私のコンピュータのメモリやRAM。 それでは、任意の場合としましょう これらのそれぞれは、バイトを表し、 その後、私たちは、それぞれの考えることができます バイトアドレスを有するように、 33オックスフォードストリート、または34のような オックスフォード·ストリート、または35オックスフォードストリート。 だから、家はアドレスを持っていると同じように そして建物はアドレスを持っている、 程度の個別のバイトを行う メモリは、アドレスまたは番号を持つ その一意に識別します。 さて、これは任意である。 しかし、私はするつもりだ、それをシンプルに保つために ただ慣例により進を使用し、 しかし0xのは、他の何を意味する "これは16進数です。」より そして私はあることを主張するつもりだ 「D」は、メモリ内のバイトの一つで終わる。 私は、他には何もで起こってしまったん メモリなので、祈る、最初のスポットを得た バイトひとつで。 これは、その後、0x2ということになるだろう。 これは0x3に起こっている。 これは0x4になるだろう。 これは0x5のに起こっている。 これは0x6になるだろう。 しかし、一度考え始める どのコンピュータのことについて ボンネットの下に、 あなたが推測することを開始することができます どのように、何年か前に、だろう C自体を実施しています。 おそらくのGetStringとは何ですか それのでreturning-- そうでないように感じている 帰国祈る、それ自体が、 彼は確かに行くのではないので、 この小さなbox--に合わせて だから何がのGetStringはおそらく戻っている? 聴衆:[聞き取れない] DAVID J.マラン:祈るの場所。 そして、それはこれをやっています これまでに1週以来。 何のGetStringが実際に 帰国は、それ自体、文字列ではありません。 つまり、小さな白い嘘の一つだ。 それは、のアドレスを返すだ メモリ内の文字列、一意のアドレス。 祈る33オックスフォードストリートに住んでいます。 しかし、より簡潔に、ギャビンは住んでいる 0x1ので、ナンバーワン住所。 だから、これで何を入れれます その後小箱、明確にするために、 その文字列のアドレスだけです。 だから、すべてのこの時間、この 続いている。 しかし、これは何を示唆 今、すべてのsあれば持っているということです それの内部の数であり、 あなたを停止するには、プログラマは、 内の任意の数値を入れてから 任意の変数だけジャンプ メモリのチャンクに? そして実際、私たちは表示されます それは、脅威、次回です。 しかし、今のところ、これでは不十分と感じている。 私が言う場合は、私を取得 文字列には、あなたは私に祈るを与える。 しかし、あなたは本当に私に祈るを与えていない。 あなたは私を与えるすべてが祈るのアドレスです。 私はその後、確かに知ってはどうすればよい どこに祈るが開始され、ends-- 物語のはweird--取得 祈るが始まり、終わるところ、 してから、次の メモリ内の文字列が始まる? さて、あなたは手渡ししている場合 私祈るの初め、 基本的に、どのように私は知っていますか 彼の名前の最後には、どこにあるのか。 その特別なヌル文字、その 今、すべてがより重要である 下に文字列の場合 フードは簡単に特定されている 一意にメモリ内の位置による。 だから、すべてのこの時間は、それはだ 何が起こっているされています。 だから私たちは今を見てみると ここでは、コード、説明 あなたがライン26のバグもし。 なぜZamylaとZamylaは違うのですか? なぜゲイブとゲイブは違うのですか? ええ、後ろに。 聴衆:彼らは異なるアドレスを持っている。 DAVID J.マラン:というだけの理由 彼らは異なるアドレスを持っている。 あなたがのGetStringを呼び出すときのため 再び、私はここですぐにやるおり、 これは二行目の場合は、文字列 T、私はそのプログラムで行ったように、 のGetStringへの別の呼び出しに相当します。 私が呼ぶ次回 のGetString、私は行くよ メモリの異なるチャンクを取得します。 のGetStringが許可されている 運転を依頼する より多くのメモリのためのシステム。 それは同じを再利用するつもりはない 6バイト毎回。 これは、新しいを得るために起こっている メモリの塊、どの tは取得するつもりされることを意味 こちらにある他の値。 私が行うときにsが=に等しい Tは、比較していない これと対に対して、D これとこれに対するV。 あなたはこれを比較している このに対して、どの 率直に言ってかなりuseful-- useless--です 本当にために誰が、非常に無駄です 文字列がメモリのどこにいるか気に? そして実際、私たちはそうではありません。 そして、私たちはするつもりはない 特に思いやりを開始。 のみバグが発生する可能性が程度に セキュリティの脅威は、意志を発生する可能性が 私たちは実際に、この気にし始める。 それでは、この問題を解決しましょう​​。 判明は、スーパー、単純にそれを修正する。 そして、私の前に、実際にしてみましょう 何だろう、再びそれを明らかにする CS50クラスの場合は、何 あなたが実装する必要がありました 二つの文字列との比較。 あなたは明らかにちょうどsが= tを等しい使用することはできません。 しかし、単に論理的に、どのように あなたはこの文字列を比較するだろう Cコードを使用してこの文字列に対して? うん。 聴衆:ちょうどください forループ[聞き取れない] DAVID J.マラン:パーフェクト。 聴衆:[聞き取れない] DAVID J.マラン:うん。 ただループまたはAで使用 ループまたは何ながら。 しかし、単に基本的な考え方を適用した場合、その これは、メモリまたは配列の塊です これは、反復処理されている 同時に両方。 そして、ちょうど文字を比較します。 そして、あなたはなるようになってきました 少し慎重に、あなたのため 指一本を望んでいない 他を過ぎて行くために 1文字列であるため、 他よりも長い。 だからかどうかを確認するつもりだ 最後にこの特殊な値は、null。 しかし、それは本当にであり、 終わり、そのような単純な。 そして、率直に言って、私たちは必要ありません その車輪を再発明します。 ここで二つのバージョンである。 そして、何私がここで言うつもりは、ということです 代わり= tと等しい秒を比較する、 文字列場合、私が代わりに、と言うつもりです 複数のカンマtの比較は= 0に等しい。 さて、文字列は何を比較するのですか? それは、その関数ですが、結局のところ その目的は生活の中で、C、付属しています 二つの文字列を比較することである。 そして、私たちがそのを読めば、比較かき混ぜる manページまたはマニュアルCS50 参照、それは意志 単にあなたにその話題を伝える 負のいずれかに戻りを比較 番号または正の数またはゼロ、 ゼロは、彼らが同じだ意味する。 だから推測。 それは何を意味するかもしれない場合は、 比較リターンをかき混ぜる 負の値または正の値? 聴衆:より大きいまたは小さい。 DAVID J.マラン:ええ、 より大きいかより小さい。 だから、全体をソートしたい場合 dictionary--内の文字列の束 私たちは最終的にroad--ダウンするように 潜在的に使用するのに最適な機能、 それはそれを行うために起こっているので、 あなたのための文字列の比較、伝える ときに、bの前に来るか、いない Bアルファベット順に前に来る。 私たちは、正確にそれを行うことができます。 そして、私は他のものをやった予告 この例の事。 他に何が高く変更されました この主な機能は最大? シャア*。 そして、これは、他の白い嘘です。 あなたがたすべてのこの時間は、 文字列を書いて、 私たちは密かに書き換えてきた charとして文字列*実際になるように打ち鳴らす あなたが理解しています。 言い換えれば、CS50.h中 私たちは、最終的に表示されますように、 私たちは同義語と呼ばれる文字列を作った それは、char *と同じことだ。 そして今のところ、唯一のことを知っている *この文脈において、少なくとも、 アドレスを意味します。 何のアドレス? まあ、実際には私が言ったことを char *をではなく、* int型やフロート*、 のchar *であることを意味 char型のアドレス。 だからここにこの小さなボックス、別名 文字列、実際にchar *型のものであり、 これというのが単に空想の方法です、 このボックスにアドレスを移動します。 そして、何そのアドレスは参照してくださいでしょうか? どうやら、チャー。 しかし、私たちは絶対にできた int型*や他のものを持っている。 しかし、今のところ、char *を、本当にほとんどです 簡単で、目的の1。 したがって、この問題が起こっている しかし、再び、上昇する。 私はこのプログラムを開くとします。 今私たちが予測できるかどうかを見てみましょう 何がこのコードが間違っている。 このプログラムの中のSO、コピー-0を、私は 先に行くと、再び呼ぶことにし のgetStringとsの値を格納します。 そして、なぜ私はこれをやっている、 わずか数週間の過去からのリマインダーとして? 私たちは、のGetString言った 時にはnullを返します。 それは何を意味しているのかどう のGetStringはnullを返します? 何かが間違っていた。 それはおそらく、文字列があまりにもあることを意味し 大きな、メモリのコンピュータのうち。 それは、超超超起こる めったにありませんが、それが起こる可能性があります。 私たちはそれを確認したい、 そしてそれは、私たちがやっているすべてです。 そうしない場合は、私たちは、今表示されますので、 もののために習慣的にチェックを開始 ヌルと同様に、かもしれない 実際に行くことを始める 無効であるメモリ内のアドレスへ。 そして、あなたは誘導を開始するつもりだ より多くのセグメンテーションフォールト。 またはMacまたはPCでの、ちょうど ハングにコンピュータを、 または潜在的に、フリーズするプログラム。 だから今、私がいることを、コピー0.cで主張 例によってこれらの文字列をコピーするつもりです ライン28の。 そして、私は行くよ 下部に請求 ここで私は行くよという それらのいずれかを変更します。 だから、これに注目してください。 私は私たちの古い友人はstrlenを呼んでいる。 そして、ちょうど英語で説明して このライン34は何をしているのですか? Tブラケット0何をする 左側に表す。 うん。 聴衆:Tの最初の文字? DAVID J.マラン:トンの最初の文字。 それだけです。 トンの最初の文字、私が欲しい 大文字のバージョンを割り当て トンの最初の文字の。 だから、これは活用している 最初の文字。 私はその後、非常に最後の事 このプログラムでは、私はここの主張されている オリジナルの、ここでコピーで、トン。 しかし、物語に基づいて、私たちだけで 、文字列が実際にあるかについて語った 本当に28行ものです やって、何で 行く生じたバグ 画面上にするには? したがって、最初の、最初の質問、28。 文字列t = sは本当に何をしているのですか? 私たちは左手で持っている場合 こちら側文字列t = Sで; それは私に1箱を与え こことここ1箱。 そして、このアドレスは0xのだとし それでは任意に、50今回は言わせて。 どういう文字列T = S ボンネットの下にいますか? 聴衆:[聞き取れない] DAVID J.マラン:これは、メモリを格納する そこに対処するため、0x50をがそこに行く。 今のであれば、私は最初に行く Tの文字と、それを大文字に、 私は効果的にsに何をしているのですか? 私は本当に正しい、同じことをやっている? 住所0x50--ちょうど、私の場合ので、 ここで、ボード上の多くの部屋を持っていない、 しかし、これはここでダウンして0x50をされていることを前提としてい 私のコンピュータのメモリのどこか。 そして、私は、例えば、ゲイブを持っている このように、ここでは小文字で。 そして、私は言っているtのブラケット 0は大文字れます。 さて、Tブラケット0です tの最初の文字。 だから、少しgがしようとしている 大きなG.しかし、問題となって sはまたを指していない、何でしょうか? 聴衆:同じ。 DAVID J.マラン:まったく同じだ。 だから、おそらく簡単に説明、 構文は少し変な場合であっても。 それでは、これを実行しましょう​​。 コピー-0を作成し、次に./copy-0。 ゲイブ:何かを言う。 の、残念ながら、両方の 彼らは現在、資産計上されているが、 しかし、そのための基礎となる 私たちは単純にしている理由 今のアドレスを扱う。 では、どのようにし始めるか address--しゃれintended-- どのように私たちはアドレスに始めるか この特定の問題? さて、copy1.cで、物事が起こっている もう少し複雑になります。 しかし、私は主張だろう 概念的には簡単な解決策。 一目見ただけで手に一生懸命。 第一のために簡単にするつもりはない あなたはおそらく、それを入力し、時間、 しかし、問題があることである場合 単純にトン= Sをやって コピーしたアドレスが、何を、 再び私はあなたに選ぶことができれば、 解決策になるだろう 実際には文字列をコピーする? 聴衆:私たちは、おそらくよ 再びループを使用しています。 DAVID J.マラン:うん。 だから私たちは再びループが必要になるだろう。 そして、私たちがコピーする場合は理由 別の文字列に文字列s、 私たちは、おそらくそれをやってみたい 文字単位。 しかし、問題は、以下の場合に、ある これは、もともとsである 今、私たちは、明示的に起動する必要があります tのためにメモリを割り当てる。 言い換えれば、してみましょう この最後にもう一度再描画します。 これは、文字列s =のGetStringある場合。 そして同様に、のはここにこれを入れてみましょう。 これはのGetStringです。 何かのためにそして、絵 そのように以前のようになるだろう、 G--B-E-/ 0。 つまり、このような小さなものになります。 そしてsは、したがって、私たちは、これは0x50を呼び出す それは51、52になるだろう。 だから、これは0x50をです。 そして、私は、文字列tを行います。 メモリでは、それはただになるだろう 私にこのような小さな広場を与える。 だから今重要なステップは、何ですか? 私がtにsのをコピーしたい場合、どのような 空白の私たちはここに記入する必要がありますか? それともには何が必要ですか ハイレベルでいますか? うん? 誰か? うん。 聴衆:私たちは、[聞こえない]にする必要があります。 DAVID J.マラン:ええ、私たち この空白を埋めるために必要がある。 私は、コピーしてはできません ゲイブの名前を大文字 Iは、オペレーティングシステムに依頼するまで メモリの別のチャンクの それは、元と少なくとも同程度大きいです。 だから、それが問題で私たちを残します。 私は、オペレーティングシステムをしない依頼するにはどうすればよい 単なる少しpointer--用 これは呼ばれるように、 住所、pointer--ません シンプルで小さなボックス このような文字列と呼ばれる? どうすれば、動作に尋ねるん メモリの大きな塊のためのシステム? これまでのところ、私はその背中を得ている 間接のGetStringを呼び出すことによって。 それでは、どのようにgetStringさ でも、そのメモリを取得する? まあ、それはそこだと判明 ここで、この他の機能 という私たちは今使用することから始めましょう。 さて、これは道より不可解than--に見える と私は見ることができる唯一の​​一人ですit-- このラインは道より不可解に見える それは一目見ただけですべきである。 しかし、ここでそれを離れていじめるましょう。 左側では、私は、char * tを持っている。 だから英語で、の策定を開始してみましょう 専門用語で適切な文章。 だから、これは割り当てて char型の変数をtと呼ばれる*。 さて、それは本当に何を意味するのでしょうか? まあ、それは意味し、私は何が起こっています トンと呼ばれるこの変数に置くか? char型のアドレス。 だから、ただ簡単です より合理的な方法 左側を説明する。 だから、ここでしか、このボックスを作成します。 だから、右辺、 おそらく、起こっている もっと大きなことを割り当てるための メモリのどのチャンク? それでは、これを離れていじめるましょう。 それは一目見ただけで圧倒だ、 しかし、内部ここで何が起こっているのですか? まず、malloc関数があります、これ 私たちの新しい友達は、明らかである 「メモリが割り当てられます。 " だから、これは渡される引数です その中に、ので、それは非常に大きな引数です。 それでは、これを離れていじめるましょう。 sのstrlen関数は、もちろん、the--表し 聴衆:文字の数。 DAVID J.マラン:ちょうど s内の文字の数。 だから、sの長さ、元の文字列。 だからG--B-E。 だから、おそらくここでは4つです。 なぜ私は後に1をしています sのstrlen関数を呼び出す? 聴衆:[聞き取れない] DAVID J.マラン:そのために 特別なヌル文字。 あなたは私に言わせれば、長さのものを ゲイブの名前は、私は4を言おうとしています。 ボンネットの下には、しかし、私が必要とする ヌル文字のため、第5バイト。 私は1をやっだから、なぜだ。 今だけの場合には、これを実行している 以外のコンピュータ上のプログラムは、言う CS50アプライアンス、 どこチャーのサイズ 異なる場合があります 私自身のcomputer--から 私はこれを呼び出すことができることが判明 オペレータはsizeof、ちょうど、コンピュータを尋ねる のサイズは何ですか このコンピュータにchar型? そして、これに5を乗算し char型の大きさによってその一例 ほとんどのコンピュータ上の意志 ひとつ、malloc関数であること 私のためにこの大きなを割り当てることが起こっている ここに右のオーバーメモリの塊。 そして、それはreturn--ために起こっている それはですので、それはfunction--です 私に何を返すつもり? 聴衆:アドレス? DAVID J.マラン:何のアドレス? 聴衆:それは割り当てられたメモリの? DAVID J.マラン:オブ メモリそれが割り当てられた。 だから私は、率直に言って、全く分からない これはどこに終わるだろう。 私はそれを提案するつもりだ それは0x88ので終了になるだろう。 完全に任意ですが、 0x50を除くどこかに、 オペレーティングシステムのために、どのような WindowsおよびMac OSは、私のためにされません それが与えていることを確認してください 私のRAM異なるチャンク。 だから、これは、この値である メモリのチャンクは終わるかもしれない。 だから、これは0x88の、ここで終わるものです。 だから今はっきりと、私は理解することができます これはこれと同じではないことを、 彼らはを指しているので メモリの異なるチャンク。 だから私は今実際にこれをコピーしたい場合は、 で、のはあなたの提案した解決策を実行してみましょう。 forループを作成し、ちょうど行ってみよう、 とtブラケットを行う私は、sブラケット私を取得します。 今私が使用することができますので、 この配列に似た表記法、 なぜならたとえmalloc関数は非常に 一般的に私にメモリを割り当て、 メモリは、単なる連続したバイトです。 バイト、バイト、バイト、背中合わせにバックアップする。 私は確かにプログラマーとして缶 これは、配列のように扱う 私はこの最後におなじみを使用できることを意味します 単にいくつかの大括弧の表記。 ですからので、私はそこに一時停止してみましょう これさえ、すべてを一度にたくさんある 要約への基本的な考え方も その文字列は、すべてのこの時間、 それ自体は、新しいデータ型ではありません。 それはちょうど、いわゆるポインタですが、 文字のアドレス、 これだけでは、番号の意味 その人間の慣例 私たちは、0xの何かを書く傾向がある。 しかし、それは、ただの数だ 33オックスフォードストリートのように、 それはあることを起こる CSビルのアドレス。 これらの詳細についてご質問? うん? 聴衆:なぜ私たちはチェックしますか ヌルに等しいtについて? DAVID J.マラン:なぜ私たちは nullに等しいトンをチェックする? 私たちはdocumentation--を読めば mallocのための素晴らしいquestion--、 それは、細かい文字で言うために起こっている 時にはmalloc関数は、NULLを返すことがあり、 ただのGetStringなどがある。 そして実際、のGetStringはnullを返します 、今度は、malloc関数はnullを返した場合、 のGetStringはmalloc関数を使用していますので。 OSあればそれは起こるかもしれない、 Mac OSでは、Windowsは、どのような、単純に あなたのためのメモリー不足。 だから、そこに何が起こったのです。 そして、私は一つの他の事を明らかにしてみましょう それはちょうどあなたの心を爆破かもしれない または完全に離れすぎて回線上であること。 しかし、私はプルアップしましょう コピー用のforループと同じ、 先ほど、これリコールした この。 Tブラケットiはsのブラケットiを取得します。 ニースとユーザーフレンドリー。 再び2週のように感じている。 しかし、このバージョンでは、実際にすることができ 不可解に見えるこれ、このように書き換える。 これは、ポインタと呼ばれる技術です 算術、アドレス演算。 しかし、なぜこれが動作しますか? 今うるさく、 Cの著者は、使用することを決めた 異なる目的のために*記号。 私たちは、それが既に一度使用を見てきました 「私に変数を与える意味はchar *、 それが含まれているために起こっている char型のアドレス。 " その文脈でそうCHAR * 「私に変数を与えること」を意味します。 残念ながら、あなたがすることなく*を使用している場合 その前に言葉、チャーのような、 現在では呼ばれています 間接参照演算子。 そして、私たちはずっと前にこれのより多く表示されます。 しかし、それは単に「そこに行く」を意味します。 誰かが私を手渡した場合は、言ってようなものだ 紙に「33オックスフォードストリート」 私がしなければ "* 33オックスフォードストリートに、「その手段 「CSの建物への道を下る。 " だから*ちょうどあればそこに行くことを意味 その前には言葉はありません。 だから、tは明確にするためには、何ですか? tはのチャンクのアドレスです 私に戻って与えられたメモリー。 sは、明確にすべきか、のアドレスである 例では、議論してきた、 小文字のゲイブの? sはアドレスですof-- 聴衆:文字列。 DAVID J.マラン:ゲイブの元の名前の中で。 だから、のアドレスです このメモリチャンク。 だから私がt + i--私は、通知を、言うなら ちょうど私たちの古くからの友人である。 それだけでインデックス変数です それは、最大でゼロから反復するだ 文字列sの長さ。 だから、ゼロ、1になるだろう その後、2つ、その後三つ、四つ。 それでは、これらの新しいを組み立てるましょう スクラッチのようなパズルのピース、可能ならば、 にもかかわらず、再び、構文 スクラッチよりもはるかに難解である。 だから、tはアドレス+である 私は私を与えるために起こっている これらが全てですので、数、 私たちは、16進数で描いてきた数字。 しかし、彼らはただの数字だ。 Tのアドレスは私達が言ったのであれば 0x88のプラスゼロ何、0x88のだった。 あなたが慣れていない方でも 六角ではまだ、推測を取る。 聴衆:オリジナル。 DAVID J.マラン:0x88の静止画。 だから* 0x88のは何を意味するのでしょうか? それは意味する「そこに行く」という意味 効果的に、「ここに指を置く。 " そして今の右側に この式、*、その後括弧内、 S +はiの手段秒、 ここで少しgをアップに取り組む。 秒+ 0が何秒であり、もちろん、sである。 だから今、それだけで*​​のような33 * sのだ オックスフォードストリートには、アドレスに行くことを意味 秒。 だからここにこの指、右手です。 それでは、私は何にコピーするつもり? で右のもの、 ここにゲイブ、ここで少しgであった。 そして、その結果の影響 ループの最初の反復、 あなたはそれが見えていても、提案されているように 何よりもクレイジーより複雑 私たちは、以前に見たことが単純に言っている ここに行くと、ここでその文字をコピーします。 それはあなたの両方の場所に地図を与えている。 そして、私たちはこれをはるかに表示されます。 しかし、今のところ、希望がわずかにある これらの基本的なアイデアをいくつかご紹介します。 そして実際、それでは見てみましょう ここに1最終的なプログラム、 、次に約束したクレイ、 そのすべてが大丈夫になります。 かしこまりました。 だから私はそこに私達は行くup--開いてみましょう。 私たちは戻ってくるme--そうしましょう ずっと前にこの絵に。 私はここに、この最後の例を開いてみましょう。 だからここにスーパー、スーパーで 実現プログラム 次のことを行います生活の中では何もありません。 これは、最初の2つの変数のxを宣言 とy、今回は数値ではない、 それ自体。 彼らは、それ自体が、整数ではないよ。 彼らは明らかに* int型されている。 だから誰もが、それは何を意味するのか あなたのデータ型であれば、あなたの変数、 型int *スターのでしょうか? つまり、int型のアドレスです。 だから私はそれがまだあるさっぱりだが。 それはちょうど、「最終的には、置くことを意味 ここにint型のアドレス。 " それがである場所0x50を、0x88の、 メモリは、アドレスがそこに起こっている。 そして、それはyは何 同様に、あることを行って。 私が今言うなら、X =のmalloc(はsizeof(int型))、 これは、というのがファンシーな方法ですが、 ちょっとオペレーティングシステム、malloc関数を経由して、 サイズは私に十分なメモリを与える おそらく、int型の 32ビットまたは4バイトになるだろう。 だから、malloc関数は何を返すのでしょうか? malloc関数は、アドレスを返します。 それでは、Xに格納されて取得するつもりだ? のチャンクのアドレス メモリ、4バイト、それはmalloc ただ尋ねることによって私のために発見 オペレーティングシステム。 さて一方、行 ここでは4、* X = 42。 ただ明確にするために、 ダウンそこに何が起こっているの? 左側に、*のx。 それは* 33オックスフォードストリートのようなものだ。 だから、* xが何を意味? 聴衆:に移動します。 DAVID J.マラン:そのアドレスに移動します。 どこのそのチャンク メモリはそれに行く、である。 そして明らかに、どのようなそこに置か? 聴衆:42。 DAVID J.マラン:42。 すべての権利、* yを、同じ考え。 yのアドレスに移動します。 そこに数13を入れ、 しかし現時点では、yは何ですか? 聴衆:yに対するメモリがありません。 DAVID J.マラン:あり Yのためのメモリがありません。 それでは、おそらくyとし 私たちが言ってきたように、含まれている? 聴衆:ごみ。 DAVID J.マラン:一部のごみ値。 次に、ガベージ値がまだ数です。 それはまだアドレスと間違われることができます。 それは誰かいるかのようだ ダウン何かを走り書き、 と私は意味としてそれを誤解 通りをいくつかの建物。 そして、あなたはちょうどに移動しよう あなたが所有していないいくつかの建物、 あなたが持っていないメモリのまたはいくつかのチャンク 与えられて、悪い事が起こるかもしれません。 コンピュータがクラッシュしたり、他のいくつかの可能性があります 未確定動作が発生する可能性があります。 だから、その後、Binkyこのイントロです。 私はまだ20、覚えている いくつかの奇妙年後、 私はときに私やっとあった場所 ポインタを理解していた。 あなたはどちらも、と言うことです 3分でここに残す と私にはないと思う ポインタを理解し、実現する 私は20のために覚えている いくつかのクレイジーな理由で年 いつ、なぜ、それが最終的に沈没 で、私の授業で座っ 仲間、Nishatメータ内 エリオットダイニングホールの裏側。 今、私は思い出しました これこれがあったため、 トピックのいずれか、私は、中 特に、苦戦。 その後、それは最終的にクリック、 のような私は、トピックの多くをあえて言う 最終的になります。 そして今、それはすべての気分にさせるために 幸せとすべてのより説得力、 私たちの中で最後のを見てみましょう ここBinkyで最後の3分、 私たちの友人、ニックから スタンフォードからParlante。 [ビデオ再生] -Hey、Binky。 目を覚ます! これは、ポインタの楽しみのための時間です。 それは - 何ですか? ポインタについて学ぶ? ああ、グッディ! 型ウェル、始めるために、私たちはしていると思います カップルのポインタが必要になるだろ。 -OK。 このコードは、2つのポインタを割り当て、 これは整数を指すことができます。 -OK。 さて、私は2つのポインタを参照してくださいますが、それら 何を指していないようです。 - すなわちそうです。 最初は、ポインタ 何を指していない。 彼らは呼ばれているものを指す 指示先、およびそれらの設定の 別のステップ。 右、右、-OH。 私はそれを知っていた。 指示先は別のものです。 小胞体、それでは、どのように指示先を割り当てるのですか? -OK。 さて、このコードは割り当て、 新しい整数ポインタの指示、 この部分集合xは、それを指すように設定します。 -Hey、それが良く見える。 だから、何かを作る。 -OK。 私よへのポインタxの逆参照 その指示先に数42を格納します。 このトリックのために、私は私のが必要になるでしょう 間接参照の魔法の杖。 間接参照の - あなたの魔法の杖? That--それは素晴らしいことです。 - これは、コードがどのようなものです。 私はちょうど番号、[POP]をセットアップします -Hey、見て。 そこにそれは行く。 xは以下の通りで間接参照をしている - SO 矢印は、その指示先にアクセスします。 そこで、この場合、店舗42。 ちょっと数を格納するためにそれを使用してみてください 他のポインタ、yは13〜。 -OK。 私はちょうどyにこっち行くよ、 その数13は、設定されたりし。 そして、ワンドオブを取る 間接参照だけ[BUZZ] -OH! ちょっと、-OH! それは動作しませんでした。 Binky、私はデリファレンスとは思わない、と言う あなたが知っているので、yは、良い考えです 指示先を設定する 別のステップである。 そして、私は私たちが今までそれをやったとは思わない。 グッドポイント。 -Yeah。 私たちは、ポインタyを割り当てたが、私たち 指示先を指すように設定することはありません。 - 非常に注意深い。 -Hey、あなたは、そこにBinkyの良い探しています。 yを指すように、あなたはそれを修正することができます xと同じ指示先へ? -sure。 私は自分の魔法の杖を使用します ポインタ代入の。 になるだろうことを-is 前のような問題? - いいえ。 これは指示先に触れていない。 それはちょうど1つのポインタを変更する 別のと同じことを指している。 OH、なるほど。 xと同じ場所に今yを指しています。 だから、待ってください。 ここで、yは固定されている。 それは、指示先を持っています。 だから、ワンドオブを試すことができます 13オーバーを送信するために再び間接参照。 [OK]を、-UH。 ここでは、行く。 [POP] -Hey、その見てください。 今Y上の作品を逆参照。 そして、ポインタが共有しているため、 1指示先という、どちらも13を参照してください。 -Yeah。 共有、何でも。 だから私たちは今の場所を切り替えるために行くの? ああ、見て。 私たちは、時間がなくなっている。 -But-- 3ポインタのルールを覚えて-Just。 ナンバーワン、基本的な構造 あなたは、ポインタを持っているということです、 そしてそれは指示先に引き継が指しています。 しかし、ポインタと 指示先は、分離している そして一般的なエラー ポインタを設定することです、 しかしそれを指示先を与えることを忘れている。 数二、逆参照ポインタ ポインタで始まり、 オーバーその矢印に従う その指示先にアクセスします。 私達はすべて知っているように、この がある場合にのみ動作します 指示先、種類の ナンバーワンルールに戻って取得します。 ナンバースリー、ポインタ 割り当ては1ポインタを取り とを指すように変更します 別のポインタと同じ指示先。 だから割当て後、 二つのポインタ 同じ指示先を指すようになります。 時には、そのは共有と呼ばれています。 そして、それは本当に、これだけです。 バイバイ今。 [END VIDEO再生] DAVID J.マラン:それはCS50は終わりです。 私たちは、来週お会いしましょう​​。