>> [音楽再生]
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？
第二に-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は終わりです。
私たちは、来週お会いしましょう​​。