1 00:00:00,000 --> 00:00:01,110 >> [音楽再生] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 DAVID J.マラン:すべての権利。 4 00:00:11,650 --> 00:00:15,610 これはCS50であり、この 第4週の終わりである。 5 00:00:15,610 --> 00:00:19,420 そしてトピックのいずれか、今日 デジタルフォレンジックの、すなわち、 6 00:00:19,420 --> 00:00:20,989 情報を回復する技術。 7 00:00:20,989 --> 00:00:22,780 そして実際、たとえ あなたは真っ只中にいる 8 00:00:22,780 --> 00:00:25,070 今、平和の三つの時 そしてブレイクアウト、来週、 9 00:00:25,070 --> 00:00:27,880 フォーカスがオンになります 正確にこのドメイン。 10 00:00:27,880 --> 00:00:30,686 >> だから、私が今までクールな仕事の一つに バック大学院でだった、 11 00:00:30,686 --> 00:00:33,560 私は地元のために働いていたとき ミドルセックス郡地方検事の 12 00:00:33,560 --> 00:00:34,950 オフィス、フォレンジック作業を行う。 13 00:00:34,950 --> 00:00:37,450 だから基本的に、マサチューセッツ州 州警察​​、機会に、 14 00:00:37,450 --> 00:00:40,100 ケースで作業するときだろう ハードドライブのようなものを持ち込む 15 00:00:40,100 --> 00:00:42,185 フロッピーディスクや メモリカード等である。 16 00:00:42,185 --> 00:00:44,060 そして、彼らはそれらを渡したい 私と私のメンターに、 17 00:00:44,060 --> 00:00:48,070 私たちの目標は、証拠を見つけることだった、 これらのメディア上のいずれかを、があった場合。 18 00:00:48,070 --> 00:00:50,700 今、あなたが見ている可能性があります見え隠れ フォレンジックのこの世界の 19 00:00:50,700 --> 00:00:53,000 メディア、テレビ、映画で。 20 00:00:53,000 --> 00:00:55,730 しかし、仕事は私が持っていたし、 、その世界をあえて 21 00:00:55,730 --> 00:00:57,550 あなたはそれを見ることは非常に似ていない。 22 00:00:57,550 --> 00:01:00,794 それでは何を見てみましょう おそらく見てきました。 23 00:01:00,794 --> 00:01:01,460 [ビデオ再生] 24 00:01:01,460 --> 00:01:02,930 -OK。 25 00:01:02,930 --> 00:01:05,380 それでは、あなたをよく見を紹介しています。 26 00:01:05,380 --> 00:01:06,850 >> [音楽再生] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> それを-hold。 29 00:01:12,932 --> 00:01:13,657 その背中を実行します。 30 00:01:13,657 --> 00:01:14,733 >> 分-wait。 31 00:01:14,733 --> 00:01:15,233 右に行く。 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -There。 34 00:01:16,870 --> 00:01:17,369 それをフリーズします。 35 00:01:17,369 --> 00:01:17,930 - フルスクリーン。 36 00:01:17,930 --> 00:01:18,376 >> -OK。 37 00:01:18,376 --> 00:01:18,875 それをフリーズします。 38 00:01:18,875 --> 00:01:20,160 その上に-Tighten、あなたでしょう? 39 00:01:20,160 --> 00:01:22,126 >> その上にある - ベクトル 後輪による男。 40 00:01:22,126 --> 00:01:24,435 >> 右こここの場でで-Zoom。 41 00:01:24,435 --> 00:01:28,580 >> 適切な機器 - 抜け、 画像を拡大して先鋭化することができる。 42 00:01:28,580 --> 00:01:29,330 >> それは - 何ですか? 43 00:01:29,330 --> 00:01:30,780 >> - それは、強化プログラムです。 44 00:01:30,780 --> 00:01:32,170 >> その最大明確なあなたが-CAN? 45 00:01:32,170 --> 00:01:33,070 >> -Iは知らない。 46 00:01:33,070 --> 00:01:34,150 のはそれを強化しましょう​​。 47 00:01:34,150 --> 00:01:35,440 >> -Enhance節A6。 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 私は細部を高め、and-- 50 00:01:38,562 --> 00:01:40,020 -Iは向上させるのに十分ながあると思う。 51 00:01:40,020 --> 00:01:40,976 私の画面にそれを解放します。 52 00:01:40,976 --> 00:01:42,559 >> -Iは彼女の目の中に反射を強化した。 53 00:01:42,559 --> 00:01:44,322 を介してこれを実行するのを-LEt ビデオ強化。 54 00:01:44,322 --> 00:01:45,210 >> -Edgar、あなたはこれを強化することができますか? 55 00:01:45,210 --> 00:01:45,710 >> 上-hang。 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> この反射に取り組んでき-I've。 58 00:01:49,458 --> 00:01:50,402 >> -Thereの誰かのリフレクション。 59 00:01:50,402 --> 00:01:50,902 >> -Reflection。 60 00:01:50,902 --> 00:01:52,870 人間の顔の反射が-Thereです。 61 00:01:52,870 --> 00:01:53,694 >> -The反射! 62 00:01:53,694 --> 00:01:54,610 反射が-Thereです。 63 00:01:54,610 --> 00:01:55,880 ミラー上での-Zoom。 64 00:01:55,880 --> 00:01:57,860 あなたは反射を見ることができます。 65 00:01:57,860 --> 00:01:59,630 >> あなたは、ここからイメージを高める-CAN? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 あなたはそれを強化-CAN? 68 00:02:01,210 --> 00:02:02,190 あなたはそれを強化-CAN? 69 00:02:02,190 --> 00:02:03,066 私たちはこれを強化する-CAN? 70 00:02:03,066 --> 00:02:03,898 あなたはそれを強化-CAN? 71 00:02:03,898 --> 00:02:04,740 第二に-hold。 72 00:02:04,740 --> 00:02:05,281 私は高めでしょう。 73 00:02:05,281 --> 00:02:06,470 ドアに中-Zoom。 74 00:02:06,470 --> 00:02:06,970 10 -Times。 75 00:02:06,970 --> 00:02:08,009 -Zoom。 76 00:02:08,009 --> 00:02:08,509 中-move。 77 00:02:08,509 --> 00:02:09,340 - より多くの。 78 00:02:09,340 --> 00:02:10,094 -wait、停止します。 79 00:02:10,094 --> 00:02:10,750 -stop。 80 00:02:10,750 --> 00:02:11,250 それを-Pause。 81 00:02:11,250 --> 00:02:13,542 私たちに75度を-rotate 垂直の周りでお願いします。 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> -stop。 84 00:02:16,127 --> 00:02:19,330 パートに戻る 再びドアに関する。 85 00:02:19,330 --> 00:02:21,420 >> ビットマップができるイメージ·エンハンサーを-Got? 86 00:02:21,420 --> 00:02:24,420 >> 私たちはプラディープ·シンを使用することができます-Maybe この方法は、ウィンドウに表示します。 87 00:02:24,420 --> 00:02:25,902 >> -Theソフトウェアは、従来技術である。 88 00:02:25,902 --> 00:02:26,866 >> -The固有値がオフになっています。 89 00:02:26,866 --> 00:02:29,758 >> 右 - 抜け algorithms--の組み合わせ 90 00:02:29,758 --> 00:02:32,168 >> -Heの撮影照明 次のレベルへのアルゴリズム、 91 00:02:32,168 --> 00:02:34,110 そして私は、それらを使用することができます この写真を向上させる。 92 00:02:34,110 --> 00:02:36,840 >> 上-lock z軸を拡大する。 93 00:02:36,840 --> 00:02:37,351 >> -Enhance。 94 00:02:37,351 --> 00:02:37,850 強化します。 95 00:02:37,850 --> 00:02:38,720 -Enhance。 96 00:02:38,720 --> 00:02:40,070 -freezeと高め。 97 00:02:40,070 --> 00:02:43,420 [END VIDEO再生] 98 00:02:43,420 --> 00:02:45,830 DAVID J.マラン:だからものがある すべての単語が、彼らはありませんでした 99 00:02:45,830 --> 00:02:47,870 正しく文章で使用。 100 00:02:47,870 --> 00:02:52,370 そして実際、将来的に、いつでも、 、誰かが言葉を言うのを聞くしてください、 101 00:02:52,370 --> 00:02:54,250 少し含み笑いを「強化」。 102 00:02:54,250 --> 00:02:57,190 あなたが強化しようとするので、 例えば、これは何が起こるかです。 103 00:02:57,190 --> 00:02:58,580 >> だからここにゴージャスな写真です。 104 00:02:58,580 --> 00:02:59,720 これはCS50自身祈るです。 105 00:02:59,720 --> 00:03:03,740 そして、私たちがしたかったとし 彼の目に輝きに焦点、 106 00:03:03,740 --> 00:03:05,870 または反射 明らかにした悪いやつ 107 00:03:05,870 --> 00:03:07,820 セキュリティカメラで撮影。 108 00:03:07,820 --> 00:03:10,330 これは何が起こるかです あなたはそのイメージにズームイン 109 00:03:10,330 --> 00:03:14,060 有限個しかを持って それに関連したビットの。 110 00:03:14,060 --> 00:03:15,420 >> それはあなたが得るであろうものである。 111 00:03:15,420 --> 00:03:19,190 そして実際、祈るの目の中 多分6ピクセルですが、4 112 00:03:19,190 --> 00:03:22,110 それが正確に何を構成する そこにかすかた。 113 00:03:22,110 --> 00:03:25,890 だから、問題を設定し、最終的には四があります あなたは、特に、この世界を探検 114 00:03:25,890 --> 00:03:28,090 何かの性質によって、 私たちはここで、I / Oファイルを呼び出す 115 00:03:28,090 --> 00:03:31,000 I / Oは、ただの空想の方法です 入力と出力を言って。 116 00:03:31,000 --> 00:03:34,280 >> だからこれまで、相互作用のすべて 私たちは、コンピュータとの過去 117 00:03:34,280 --> 00:03:36,770 あなたに主になっている キーボードと画面、 118 00:03:36,770 --> 00:03:40,770 ハードディスクではなく、あまり、 または1を超えてのファイルで保存します 119 00:03:40,770 --> 00:03:41,620 自分で書きます。 120 00:03:41,620 --> 00:03:44,570 あなたのプログラムは、これまで持っている 作成、保存されていない、 121 00:03:44,570 --> 00:03:46,270 そして自分のファイルを更新する。 122 00:03:46,270 --> 00:03:47,150 >> さて、ファイルは何ですか? 123 00:03:47,150 --> 00:03:48,105 さて、JPEGのようなもの。 124 00:03:48,105 --> 00:03:50,520 これは、かもしれないイメージです 持っているか、Facebookを利用してアップロードし、 125 00:03:50,520 --> 00:03:51,690 またはWeb上のどこを参照してください。 126 00:03:51,690 --> 00:03:54,460 確かに、その写真私たちは 祈るののこぎりは、JPEGであった。 127 00:03:54,460 --> 00:03:57,570 そして、何が面白い JPEGファイルのようなファイルについて 128 00:03:57,570 --> 00:04:02,170 それらが同定され得ることである、 一般的に、ビットの特定のパターンによる。 129 00:04:02,170 --> 00:04:05,200 >> 言い換えれば、それは何であること GIFからJPEGを区別する 130 00:04:05,200 --> 00:04:08,109 WordからPINGから Excelファイルからドキュメント? 131 00:04:08,109 --> 00:04:09,900 まあ、それだけで違う ビットのパターン。 132 00:04:09,900 --> 00:04:12,820 そして、それらの異なるパターンがあります 通常、これらのファイルの先頭に。 133 00:04:12,820 --> 00:04:18,200 >> お使いのコンピュータは、Wordを開いたときにするように ドキュメント、またはコンピュータは、JPEGを開いたときに、 134 00:04:18,200 --> 00:04:20,940 それは、典型的に見える ファイルの最初の数ビット。 135 00:04:20,940 --> 00:04:24,059 そして、それはパターンを認識した場合、 それがああ、これはイメージです、と言います。 136 00:04:24,059 --> 00:04:25,850 私はそれを表示してみましょう グラフィックなどのユーザ。 137 00:04:25,850 --> 00:04:27,870 または、ああ、これはWord文書のように見えます。 138 00:04:27,870 --> 00:04:30,480 私はエッセイとしてユーザに見せましょう。 139 00:04:30,480 --> 00:04:33,020 >> だから例えば、JPEGファイル、 それは結局のところ、ある 140 00:04:33,020 --> 00:04:35,460 かなり高度な ボンネットの下に。 141 00:04:35,460 --> 00:04:40,140 しかし、ほとんどすべての中で最初の3バイト JPEGは、これらの3つの数字で始まる。 142 00:04:40,140 --> 00:04:44,680 そうバイトゼロ、1、および2である ほとんどすべてのJPEG、255の場合、数 143 00:04:44,680 --> 00:04:46,675 216は、数255。 144 00:04:46,675 --> 00:04:48,990 >> そして、何あなたができるようになります 来週やって起動する 145 00:04:48,990 --> 00:04:52,920 実際に下に突っついている JPEGファイルのようなファイルのフード 146 00:04:52,920 --> 00:04:57,210 等のビットマップファイル、および見 いつものように長い間そこに何をされています 147 00:04:57,210 --> 00:04:58,650 あなたはコンピュータを使用してきたように。 148 00:04:58,650 --> 00:05:01,860 >> しかし、一般的に存在しないものだ このような小数のように書かれて。 149 00:05:01,860 --> 00:05:04,620 コンピュータ科学者はそうではない 小数で話す傾向がある。 150 00:05:04,620 --> 00:05:06,139 彼らは本当にバイナリで話すことはありません。 151 00:05:06,139 --> 00:05:07,930 一般的には、私たちが望むとき 数字を表現するために、 152 00:05:07,930 --> 00:05:10,710 私たちは実際に進を使用し、 そのあなたが思い出すかもしれ 153 00:05:10,710 --> 00:05:13,027 問題セット、たとえば、から 挑戦の一つ、 154 00:05:13,027 --> 00:05:14,610 あなたは別のシステムを考えること。 155 00:05:14,610 --> 00:05:17,170 >> 私たちは、当然ながら、よく知られている ■10進数で、0〜9。 156 00:05:17,170 --> 00:05:18,215 私たちは、バイナリについて話しました。 157 00:05:18,215 --> 00:05:20,710 そして、私たちは本当に持っていない それだけここに使用する 158 00:05:20,710 --> 00:05:22,470 うちに、コンピュータがそれを使用するため。 159 00:05:22,470 --> 00:05:24,900 しかし、プログラマは非常に意志 多くの場合、常にではないが、 160 00:05:24,900 --> 00:05:29,360 ちょうど意味し、進数を使用 あなたのアルファベットの16文字を持っている、 161 00:05:29,360 --> 00:05:31,330 2または10に対向するように。 162 00:05:31,330 --> 00:05:34,530 >> それでは、どのようにそれ以上に数えない 進数で9よりも? 163 00:05:34,530 --> 00:05:41,120 あなたが行く0、1、2、3、4、5、6、7、8、9、 A、B、C、D、E、F、単に慣例により。 164 00:05:41,120 --> 00:05:43,540 しかし、何がキーなのはそれぞれのことです これらの単一のシンボルである。 165 00:05:43,540 --> 00:05:44,340 何10はありません。 166 00:05:44,340 --> 00:05:48,400 各ので、全く11は、それ自体が、存在しない あなたの数字の、ちょうど進数のよう 167 00:05:48,400 --> 00:05:51,940 単にバイナリのようにして、ただすべき 慣例により、単一の文字である。 168 00:05:51,940 --> 00:05:55,280 >> だから、私たちが持っているアルファベットは、 進のための私達の処分で。 169 00:05:55,280 --> 00:05:58,600 だから、JPEGは、あなたの場合のように、何を見ていない これらの最初の3を書き出すためにあった 170 00:05:58,600 --> 00:06:01,980 小数ではないバイトですが、 例えば16進数として? 171 00:06:01,980 --> 00:06:03,640 そして、なぜ六角でもすべてのことに役立ちましたか? 172 00:06:03,640 --> 00:06:05,290 >> さて、例を簡単に見て。 173 00:06:05,290 --> 00:06:09,030 だから私はビットを書き出す場合に これらの小数を表すnumbers-- 174 00:06:09,030 --> 00:06:12,450 これは少しさびたかもしれない すぐに戻って数週間から、 175 00:06:12,450 --> 00:06:14,820 左1と 右は非常に簡単です。 176 00:06:14,820 --> 00:06:17,990 255は、最大の数の私たちでした 8ビットで表すことができます。 177 00:06:17,990 --> 00:06:18,820 それはすべてのものでした。 178 00:06:18,820 --> 00:06:21,320 だから、軽度の唯一の 興味深いのは、真ん中の一つです。 179 00:06:21,320 --> 00:06:24,700 そして、あなたは種類から行う場合 数学では、あなたは、確かに、それを推測します 180 00:06:24,700 --> 00:06:27,949 1のパターンと、 ゼロは216を表す。 181 00:06:27,949 --> 00:06:30,240 それでは、ただのために規定しましょう 今、これらが正しいこと。 182 00:06:30,240 --> 00:06:31,730 しかし、なぜこれが面白い? 183 00:06:31,730 --> 00:06:33,970 >> さて、バイトは、当然のことながら、8ビットである。 184 00:06:33,970 --> 00:06:38,980 そして、それはあなたが考える場合は、ことが判明 4ビットの2つのチャンクとしてバイト、 185 00:06:38,980 --> 00:06:39,500 このように。 186 00:06:39,500 --> 00:06:41,000 私はいくつかのスペースを追加してみましょう。 187 00:06:41,000 --> 00:06:42,550 だから前、後。 188 00:06:42,550 --> 00:06:46,520 私はいくつかの空白を追加しました ここで可視化のために。 189 00:06:46,520 --> 00:06:51,840 どのように私たちは今では表すことができ、 進ビットの各クワッド、言う、 190 00:06:51,840 --> 00:06:52,880 4ビットの各セット? 191 00:06:52,880 --> 00:06:56,420 >> だから例えば、左側の 今、私たちはバイナリで1111を持っています。 192 00:06:56,420 --> 00:07:00,420 進数でその数は何ですか、 あなたは数学を行う場合は? 193 00:07:00,420 --> 00:07:03,780 あなたは、一の位、2の場所を持っている 四つんばいの場所、およびエイト場所。 194 00:07:03,780 --> 00:07:04,341 >> 聴衆:15。 195 00:07:04,341 --> 00:07:05,340 DAVID J.マラン:それは15です。 196 00:07:05,340 --> 00:07:08,340 だから私たちは8プラス4を行う場合 プラス2プラス1、私たちは15を得る。 197 00:07:08,340 --> 00:07:11,790 だから私は、以下の15を下に書くことができる 1111が、ここでは全体のポイント 198 00:07:11,790 --> 00:07:13,190 16進数、小数ではない。 199 00:07:13,190 --> 00:07:17,310 だからではなく、書き留めの15、1-5、 私は、ヘックスにそれを書くつもりだ 200 00:07:17,310 --> 00:07:22,311 そのお持ちの場合は、戻って思えば ゼロからf、何15は、になるだろう? 201 00:07:22,311 --> 00:07:22,810 聴衆はf。 202 00:07:22,810 --> 00:07:24,434 DAVID J.マラン:だからそれはそれのfで判明。 203 00:07:24,434 --> 00:07:29,140 そして、あなたは言ってそれをうまくすることができ、 10であればよく、[OK]を、fは15である。 204 00:07:29,140 --> 00:07:33,250 だから確かに、私たちは書き換えることができます F fとしてこの数値の同じセット。 205 00:07:33,250 --> 00:07:35,750 そして、私たちは数学のビットを行う場合には、 私たちはそれをdだと推測するでしょう。 206 00:07:35,750 --> 00:07:38,650 エイトは、非常に簡単です私たちのため エイトの場所に1つを持っています。 207 00:07:38,650 --> 00:07:40,620 そして、私たちはF Fのカップルより多くを持っている。 208 00:07:40,620 --> 00:07:44,669 >> それでは人間は慣例により行う傾向 彼らは、16進数を使用する場合、彼らはただです 209 00:07:44,669 --> 00:07:47,710 もう少し簡潔にこれを書いて、 そのホワイトスペースの大部分を取り除く。 210 00:07:47,710 --> 00:07:50,890 そして、ちょうどにスーパークリアすべき これは16進であることを読者に、 211 00:07:50,890 --> 00:07:54,670 の中で、単純な規則 人間は、ゼロを書き込むことが 212 00:07:54,670 --> 00:07:58,000 他の意味を持たないのx、 の視覚的な識別子よりも、 213 00:07:58,000 --> 00:07:59,590 ここ進数が付属しています。 214 00:07:59,590 --> 00:08:04,210 >> そして、あなたは、fの2桁を置く この場合はF、そしてDは、F F。 215 00:08:04,210 --> 00:08:06,700 だから長い話を短く、 進はちょうど傾向 216 00:08:06,700 --> 00:08:11,990 有用であることが、それぞれ、その 数字、aからfゼロ、完璧にライン 217 00:08:11,990 --> 00:08:13,880 4ビットのパターンで最大。 218 00:08:13,880 --> 00:08:18,080 >> ですから、2桁の16進数を持っている場合、 ゼロからF、何度も何度も、 219 00:08:18,080 --> 00:08:20,256 それは完全にあなたを与える 8ビットまたは1バイト。 220 00:08:20,256 --> 00:08:22,380 それがする傾向だから、なぜです 従来は便利です。 221 00:08:22,380 --> 00:08:24,990 全く知的ではありません 本当にそれを超えたコンテンツ、 222 00:08:24,990 --> 00:08:27,010 その実際の有用性以外の。 223 00:08:27,010 --> 00:08:29,310 >> 今、JPEGファイルだけではありません グラフィックスのファイル形式。 224 00:08:29,310 --> 00:08:33,230 あなたが存在することを思い出すかもしれません 世界でこのようなファイルは、 225 00:08:33,230 --> 00:08:34,830 少なくとも数年前から。 226 00:08:34,830 --> 00:08:37,580 >> だから、これは実際にあった Windows XPでインストールされて 227 00:08:37,580 --> 00:08:39,960 世界中で何百万台ものコンピュータ上に。 228 00:08:39,960 --> 00:08:43,000 そして、これは、ビットマップファイル、BMPた。 229 00:08:43,000 --> 00:08:47,690 そして、ビットマップファイルには、次のように表示されます 週、単にドットのパターンを意味し、 230 00:08:47,690 --> 00:08:51,710 彼らが呼ばしているようにピクセル、 本当にビット、上のマップ。 231 00:08:51,710 --> 00:08:55,160 >> それでは、しかし、興味深いのは、 このファイル形式、BMPについて、ある 232 00:08:55,160 --> 00:08:58,590 そのフードの下に、それを ちょうど3バイト以上のものを持って 233 00:08:58,590 --> 00:09:01,020 それはそう、そのヘッダを構成する 、最初のいくつか刺さ話す。 234 00:09:01,020 --> 00:09:03,330 それは実際に少し見える 一見すると複雑。 235 00:09:03,330 --> 00:09:04,704 そして、あなたはPセットでこれを表示されます。 236 00:09:04,704 --> 00:09:06,810 そして、何かを得て 今、このうち特定の 237 00:09:06,810 --> 00:09:10,720 ただ事実として、それほど重要ではありません そのすべてのビットマップの先頭に 238 00:09:10,720 --> 00:09:13,823 ファイル、グラフィカル形式、 数字の全体の束があります。 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> さて、マイクロソフト、 この形式の著者、 241 00:09:16,720 --> 00:09:18,820 それらをコールする傾向がある 物事はないintと文字 242 00:09:18,820 --> 00:09:22,259 と山車が、言葉と、d 言葉やlongとバイト。 243 00:09:22,259 --> 00:09:23,800 そこで、彼らは単に別のデータ型をしている。 244 00:09:23,800 --> 00:09:25,170 彼らは、異なる名前をしている 同じことのために。 245 00:09:25,170 --> 00:09:26,740 しかし、あなたはPセット4人にそれを表示されます。 246 00:09:26,740 --> 00:09:31,450 >> しかし、これは人間の場合と言うことだけです。 彼にいくつかの.BMPファイルをダブルクリックする 247 00:09:31,450 --> 00:09:35,015 または彼女のハードドライブ、およびウィンドウが開きます 彼または彼女その画像を示すまで、 248 00:09:35,015 --> 00:09:38,500 それは、オペレーティングので起こった システムだけでなく、おそらく気づいた 249 00:09:38,500 --> 00:09:41,460 .BMPファイルの拡張子 ファイル名に、 250 00:09:41,460 --> 00:09:45,010 だけでなく、事実があることをいくつか ビットのパターンに大会 251 00:09:45,010 --> 00:09:47,490 非常に初めに そのビットマップファイルの。 252 00:09:47,490 --> 00:09:50,270 >> しかし、それではこれから注目しましょう このような複雑なファイル、 253 00:09:50,270 --> 00:09:52,120 その代わりに、このようなものについて。 254 00:09:52,120 --> 00:09:55,190 私は、geditの中でここにあるとし ちょうど始まりを持っている 255 00:09:55,190 --> 00:09:57,070 非常に単純なプログラムの。 256 00:09:57,070 --> 00:09:58,860 私はいくつかがトップを備えて持っている。 257 00:09:58,860 --> 00:10:02,120 今私は、#include "structs.h」を持っているが、 私は、現時点で戻ったのと来る。 258 00:10:02,120 --> 00:10:03,974 しかし、これは今のために有用である。 259 00:10:03,974 --> 00:10:05,890 だから、これはプログラムであり、 それが実現するために起こっている 260 00:10:05,890 --> 00:10:07,335 レジストラのデータベースのように。 261 00:10:07,335 --> 00:10:09,710 だから、学生のデータベース、 そして世界のすべての学生 262 00:10:09,710 --> 00:10:13,190 名前と家、おそらくいくつかを持っています 他のものが、私たちはそれをシンプルにしておこう。 263 00:10:13,190 --> 00:10:15,140 すべての学生には、名前と家を持っています。 264 00:10:15,140 --> 00:10:17,700 >> 私が書きたいのであれば その目的は生活の中でのプログラム 265 00:10:17,700 --> 00:10:19,860 ちょうどから反復処理することであった 最大3つのゼロ、 266 00:10:19,860 --> 00:10:22,070 3人の学生があるかどう ハーバード大学。 267 00:10:22,070 --> 00:10:25,350 そして、私はただのGetStringを使用して、取得したい、 各学生の名前と家、 268 00:10:25,350 --> 00:10:26,600 してからちょうどそれらをプリントアウト。 269 00:10:26,600 --> 00:10:28,630 >> これは一種の週のようです 一方、2週のものになりました、 270 00:10:28,630 --> 00:10:30,810 私はちょうどのためにしたい場所 ループまたはそのような何か。 271 00:10:30,810 --> 00:10:34,500 そして、私はいくつかのgetString呼び出したい 時間は、その後、数回fを印刷します。 272 00:10:34,500 --> 00:10:37,340 だから私は、しかし、これを実行する方法を、 ときに名前と家の両方 273 00:10:37,340 --> 00:10:39,070 各生徒のために関与している? 274 00:10:39,070 --> 00:10:42,830 >> だから私の最初の本能は、かもしれない このような何かをすること。 275 00:10:42,830 --> 00:10:49,620 私が最初によく、私を与える、と言うかもしれない、 名前と呼ばれる文字列の配列を言う。 276 00:10:49,620 --> 00:10:51,530 そして、私はここにハードコード3を望んでいない。 277 00:10:51,530 --> 00:10:53,064 私はそこに置くために何をしたいですか? 278 00:10:53,064 --> 00:10:55,730 だから学生、それはただだから 先頭で宣言定数、 279 00:10:55,730 --> 00:10:57,860 ちょうどので、私はハードコーディングする必要はありません 複数の場所で3。 280 00:10:57,860 --> 00:11:00,859 このように、私はそれを一つの場所を変更することができ、 そしてそれはどこにでも変化に影響を与えます。 281 00:11:00,859 --> 00:11:04,470 そして、私が行う可能性があります 文字列には、学生を収容する。 282 00:11:04,470 --> 00:11:10,250 >> そして今、私のような何かをするかもしれない 私は学生を<;のために(i = 0のint型私+ +。 283 00:11:10,250 --> 00:11:14,390 だから私は、高速入力しているが、これはある 今、おそらくお馴染みの構文。 284 00:11:14,390 --> 00:11:17,030 >> そして今、これは最近のだった。 285 00:11:17,030 --> 00:11:22,890 私は、i番目に配置したい場合 学生の名前、私はこれを行うと思います。 286 00:11:22,890 --> 00:11:26,480 そして、名前ではなく しかし家は私を囲む。 287 00:11:26,480 --> 00:11:29,930 私は、これを行うのGetString、としましょう 私は戻って、この行を修正します。 288 00:11:29,930 --> 00:11:30,430 あなたはこの意見に? 289 00:11:30,430 --> 00:11:31,200 同意しない? 290 00:11:31,200 --> 00:11:32,366 それは非常にユーザーフレンドリーではありません。 291 00:11:32,366 --> 00:11:33,890 私は何をすべきかをユーザーに告げていない。 292 00:11:33,890 --> 00:11:36,520 >> しかし、今、私の場合も 後で、みましょうしたい 293 00:11:36,520 --> 00:11:40,060 たとえば、これらの事を印刷 そうTODO後でかゆうパックで。 294 00:11:40,060 --> 00:11:42,330 私はそれ以上とするつもりです IS間違いなくこれをthis-- 295 00:11:42,330 --> 00:11:45,970 の正しい実装 名前や家屋、3を取得 296 00:11:45,970 --> 00:11:48,870 ユーザーからの各それらの合計、。 297 00:11:48,870 --> 00:11:51,280 >> しかし、これは右、非常に良いデザインではないでしょうか? 298 00:11:51,280 --> 00:11:55,220 どのような学生だけではなく名前を持っている場合 そして、家だけでなく、ID番号、 299 00:11:55,220 --> 00:11:57,770 電話番号、 電子メールアドレス、 300 00:11:57,770 --> 00:12:00,280 多分、ホームページ、および 多分Twitterのハンドル、 301 00:12:00,280 --> 00:12:03,730 およびその他の詳細、任意の数の 学生や人物に関連した、 302 00:12:03,730 --> 00:12:04,610 より一般的。 303 00:12:04,610 --> 00:12:07,720 どうすれば追加し始める このプログラムへの機能性? 304 00:12:07,720 --> 00:12:14,080 >> まあ、私はかもしれない最も簡単な方法のように感じる 、のような何かをするのは、言わせてすることで、 305 00:12:14,080 --> 00:12:16,490 IDが学生をint型。 306 00:12:16,490 --> 00:12:18,380 だから私はそこにすべてのIDを入れることができます。 307 00:12:18,380 --> 00:12:22,240 そして、何かのために 電話番号のような、 308 00:12:22,240 --> 00:12:24,400 私はどのようにわからないんだけど まだそれを表している。 309 00:12:24,400 --> 00:12:30,280 それでは、先に行くとちょうど呼ぶことにしましょう これは、学生をTwitterのメッセージ 310 00:12:30,280 --> 00:12:33,550 少し奇妙、but--です そしてたくさんのフィールド。 311 00:12:33,550 --> 00:12:36,360 >> 私は効果的に開始しました コピーしてここに貼り付けます。 312 00:12:36,360 --> 00:12:39,416 そして、これはかなり成長しようとしている かなり迅速に扱いにくいですよね? 313 00:12:39,416 --> 00:12:42,290 があった場合、それは素晴らしいと思いません 世界のデータ構造は既知 314 00:12:42,290 --> 00:12:45,600 しないintや文字列ではなく、何かのような これより高いレベル、抽象化、 315 00:12:45,600 --> 00:12:47,570 話すように、学生として知られている? 316 00:12:47,570 --> 00:12:50,220 Cは、内蔵の付属していない 学生のための機能性、 317 00:12:50,220 --> 00:12:52,260 私はそれがそのような与えたいと思った場合はどう? 318 00:12:52,260 --> 00:12:55,640 >> まあ、それは結局のところ、私はするつもりです 、ここstructs.hというファイルを開く 319 00:12:55,640 --> 00:12:57,090 あなたが正確にそれを行うことができます。 320 00:12:57,090 --> 00:12:58,290 そして、私たちは今、これをやって起動するつもりだ。 321 00:12:58,290 --> 00:13:01,490 そして、Pセット三のボンネットの下に、 あなたは既に、今これをやってきました。 322 00:13:01,490 --> 00:13:05,920 グラムRECTなどというものは存在しないか、 プログラミング言語Cのグラムオーバル 323 00:13:05,920 --> 00:13:10,570 >> スタンフォード大学の人たちは、それらを実装し ここでこのアプローチを使用して、データ型、 324 00:13:10,570 --> 00:13:13,900 自分自身の新しいデータを宣言 newキーワードを使用したタイプ 325 00:13:13,900 --> 00:13:16,744 構造体と呼ばれ、他の 1と呼ばれるのtypedef。 326 00:13:16,744 --> 00:13:19,660 そして実際、たとえ構文 スタッフから少し違って見える 327 00:13:19,660 --> 00:13:23,550 私たちは中に、前に見てきた 原理は、それは超簡単です。 328 00:13:23,550 --> 00:13:25,297 >> これは単に、「型を定義する」を意味する。 329 00:13:25,297 --> 00:13:27,255 それはなるだろう 構造、構造 330 00:13:27,255 --> 00:13:29,400 ただコンテナのようなものです 複数のもののために。 331 00:13:29,400 --> 00:13:31,780 そして、その構造が起こっている nameという文字列を持っている、 332 00:13:31,780 --> 00:13:33,210 と文字列が家を呼んだ。 333 00:13:33,210 --> 00:13:37,520 そして、ちょうど便宜上、呼ぶことにしましょう​​、 このデータ構造全体の学生。 334 00:13:37,520 --> 00:13:40,320 >> あなたが取得するので、瞬間 セミコロン、あなたが今持っている 335 00:13:40,320 --> 00:13:43,280 独自のデータを作成した 学生と呼ばれるタイプ 336 00:13:43,280 --> 00:13:46,420 それは今、int型と並んで立っている フロート、およびchar型、文字列、 337 00:13:46,420 --> 00:13:50,270 およびg矩形、およびg楕円形、及び任意の数の 他のものの人が発明した。 338 00:13:50,270 --> 00:13:53,340 >> だから、これに関する有益なものだ 今私は戻っている場合ということです 339 00:13:53,340 --> 00:13:57,430 0をSTRUCT、これを終了します 私が書いた実装、 340 00:13:57,430 --> 00:14:02,080 ここでは、事前に、その全てがわかり 避けられない散らかっの 341 00:14:02,080 --> 00:14:05,490 私が追加されたように起こって出発しようとしていた 電話番号やTwitterのメッセージとすべての 342 00:14:05,490 --> 00:14:07,370 これらの他のものに 学生の定義、 343 00:14:07,370 --> 00:14:11,810 今では簡潔に包まだ 学生のほんの一配列として。 344 00:14:11,810 --> 00:14:15,500 >> そして今、これらの学生のそれぞれ その中の複数のものを持っています。 345 00:14:15,500 --> 00:14:16,930 だから、ただ一つの質問を残します。 346 00:14:16,930 --> 00:14:19,700 どのように名前で入手できますか、 、家、およびID、 347 00:14:19,700 --> 00:14:21,640 とelse何でもあり 学生の内側? 348 00:14:21,640 --> 00:14:22,930 スーパーシンプルなだけでなく、。 349 00:14:22,930 --> 00:14:25,730 新しい構文が、シンプルなアイデア。 350 00:14:25,730 --> 00:14:29,239 >> 配列へのあなたは、単にインデックス、 私たちは先週、これと同じように。 351 00:14:29,239 --> 00:14:31,030 そして、明らかに何 構文の新しい作品? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 ただ、「中に入ることを意味する 構造とフィールドが呼び出される 354 00:14:35,880 --> 00:14:39,030 名前は、家と呼ばれるフィールドを取得 学生というフィールドを取得します。 " 355 00:14:39,030 --> 00:14:41,940 >> だからPセット三に、あなたはなら まだその上で作業し、 356 00:14:41,940 --> 00:14:44,020 そしてほとんどの人はまだ あなたのようなことを実現している 357 00:14:44,020 --> 00:14:46,130 のようなものを使用して起動 グラムrectsおよびg楕円 358 00:14:46,130 --> 00:14:50,201 していないようだし、他のもの 週ゼロ、1つ、または2つから来る、 359 00:14:50,201 --> 00:14:52,950 それはスタンフォードためだと認識 いくつかの新しいデータ型を宣言した。 360 00:14:52,950 --> 00:14:56,160 >> そして実際、それはまさに私たちがよ Pセット4人にだけでなく、実行し、時 361 00:14:56,160 --> 00:14:59,880 私たちは物事に対処し始める イメージ、ビットマップ、および多くのような。 362 00:14:59,880 --> 00:15:02,882 だから、ちょうどティーザーとです 来ては何のためのメンタルモデル。 363 00:15:02,882 --> 00:15:04,590 今、私はprocrastinated ビット今朝。 364 00:15:04,590 --> 00:15:09,560 私は何を見てちょっと気になっていた 実際にマイクロソフトの壁紙 365 00:15:09,560 --> 00:15:10,310 今日のように見えます。 366 00:15:10,310 --> 00:15:15,200 そして、それは2006年に、誰かが判明 実際にはほぼ正確に行ってきました 367 00:15:15,200 --> 00:15:19,210 実際に撮影する同じスポット 何は、これらの日のようになります。 368 00:15:19,210 --> 00:15:21,380 フィールドには、今少し生い茂っている。 369 00:15:21,380 --> 00:15:24,850 >> だから、画像の今言えば、 それでは、ここで祈るを取り戻すましょう 370 00:15:24,850 --> 00:15:26,890 画面とニコラス上、 ちょうどあなたを思い出させる 371 00:15:26,890 --> 00:15:30,540 そのあなたが昼食のために私たちに参加したい場合 今週の金曜日、いつものURLへのヘッド 372 00:15:30,540 --> 00:15:31,440 ここに。 373 00:15:31,440 --> 00:15:33,530 >> だからここで私たちは月曜日にオフにしておいたのですか? 374 00:15:33,530 --> 00:15:35,140 私たちは右、この問題を導入? 375 00:15:35,140 --> 00:15:37,610 これは一見正しかった スワップの実施、 376 00:15:37,610 --> 00:15:40,460 それによってあなたは、2つのintを取る 一方、Bと呼ばれるもの、と呼ばれる 377 00:15:40,460 --> 00:15:44,130 ローラがここでやったよう、それらを交換 牛乳と水とのステージ上で、 378 00:15:44,130 --> 00:15:46,820 一時を使用して、 変数、または空のコップ、 379 00:15:46,820 --> 00:15:50,540 私たちは、と中にBを入れことができるように、 物事の混乱を行うことなく、B。 380 00:15:50,540 --> 00:15:51,560 私たちは、変数を使用していました。 381 00:15:51,560 --> 00:15:52,870 これは、一時と呼ばれています。 382 00:15:52,870 --> 00:15:55,520 >> しかし、根本的には何だった 月曜日のこのコードの問題? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 ここでの問題は何でしたか? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 うん。 387 00:16:00,605 --> 00:16:01,970 >> 聴衆:それはより多くのスペースを占有します。 388 00:16:01,970 --> 00:16:04,719 >> DAVID J.マラン:詳細を占める スペース、私は変数を使用しているので、 389 00:16:04,719 --> 00:16:05,400 それはOKです。 390 00:16:05,400 --> 00:16:07,300 それは本当ですが、私は今 それはOKだと言うつもり。 391 00:16:07,300 --> 00:16:10,030 それは壮大で唯一の32ビットだ 物事のスキーム、そうではない大したこと。 392 00:16:10,030 --> 00:16:10,655 その他の考え? 393 00:16:10,655 --> 00:16:12,572 聴衆:それだけスワップ ローカルでの変数。 394 00:16:12,572 --> 00:16:13,571 DAVID J.マラン:その通りです。 395 00:16:13,571 --> 00:16:15,090 これは、ローカルでのみ変数を入れ替えます。 396 00:16:15,090 --> 00:16:18,173 いつでもあなたはfunction--を呼び出しているため 私はアネンバーグからトレイを持っていたとき 397 00:16:18,173 --> 00:16:19,840 最後の時間、あなたは一番下のメインがあります。 398 00:16:19,840 --> 00:16:23,560 とすぐに呼び出される関数を呼び出すように スワップ、スワップはxとyを取得していません、 399 00:16:23,560 --> 00:16:24,400 元の値。 400 00:16:24,400 --> 00:16:26,392 何をスワップは、取得しない私たちは主張しましたか? 401 00:16:26,392 --> 00:16:27,100 聴衆:コピーします。 402 00:16:27,100 --> 00:16:28,090 DAVID J.マラン:それらのコピーだから。 403 00:16:28,090 --> 00:16:31,120 だから、それはあなたがした場合、1と2を取得 前回からの例を思い出して、 404 00:16:31,120 --> 00:16:34,730 しかし1と2のコピー それは正常に交換されます。 405 00:16:34,730 --> 00:16:38,550 しかし残念ながら最終的には、 これらの値は同じである。 406 00:16:38,550 --> 00:16:41,880 だから私たちは私たちでこれを見ることができます 新しい友人、うまくいけば、GDB、 407 00:16:41,880 --> 00:16:45,180 あなたやのTFおよびCaのは持っていることを 次のように向かってあなたを導くれて。 408 00:16:45,180 --> 00:16:51,210 >> だから何スワップリコールしてみましょうlike--見えない このようになりますthis--開く。 409 00:16:51,210 --> 00:16:54,160 私たちは2つに、1にyとxは初期化。 410 00:16:54,160 --> 00:16:55,620 プリントFのの束を持っていた。 411 00:16:55,620 --> 00:16:58,080 しかし、その後、キーコール ここでは、交換することであった 412 00:16:58,080 --> 00:17:00,260 正確にコードたちである ちょっと前に見た。 413 00:17:00,260 --> 00:17:03,180 最初は正しいものはどれ 一見、しかし、機能的に、 414 00:17:03,180 --> 00:17:06,800 このプログラムはあるため、動作しません それは永久に、xとyを交換しません。 415 00:17:06,800 --> 00:17:10,190 >> だから、迅速な暖かいのは、これを見てみましょう ここでは、GDB、./noswapで最大。 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 その圧倒的な情報の束 私は今のところ、コントロールLのを取り除くでしょう。 418 00:17:15,200 --> 00:17:17,516 そして今、私はするつもりだ 先に行くと、それを実行します。 419 00:17:17,516 --> 00:17:19,349 そして、残念ながら、その その有用ではありませんでした。 420 00:17:19,349 --> 00:17:22,355 これは内部のプログラムを実行した GDBと呼ばれるプログラムは、デバッガ、 421 00:17:22,355 --> 00:17:23,730 それは私の周り突くことはできませんでした。 422 00:17:23,730 --> 00:17:26,229 >> それでは、どのよう私は実際に一時停止することができます このプログラム内部の実行? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 だから破る。 425 00:17:28,329 --> 00:17:32,340 そして、私は、任意の上で破損することがあり 行番号は、1〜10、15。 426 00:17:32,340 --> 00:17:35,530 しかし、私はまた象徴的に破ることができる ブレーク主を言って。 427 00:17:35,530 --> 00:17:38,980 そして、それはブレークを設定するために起こっている ポイント、明らかにメインライン16で。 428 00:17:38,980 --> 00:17:40,050 そして、ここで、16行目である? 429 00:17:40,050 --> 00:17:42,960 のコードにまで行ってみよう そしてNOSWAPに上がる。 430 00:17:42,960 --> 00:17:46,930 そして実際、16行目は、 非常に最初のプログラムである。 431 00:17:46,930 --> 00:17:52,130 >> だから今、私が先に行くとタイプした場合 今回の実行、入力し、それが一時停止しました。 432 00:17:52,130 --> 00:17:53,080 それではつつくましょう。 433 00:17:53,080 --> 00:17:55,716 Xがゼロである理由X--印刷? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 ドル記号を無視します。 436 00:17:57,830 --> 00:17:59,725 それはちょうど手の込んだのためだ プログラムの使用方法。 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 なぜ現時点でのxがゼロですか? 439 00:18:03,140 --> 00:18:03,640 うん。 440 00:18:03,640 --> 00:18:07,061 >> 聴衆:それは右の前に一時停止 16行目ではなく、実際にライン16上の。 441 00:18:07,061 --> 00:18:08,060 DAVID J.マラン:その通りです。 442 00:18:08,060 --> 00:18:11,630 GDBは、デフォルトでは、一時停止しています ちょうど16行目の前に実行。 443 00:18:11,630 --> 00:18:14,820 だからそれは、実行されなかった xはいくつかの未知の価値があることを意味します。 444 00:18:14,820 --> 00:18:17,150 そして、私たちはそれがだと幸運 ゼロのようなきれいなもの。 445 00:18:17,150 --> 00:18:20,310 だから今私は、次の入力した場合、 今では16を実行した。 446 00:18:20,310 --> 00:18:22,000 私は17を実行することが待っている。 447 00:18:22,000 --> 00:18:23,400 私が先に行くと、印刷のxましょう。 448 00:18:23,400 --> 00:18:24,094 それは一つだ。 449 00:18:24,094 --> 00:18:25,260 私が先に行くと、プリントyをしてみましょう。 450 00:18:25,260 --> 00:18:26,176 私は今、何を見るべきか? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> 聴衆:[聞き取れない] 453 00:18:28,560 --> 00:18:29,165 >> DAVID J.マラン:少し大きな声。 454 00:18:29,165 --> 00:18:30,040 >> 聴衆:[聞き取れない] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 DAVID J.マラン:ない非常に合意。 457 00:18:32,120 --> 00:18:34,760 そうです、私たちはいくつかのごみ値を参照してください。 458 00:18:34,760 --> 00:18:37,862 さて、yがあり134514064です。 459 00:18:37,862 --> 00:18:39,320 まあ、それはいくつかのガベージ値です。 460 00:18:39,320 --> 00:18:41,350 私のプログラムは、RAMを使用しています 異なる目的のために。 461 00:18:41,350 --> 00:18:42,350 他の機能があります。 462 00:18:42,350 --> 00:18:44,040 他の人が自分のコンピュータの中に書いている。 463 00:18:44,040 --> 00:18:46,789 そのように、これらのビットは使用されてきた 他の値は、私は何を見ている 464 00:18:46,789 --> 00:18:49,470 いくつかの残党である そのメモリの先使用。 465 00:18:49,470 --> 00:18:53,350 >> だから大したことない、とすぐに理由 私は次の、その後の印刷yを入力すると、 466 00:18:53,350 --> 00:18:55,640 それはに初期化だ 私が欲しいの値。 467 00:18:55,640 --> 00:18:57,400 だから今、のは少し速く先に行きましょう。 468 00:18:57,400 --> 00:18:58,540 次のためのN。 469 00:18:58,540 --> 00:18:59,570 それでは、もう一度それをやってみましょう。 470 00:18:59,570 --> 00:19:00,530 それでは、もう一度それをやってみましょう。 471 00:19:00,530 --> 00:19:02,404 しかし、私はヒットする必要はありません ここで、私の場合のため 472 00:19:02,404 --> 00:19:05,110 内側に何が起こっているのか見てみたい スワップにより、コマンドは何ですか? 473 00:19:05,110 --> 00:19:05,520 >> 聴衆:ステップ。 474 00:19:05,520 --> 00:19:06,436 >> DAVID J.マラン:ステップ。 475 00:19:06,436 --> 00:19:09,800 だから、これはに私を、手順 むしろそれ以上のより機能、。 476 00:19:09,800 --> 00:19:12,270 そして今、それは少し不可解だ 正直、これはただである 477 00:19:12,270 --> 00:19:14,581 私は今、33行の中にいる私に言って。 478 00:19:14,581 --> 00:19:15,580 そしてさんは再びこれをやらせる。 479 00:19:15,580 --> 00:19:16,080 印刷の一時。 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 ごみ値、負の今回は、 それは単に、まだガベージ値です。 482 00:19:20,170 --> 00:19:22,810 それでは、次に、印刷の一時をやらせる。 483 00:19:22,810 --> 00:19:27,130 これは、1に初期だする 別名、xの値であった。 484 00:19:27,130 --> 00:19:29,110 >> さて、ここで私たちのaがあり、から来るX? 485 00:19:29,110 --> 00:19:32,510 さて、私たちは、主に気付く xとyこれらの値を求めた。 486 00:19:32,510 --> 00:19:34,740 それから、次のようにスワップするためにそれらを渡す。 487 00:19:34,740 --> 00:19:37,010 Xはコンマyと、最初に来た。 488 00:19:37,010 --> 00:19:40,020 そして、スワップはxとy、それらを呼び出すことができます。 489 00:19:40,020 --> 00:19:42,630 しかし、明確にするために、それがだ aとb、それらを呼び出す。 490 00:19:42,630 --> 00:19:45,970 しかし、aとbは今であることを行っている xとyのコピーであった。 491 00:19:45,970 --> 00:19:50,660 >> だから私は戻って、GDB、一時に行けば 今一つであり、今や一つです。 492 00:19:50,660 --> 00:19:56,130 私は今、次に何をしている場合でも、印刷を行う 、aは既に上に移動されました。 493 00:19:56,130 --> 00:20:00,030 ミルクは前者に注がれた オレンジジュースのガラス、またはその逆。 494 00:20:00,030 --> 00:20:04,750 >> そして私は今、次の再び行う場合、および 私は健全性チェックのようにして印刷する場合、 495 00:20:04,750 --> 00:20:07,687 まだ2ですが、bは、今一つです。 496 00:20:07,687 --> 00:20:08,770 率直に言って、それはまだあります。 497 00:20:08,770 --> 00:20:10,670 私は一時が何であるかを気にしない。 498 00:20:10,670 --> 00:20:16,850 しかし、すぐに私は今、入力中に、のは言わせて、 今私は最後に来ている、戻って続ける 499 00:20:16,850 --> 00:20:17,480 プログラム。 500 00:20:17,480 --> 00:20:20,730 そして残念ながら、xは まだ1つであり、yはまだ2である。 501 00:20:20,730 --> 00:20:22,272 >> だから、GDBの有用性は何でしたか? 502 00:20:22,272 --> 00:20:23,980 それは私が解決し助けていない 問題自体は、 503 00:20:23,980 --> 00:20:26,265 それがうまくいけば私を助けて 実現することでそれを理解する 504 00:20:26,265 --> 00:20:30,000 はい、私の論理が正しいことが、 私のコードは、最終的には持っていないされている 505 00:20:30,000 --> 00:20:31,450 恒久的な影響。 506 00:20:31,450 --> 00:20:34,570 だから、私たちがしている問題だ 今今日解くつもり。 507 00:20:34,570 --> 00:20:37,870 >> しかし、ここで、この例によりそこに取得しましょう​​。 508 00:20:37,870 --> 00:20:39,230 文字列は嘘です。 509 00:20:39,230 --> 00:20:41,860 また、あまりにも、しないデータ型 それは、C。それの中に存在する 510 00:20:41,860 --> 00:20:44,750 いくつかの同義語であっ 何か他のもののための時間、 511 00:20:44,750 --> 00:20:47,300 次のように、私たちはそれを明らかにすることができます。 512 00:20:47,300 --> 00:20:53,282 >> 私が先に行くと開いてみましょう 比較-0と呼ばれるプログラム。 513 00:20:53,282 --> 00:20:56,240 そして、この1つを入力するのではなく、 私たちは、コードをウォークスルーすることから始めましょう 514 00:20:56,240 --> 00:20:58,040 私はすでに書いたが、 それはわずか数行です。 515 00:20:58,040 --> 00:20:59,570 だから、これは、コンペア0である。 516 00:20:59,570 --> 00:21:02,380 そして、私はやっている最初の事 テキストの行を得ている。 517 00:21:02,380 --> 00:21:05,610 >> しかし、私は何に気づく 初めてやって。 518 00:21:05,610 --> 00:21:07,910 何が21行程度明らかに違うのですか? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 実際には、ちょっと待って。 521 00:21:11,402 --> 00:21:12,110 これはコピー2です。 522 00:21:12,110 --> 00:21:13,568 それはあっても、右プログラムではありません。 523 00:21:13,568 --> 00:21:14,780 すべての権利、スポイラー警告。 524 00:21:14,780 --> 00:21:16,890 すべての権利なので、それを気にしない。 525 00:21:16,890 --> 00:21:18,520 つまり、将来の質問への答えです。 526 00:21:18,520 --> 00:21:21,450 >> ここでは、コンペア0であり、私はよ テキストの行を取得しようとして。 527 00:21:21,450 --> 00:21:22,435 はるかに簡単なプログラムの。 528 00:21:22,435 --> 00:21:23,560 だから、これは簡単です。 529 00:21:23,560 --> 00:21:28,070 これは1週、2週のもののようです 現時点では。文字列s =のGetString。 530 00:21:28,070 --> 00:21:29,700 今、私はダウンして、ここでもそれを言う。 531 00:21:29,700 --> 00:21:31,830 文字列T =のGetString。 532 00:21:31,830 --> 00:21:35,300 この中でそして、最後の事 プログラムは、その名の通り、 533 00:21:35,300 --> 00:21:37,090 私はそれらを比較しようとするつもりされている。 534 00:21:37,090 --> 00:21:40,709 >> だからsの場合、最初の文字列、 = tの場合、私はに等しい 535 00:21:40,709 --> 00:21:42,250 あなたが同じことを入力すると言うつもり。 536 00:21:42,250 --> 00:21:44,291 そうでなければ、私は言うつもりです あなたが異なるものを入力します。 537 00:21:44,291 --> 00:21:45,880 それでは、このプログラムをコンパイルして実行してみましょう。 538 00:21:45,880 --> 00:21:48,481 だからゼロを比較してください。 539 00:21:48,481 --> 00:21:48,980 よさそうだ。 540 00:21:48,980 --> 00:21:50,490 コンパイルエラーはありません。 541 00:21:50,490 --> 00:21:52,386 >> 私は、今先に行こう と./compare-0を入力します。 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 私が先に行くと何かを言ってみましょう :祈る何か:ロブ。 544 00:21:59,220 --> 00:22:00,450 そして、私は別のものを入力します。 545 00:22:00,450 --> 00:22:01,250 これまでのところ、とても良い。 546 00:22:01,250 --> 00:22:02,680 プログラムは、正しいと思われる。 547 00:22:02,680 --> 00:22:03,880 >> しかし、ここで再びそれを実行してみましょう。 548 00:22:03,880 --> 00:22:05,800 ゲイブ:何かを言う。 549 00:22:05,800 --> 00:22:07,140 ゲイブ:何かを言う。 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 かしこまりました。 552 00:22:09,020 --> 00:22:10,851 たぶん私は、スペースバーをヒット またはファンキー何か。 553 00:22:10,851 --> 00:22:11,600 それでは、もう一度それをやってみましょう。 554 00:22:11,600 --> 00:22:13,020 Zamylaそう。 555 00:22:13,020 --> 00:22:13,970 556 00:22:13,970 --> 00:22:14,470 Zamyla。 557 00:22:14,470 --> 00:22:15,740 558 00:22:15,740 --> 00:22:17,330 別物。 559 00:22:17,330 --> 00:22:19,430 だから何が起こっている? 560 00:22:19,430 --> 00:22:23,200 >> だから私たちは、次の2行を持っている コー​​ドのGetString二回呼び出されている。 561 00:22:23,200 --> 00:22:25,760 そして、私は単純によ sとtを比較しようとしている。 562 00:22:25,760 --> 00:22:28,370 しかし、本当にそれから、何が起こっているの? 563 00:22:28,370 --> 00:22:31,180 さて、私の手書きの約 ややこの例を肉屋。 564 00:22:31,180 --> 00:22:34,630 そして、それでは実際に投げてみましょう このアップこっちだけでなく、。 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> だから私たちは次のような行を持っている 文字列s =のGetString。 567 00:22:45,712 --> 00:22:48,295 だから、単純に最初の そのプログラムからの興味深いライン。 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 しかし、このすべての時間がされているもの ボンネットの下に起こっている? 570 00:22:52,974 --> 00:22:55,890 さて、左側に文字列である、 その変数のいくつかのタイプであり、 571 00:22:55,890 --> 00:22:56,785 そしてそれは、Sと呼ばれています。 572 00:22:56,785 --> 00:23:00,019 だから私は、これは、メモリを使用していることを知って、 またはRAM、何とか自分のコンピュータにある。 573 00:23:00,019 --> 00:23:02,060 だから私は、抽象的に行くよ 正方形としてそれを描画します。 574 00:23:02,060 --> 00:23:04,820 32ビット、結局のところ、しかし 将来的にはその詳細。 575 00:23:04,820 --> 00:23:06,410 そして、何がこっちが起こっているの? 576 00:23:06,410 --> 00:23:08,700 >> まあ、当然のgetString ユーザーから文字列を取得します。 577 00:23:08,700 --> 00:23:11,360 とのGetString GOT Zamylaまたはゲイブまたは祈る。 578 00:23:11,360 --> 00:23:14,640 それでは、最初に選択させる それらの、祈るあった。 579 00:23:14,640 --> 00:23:19,174 だから効果的に、のGetStringが得たもの 私は、その最初のケースでは、D--V-E-nのだった。 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 そして、他に何していた それは私を密かに与えるか? 582 00:23:25,045 --> 00:23:25,920 聴衆:[聞き取れない] 583 00:23:25,920 --> 00:23:28,720 DAVID J.マラン:ええ、 / 0またはnull文字。 584 00:23:28,720 --> 00:23:30,550 だから、効果的に私に文字列を与えた。 585 00:23:30,550 --> 00:23:34,550 しかし、私たちはすでに前から知っている 文字列は単なる配列であることになります 586 00:23:34,550 --> 00:23:37,895 文字の、そしてそれはによって終了だ この特別なセンチネル文字、/ 0。 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> しかし、これが真の場合 これは正方形である、 589 00:23:42,310 --> 00:23:44,160 これは明らかにはるかに大きい長方形である。 590 00:23:44,160 --> 00:23:46,830 実際、これは、 私は、32ビットのみを主張。 591 00:23:46,830 --> 00:23:49,500 そして、これは明らかに32以上である ビット、これはおそらくですので 592 00:23:49,500 --> 00:23:51,583 8プラス8プラス8 プラス8プラス8、 593 00:23:51,583 --> 00:23:53,320 という理由だけで、ASCIIのバイト。 594 00:23:53,320 --> 00:23:57,030 どのように一体私たちは収まるようにしようとしている ここで、この小さな箱に祈る? 595 00:23:57,030 --> 00:23:59,880 >> さて、のGetStringは実際に何をしているのですか? 596 00:23:59,880 --> 00:24:03,680 さて、ここで、このグリッドは表し 私のコンピュータのメモリやRAM。 597 00:24:03,680 --> 00:24:07,564 それでは、任意の場合としましょう これらのそれぞれは、バイトを表し、 598 00:24:07,564 --> 00:24:09,730 その後、私たちは、それぞれの考えることができます バイトアドレスを有するように、 599 00:24:09,730 --> 00:24:13,830 33オックスフォードストリート、または34のような オックスフォード·ストリート、または35オックスフォードストリート。 600 00:24:13,830 --> 00:24:16,700 >> だから、家はアドレスを持っていると同じように そして建物はアドレスを持っている、 601 00:24:16,700 --> 00:24:19,810 程度の個別のバイトを行う メモリは、アドレスまたは番号を持つ 602 00:24:19,810 --> 00:24:21,042 その一意に識別します。 603 00:24:21,042 --> 00:24:22,000 さて、これは任意である。 604 00:24:22,000 --> 00:24:25,370 しかし、私はするつもりだ、それをシンプルに保つために ただ慣例により進を使用し、 605 00:24:25,370 --> 00:24:28,200 しかし0xのは、他の何を意味する "これは16進数です。」より 606 00:24:28,200 --> 00:24:31,030 そして私はあることを主張するつもりだ 「D」は、メモリ内のバイトの一つで終わる。 607 00:24:31,030 --> 00:24:34,210 >> 私は、他には何もで起こってしまったん メモリなので、祈る、最初のスポットを得た 608 00:24:34,210 --> 00:24:35,509 バイトひとつで。 609 00:24:35,509 --> 00:24:36,800 これは、その後、0x2ということになるだろう。 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 これは0x3に起こっている。 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 これは0x4になるだろう。 614 00:24:41,800 --> 00:24:43,025 これは0x5のに起こっている。 615 00:24:43,025 --> 00:24:44,025 これは0x6になるだろう。 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> しかし、一度考え始める どのコンピュータのことについて 618 00:24:48,290 --> 00:24:50,710 ボンネットの下に、 あなたが推測することを開始することができます 619 00:24:50,710 --> 00:24:54,960 どのように、何年か前に、だろう C自体を実施しています。 620 00:24:54,960 --> 00:24:58,360 おそらくのGetStringとは何ですか それのでreturning-- 621 00:24:58,360 --> 00:25:00,946 そうでないように感じている 帰国祈る、それ自体が、 622 00:25:00,946 --> 00:25:03,320 彼は確かに行くのではないので、 この小さなbox--に合わせて 623 00:25:03,320 --> 00:25:05,090 だから何がのGetStringはおそらく戻っている? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> 聴衆:[聞き取れない] 626 00:25:08,920 --> 00:25:10,540 >> DAVID J.マラン:祈るの場所。 627 00:25:10,540 --> 00:25:12,770 そして、それはこれをやっています これまでに1週以来。 628 00:25:12,770 --> 00:25:16,150 何のGetStringが実際に 帰国は、それ自体、文字列ではありません。 629 00:25:16,150 --> 00:25:17,780 つまり、小さな白い嘘の一つだ。 630 00:25:17,780 --> 00:25:22,520 それは、のアドレスを返すだ メモリ内の文字列、一意のアドレス。 631 00:25:22,520 --> 00:25:24,820 祈る33オックスフォードストリートに住んでいます。 632 00:25:24,820 --> 00:25:29,310 しかし、より簡潔に、ギャビンは住んでいる 0x1ので、ナンバーワン住所。 633 00:25:29,310 --> 00:25:32,280 >> だから、これで何を入れれます その後小箱、明確にするために、 634 00:25:32,280 --> 00:25:35,930 その文字列のアドレスだけです。 635 00:25:35,930 --> 00:25:38,110 だから、すべてのこの時間、この 続いている。 636 00:25:38,110 --> 00:25:41,650 しかし、これは何を示唆 今、すべてのsあれば持っているということです 637 00:25:41,650 --> 00:25:44,710 それの内部の数であり、 あなたを停止するには、プログラマは、 638 00:25:44,710 --> 00:25:47,970 内の任意の数値を入れてから 任意の変数だけジャンプ 639 00:25:47,970 --> 00:25:49,080 メモリのチャンクに? 640 00:25:49,080 --> 00:25:51,320 そして実際、私たちは表示されます それは、脅威、次回です。 641 00:25:51,320 --> 00:25:53,500 >> しかし、今のところ、これでは不十分と感じている。 642 00:25:53,500 --> 00:25:55,630 私が言う場合は、私を取得 文字列には、あなたは私に祈るを与える。 643 00:25:55,630 --> 00:25:57,230 しかし、あなたは本当に私に祈るを与えていない。 644 00:25:57,230 --> 00:25:59,310 あなたは私を与えるすべてが祈るのアドレスです。 645 00:25:59,310 --> 00:26:04,310 私はその後、確かに知ってはどうすればよい どこに祈るが開始され、ends-- 646 00:26:04,310 --> 00:26:07,140 物語のはweird--取得 祈るが始まり、終わるところ、 647 00:26:07,140 --> 00:26:10,435 してから、次の メモリ内の文字列が始まる? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> さて、あなたは手渡ししている場合 私祈るの初め、 650 00:26:13,620 --> 00:26:17,230 基本的に、どのように私は知っていますか 彼の名前の最後には、どこにあるのか。 651 00:26:17,230 --> 00:26:20,550 その特別なヌル文字、その 今、すべてがより重要である 652 00:26:20,550 --> 00:26:23,040 下に文字列の場合 フードは簡単に特定されている 653 00:26:23,040 --> 00:26:25,820 一意にメモリ内の位置による。 654 00:26:25,820 --> 00:26:28,130 だから、すべてのこの時間は、それはだ 何が起こっているされています。 655 00:26:28,130 --> 00:26:32,470 >> だから私たちは今を見てみると ここでは、コード、説明 656 00:26:32,470 --> 00:26:35,790 あなたがライン26のバグもし。 657 00:26:35,790 --> 00:26:39,560 なぜZamylaとZamylaは違うのですか? 658 00:26:39,560 --> 00:26:41,330 なぜゲイブとゲイブは違うのですか? 659 00:26:41,330 --> 00:26:42,154 ええ、後ろに。 660 00:26:42,154 --> 00:26:43,390 >> 聴衆:彼らは異なるアドレスを持っている。 661 00:26:43,390 --> 00:26:45,931 >> DAVID J.マラン:というだけの理由 彼らは異なるアドレスを持っている。 662 00:26:45,931 --> 00:26:48,820 あなたがのGetStringを呼び出すときのため 再び、私はここですぐにやるおり、 663 00:26:48,820 --> 00:26:52,870 これは二行目の場合は、文字列 T、私はそのプログラムで行ったように、 664 00:26:52,870 --> 00:26:55,030 のGetStringへの別の呼び出しに相当します。 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 私が呼ぶ次回 のGetString、私は行くよ 667 00:26:58,670 --> 00:27:00,190 メモリの異なるチャンクを取得します。 668 00:27:00,190 --> 00:27:02,220 >> のGetStringが許可されている 運転を依頼する 669 00:27:02,220 --> 00:27:03,800 より多くのメモリのためのシステム。 670 00:27:03,800 --> 00:27:07,894 それは同じを再利用するつもりはない 6バイト毎回。 671 00:27:07,894 --> 00:27:09,810 これは、新しいを得るために起こっている メモリの塊、どの 672 00:27:09,810 --> 00:27:12,780 tは取得するつもりされることを意味 こちらにある他の値。 673 00:27:12,780 --> 00:27:15,380 >> 私が行うときにsが=に等しい Tは、比較していない 674 00:27:15,380 --> 00:27:17,880 これと対に対して、D これとこれに対するV。 675 00:27:17,880 --> 00:27:19,588 あなたはこれを比較している このに対して、どの 676 00:27:19,588 --> 00:27:24,020 率直に言ってかなりuseful-- useless--です 本当にために誰が、非常に無駄です 677 00:27:24,020 --> 00:27:25,830 文字列がメモリのどこにいるか気に? 678 00:27:25,830 --> 00:27:26,850 >> そして実際、私たちはそうではありません。 679 00:27:26,850 --> 00:27:28,980 そして、私たちはするつもりはない 特に思いやりを開始。 680 00:27:28,980 --> 00:27:34,180 のみバグが発生する可能性が程度に セキュリティの脅威は、意志を発生する可能性が 681 00:27:34,180 --> 00:27:36,100 私たちは実際に、この気にし始める。 682 00:27:36,100 --> 00:27:37,230 それでは、この問題を解決しましょう​​。 683 00:27:37,230 --> 00:27:39,650 判明は、スーパー、単純にそれを修正する。 684 00:27:39,650 --> 00:27:42,600 >> そして、私の前に、実際にしてみましょう 何だろう、再びそれを明らかにする 685 00:27:42,600 --> 00:27:47,170 CS50クラスの場合は、何 あなたが実装する必要がありました 686 00:27:47,170 --> 00:27:48,600 二つの文字列との比較。 687 00:27:48,600 --> 00:27:51,440 あなたは明らかにちょうどsが= tを等しい使用することはできません。 688 00:27:51,440 --> 00:27:54,090 しかし、単に論理的に、どのように あなたはこの文字列を比較するだろう 689 00:27:54,090 --> 00:27:56,370 Cコードを使用してこの文字列に対して? 690 00:27:56,370 --> 00:27:56,880 うん。 691 00:27:56,880 --> 00:27:58,780 >> 聴衆:ちょうどください forループ[聞き取れない] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 DAVID J.マラン:パーフェクト。 694 00:28:01,670 --> 00:28:02,900 聴衆:[聞き取れない] 695 00:28:02,900 --> 00:28:03,310 DAVID J.マラン:うん。 696 00:28:03,310 --> 00:28:05,390 ただループまたはAで使用 ループまたは何ながら。 697 00:28:05,390 --> 00:28:08,710 しかし、単に基本的な考え方を適用した場合、その これは、メモリまたは配列の塊です 698 00:28:08,710 --> 00:28:11,590 これは、反復処理されている 同時に両方。 699 00:28:11,590 --> 00:28:12,960 そして、ちょうど文字を比較します。 700 00:28:12,960 --> 00:28:14,260 >> そして、あなたはなるようになってきました 少し慎重に、あなたのため 701 00:28:14,260 --> 00:28:16,247 指一本を望んでいない 他を過ぎて行くために 702 00:28:16,247 --> 00:28:18,080 1文字列であるため、 他よりも長い。 703 00:28:18,080 --> 00:28:21,380 だからかどうかを確認するつもりだ 最後にこの特殊な値は、null。 704 00:28:21,380 --> 00:28:24,017 しかし、それは本当にであり、 終わり、そのような単純な。 705 00:28:24,017 --> 00:28:26,100 そして、率直に言って、私たちは必要ありません その車輪を再発明します。 706 00:28:26,100 --> 00:28:27,960 ここで二つのバージョンである。 707 00:28:27,960 --> 00:28:32,910 そして、何私がここで言うつもりは、ということです 代わり= tと等しい秒を比較する、 708 00:28:32,910 --> 00:28:38,964 文字列場合、私が代わりに、と言うつもりです 複数のカンマtの比較は= 0に等しい。 709 00:28:38,964 --> 00:28:40,130 さて、文字列は何を比較するのですか? 710 00:28:40,130 --> 00:28:43,046 >> それは、その関数ですが、結局のところ その目的は生活の中で、C、付属しています 711 00:28:43,046 --> 00:28:44,650 二つの文字列を比較することである。 712 00:28:44,650 --> 00:28:48,300 そして、私たちがそのを読めば、比較かき混ぜる manページまたはマニュアルCS50 713 00:28:48,300 --> 00:28:50,630 参照、それは意志 単にあなたにその話題を伝える 714 00:28:50,630 --> 00:28:55,730 負のいずれかに戻りを比較 番号または正の数またはゼロ、 715 00:28:55,730 --> 00:28:57,660 ゼロは、彼らが同じだ意味する。 716 00:28:57,660 --> 00:28:58,570 >> だから推測。 717 00:28:58,570 --> 00:29:00,390 それは何を意味するかもしれない場合は、 比較リターンをかき混ぜる 718 00:29:00,390 --> 00:29:02,110 負の値または正の値? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 聴衆:より大きいまたは小さい。 721 00:29:04,285 --> 00:29:05,570 DAVID J.マラン:ええ、 より大きいかより小さい。 722 00:29:05,570 --> 00:29:08,640 だから、全体をソートしたい場合 dictionary--内の文字列の束 723 00:29:08,640 --> 00:29:12,975 私たちは最終的にroad--ダウンするように 潜在的に使用するのに最適な機能、 724 00:29:12,975 --> 00:29:15,850 それはそれを行うために起こっているので、 あなたのための文字列の比較、伝える 725 00:29:15,850 --> 00:29:20,060 ときに、bの前に来るか、いない Bアルファベット順に前に来る。 726 00:29:20,060 --> 00:29:21,490 私たちは、正確にそれを行うことができます。 727 00:29:21,490 --> 00:29:23,620 >> そして、私は他のものをやった予告 この例の事。 728 00:29:23,620 --> 00:29:26,870 他に何が高く変更されました この主な機能は最大? 729 00:29:26,870 --> 00:29:28,500 730 00:29:28,500 --> 00:29:29,350 シャア*。 731 00:29:29,350 --> 00:29:31,150 そして、これは、他の白い嘘です。 732 00:29:31,150 --> 00:29:33,750 あなたがたすべてのこの時間は、 文字列を書いて、 733 00:29:33,750 --> 00:29:38,350 私たちは密かに書き換えてきた charとして文字列*実際になるように打ち鳴らす 734 00:29:38,350 --> 00:29:39,270 あなたが理解しています。 735 00:29:39,270 --> 00:29:42,450 >> 言い換えれば、CS50.h中 私たちは、最終的に表示されますように、 736 00:29:42,450 --> 00:29:45,950 私たちは同義語と呼ばれる文字列を作った それは、char *と同じことだ。 737 00:29:45,950 --> 00:29:49,910 そして今のところ、唯一のことを知っている *この文脈において、少なくとも、 738 00:29:49,910 --> 00:29:51,286 アドレスを意味します。 739 00:29:51,286 --> 00:29:52,210 >> 何のアドレス? 740 00:29:52,210 --> 00:29:56,390 まあ、実際には私が言ったことを char *をではなく、* int型やフロート*、 741 00:29:56,390 --> 00:30:00,820 のchar *であることを意味 char型のアドレス。 742 00:30:00,820 --> 00:30:06,770 だからここにこの小さなボックス、別名 文字列、実際にchar *型のものであり、 743 00:30:06,770 --> 00:30:10,490 これというのが単に空想の方法です、 このボックスにアドレスを移動します。 744 00:30:10,490 --> 00:30:12,430 そして、何そのアドレスは参照してくださいでしょうか? 745 00:30:12,430 --> 00:30:13,780 どうやら、チャー。 746 00:30:13,780 --> 00:30:16,410 >> しかし、私たちは絶対にできた int型*や他のものを持っている。 747 00:30:16,410 --> 00:30:20,790 しかし、今のところ、char *を、本当にほとんどです 簡単で、目的の1。 748 00:30:20,790 --> 00:30:23,310 したがって、この問題が起こっている しかし、再び、上昇する。 749 00:30:23,310 --> 00:30:24,830 >> 私はこのプログラムを開くとします。 750 00:30:24,830 --> 00:30:27,670 今私たちが予測できるかどうかを見てみましょう 何がこのコードが間違っている。 751 00:30:27,670 --> 00:30:31,140 このプログラムの中のSO、コピー-0を、私は 先に行くと、再び呼ぶことにし 752 00:30:31,140 --> 00:30:34,190 のgetStringとsの値を格納します。 753 00:30:34,190 --> 00:30:38,800 >> そして、なぜ私はこれをやっている、 わずか数週間の過去からのリマインダーとして? 754 00:30:38,800 --> 00:30:40,960 私たちは、のGetString言った 時にはnullを返します。 755 00:30:40,960 --> 00:30:42,793 それは何を意味しているのかどう のGetStringはnullを返します? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 何かが間違っていた。 758 00:30:46,034 --> 00:30:48,950 それはおそらく、文字列があまりにもあることを意味し 大きな、メモリのコンピュータのうち。 759 00:30:48,950 --> 00:30:51,724 それは、超超超起こる めったにありませんが、それが起こる可能性があります。 760 00:30:51,724 --> 00:30:53,890 私たちはそれを確認したい、 そしてそれは、私たちがやっているすべてです。 761 00:30:53,890 --> 00:30:57,910 >> そうしない場合は、私たちは、今表示されますので、 もののために習慣的にチェックを開始 762 00:30:57,910 --> 00:31:00,870 ヌルと同様に、かもしれない 実際に行くことを始める 763 00:31:00,870 --> 00:31:03,106 無効であるメモリ内のアドレスへ。 764 00:31:03,106 --> 00:31:05,980 そして、あなたは誘導を開始するつもりだ より多くのセグメンテーションフォールト。 765 00:31:05,980 --> 00:31:08,360 またはMacまたはPCでの、ちょうど ハングにコンピュータを、 766 00:31:08,360 --> 00:31:10,340 または潜在的に、フリーズするプログラム。 767 00:31:10,340 --> 00:31:14,930 >> だから今、私がいることを、コピー0.cで主張 例によってこれらの文字列をコピーするつもりです 768 00:31:14,930 --> 00:31:15,685 ライン28の。 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 そして、私は行くよ 下部に請求 771 00:31:18,750 --> 00:31:21,430 ここで私は行くよという それらのいずれかを変更します。 772 00:31:21,430 --> 00:31:22,330 >> だから、これに注目してください。 773 00:31:22,330 --> 00:31:24,370 私は私たちの古い友人はstrlenを呼んでいる。 774 00:31:24,370 --> 00:31:28,960 そして、ちょうど英語で説明して このライン34は何をしているのですか? 775 00:31:28,960 --> 00:31:32,480 Tブラケット0何をする 左側に表す。 776 00:31:32,480 --> 00:31:32,980 うん。 777 00:31:32,980 --> 00:31:34,339 >> 聴衆:Tの最初の文字? 778 00:31:34,339 --> 00:31:35,880 DAVID J.マラン:トンの最初の文字。 779 00:31:35,880 --> 00:31:36,379 それだけです。 780 00:31:36,379 --> 00:31:40,024 トンの最初の文字、私が欲しい 大文字のバージョンを割り当て 781 00:31:40,024 --> 00:31:41,190 トンの最初の文字の。 782 00:31:41,190 --> 00:31:43,200 だから、これは活用している 最初の文字。 783 00:31:43,200 --> 00:31:46,340 私はその後、非常に最後の事 このプログラムでは、私はここの主張されている 784 00:31:46,340 --> 00:31:50,340 オリジナルの、ここでコピーで、トン。 785 00:31:50,340 --> 00:31:54,610 >> しかし、物語に基づいて、私たちだけで 、文字列が実際にあるかについて語った 786 00:31:54,610 --> 00:31:57,520 本当に28行ものです やって、何で 787 00:31:57,520 --> 00:31:59,405 行く生じたバグ 画面上にするには? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> したがって、最初の、最初の質問、28。 790 00:32:03,500 --> 00:32:09,040 文字列t = sは本当に何をしているのですか? 791 00:32:09,040 --> 00:32:16,430 私たちは左手で持っている場合 こちら側文字列t = Sで; 792 00:32:16,430 --> 00:32:19,400 それは私に1箱を与え こことここ1箱。 793 00:32:19,400 --> 00:32:25,530 そして、このアドレスは0xのだとし それでは任意に、50今回は言わせて。 794 00:32:25,530 --> 00:32:28,847 どういう文字列T = S ボンネットの下にいますか? 795 00:32:28,847 --> 00:32:30,340 >> 聴衆:[聞き取れない] 796 00:32:30,340 --> 00:32:34,100 >> DAVID J.マラン:これは、メモリを格納する そこに対処するため、0x50をがそこに行く。 797 00:32:34,100 --> 00:32:37,980 今のであれば、私は最初に行く Tの文字と、それを大文字に、 798 00:32:37,980 --> 00:32:39,535 私は効果的にsに何をしているのですか? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 私は本当に正しい、同じことをやっている? 801 00:32:43,450 --> 00:32:47,680 住所0x50--ちょうど、私の場合ので、 ここで、ボード上の多くの部屋を持っていない、 802 00:32:47,680 --> 00:32:51,750 しかし、これはここでダウンして0x50をされていることを前提としてい 私のコンピュータのメモリのどこか。 803 00:32:51,750 --> 00:32:55,825 >> そして、私は、例えば、ゲイブを持っている このように、ここでは小文字で。 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 そして、私は言っているtのブラケット 0は大文字れます。 806 00:33:01,980 --> 00:33:04,860 さて、Tブラケット0です tの最初の文字。 807 00:33:04,860 --> 00:33:07,840 だから、少しgがしようとしている 大きなG.しかし、問題となって 808 00:33:07,840 --> 00:33:09,410 sはまたを指していない、何でしょうか? 809 00:33:09,410 --> 00:33:10,300 >> 聴衆:同じ。 810 00:33:10,300 --> 00:33:11,841 >> DAVID J.マラン:まったく同じだ。 811 00:33:11,841 --> 00:33:16,342 だから、おそらく簡単に説明、 構文は少し変な場合であっても。 812 00:33:16,342 --> 00:33:17,050 それでは、これを実行しましょう​​。 813 00:33:17,050 --> 00:33:20,210 コピー-0を作成し、次に./copy-0。 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 ゲイブ:何かを言う。 816 00:33:24,110 --> 00:33:26,760 の、残念ながら、両方の 彼らは現在、資産計上されているが、 817 00:33:26,760 --> 00:33:29,500 しかし、そのための基礎となる 私たちは単純にしている理由 818 00:33:29,500 --> 00:33:32,350 今のアドレスを扱う。 819 00:33:32,350 --> 00:33:36,470 >> では、どのようにし始めるか address--しゃれintended-- 820 00:33:36,470 --> 00:33:39,270 どのように私たちはアドレスに始めるか この特定の問題? 821 00:33:39,270 --> 00:33:44,400 さて、copy1.cで、物事が起こっている もう少し複雑になります。 822 00:33:44,400 --> 00:33:49,310 しかし、私は主張だろう 概念的には簡単な解決策。 823 00:33:49,310 --> 00:33:50,852 >> 一目見ただけで手に一生懸命。 824 00:33:50,852 --> 00:33:53,560 第一のために簡単にするつもりはない あなたはおそらく、それを入力し、時間、 825 00:33:53,560 --> 00:33:57,440 しかし、問題があることである場合 単純にトン= Sをやって 826 00:33:57,440 --> 00:33:59,694 コピーしたアドレスが、何を、 再び私はあなたに選ぶことができれば、 827 00:33:59,694 --> 00:34:02,110 解決策になるだろう 実際には文字列をコピーする? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> 聴衆:私たちは、おそらくよ 再びループを使用しています。 830 00:34:06,770 --> 00:34:06,890 >> DAVID J.マラン:うん。 831 00:34:06,890 --> 00:34:08,390 だから私たちは再びループが必要になるだろう。 832 00:34:08,390 --> 00:34:11,800 そして、私たちがコピーする場合は理由 別の文字列に文字列s、 833 00:34:11,800 --> 00:34:14,120 私たちは、おそらくそれをやってみたい 文字単位。 834 00:34:14,120 --> 00:34:17,199 しかし、問題は、以下の場合に、ある これは、もともとsである 835 00:34:17,199 --> 00:34:22,159 今、私たちは、明示的に起動する必要があります tのためにメモリを割り当てる。 836 00:34:22,159 --> 00:34:24,320 >> 言い換えれば、してみましょう この最後にもう一度再描画します。 837 00:34:24,320 --> 00:34:28,659 これは、文字列s =のGetStringある場合。 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 そして同様に、のはここにこれを入れてみましょう。 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 これはのGetStringです。 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 何かのためにそして、絵 そのように以前のようになるだろう、 844 00:34:43,860 --> 00:34:44,360 G--B-E-/ 0。 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 つまり、このような小さなものになります。 847 00:34:48,960 --> 00:34:53,650 そしてsは、したがって、私たちは、これは0x50を呼び出す それは51、52になるだろう。 848 00:34:53,650 --> 00:34:54,409 >> だから、これは0x50をです。 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 そして、私は、文字列tを行います。 851 00:34:59,690 --> 00:35:02,450 メモリでは、それはただになるだろう 私にこのような小さな広場を与える。 852 00:35:02,450 --> 00:35:04,080 だから今重要なステップは、何ですか? 853 00:35:04,080 --> 00:35:09,870 私がtにsのをコピーしたい場合、どのような 空白の私たちはここに記入する必要がありますか? 854 00:35:09,870 --> 00:35:12,050 それともには何が必要ですか ハイレベルでいますか? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 うん? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 誰か? 859 00:35:17,020 --> 00:35:17,690 うん。 860 00:35:17,690 --> 00:35:19,214 >> 聴衆:私たちは、[聞こえない]にする必要があります。 861 00:35:19,214 --> 00:35:21,380 DAVID J.マラン:ええ、私たち この空白を埋めるために必要がある。 862 00:35:21,380 --> 00:35:24,340 私は、コピーしてはできません ゲイブの名前を大文字 863 00:35:24,340 --> 00:35:28,120 Iは、オペレーティングシステムに依頼するまで メモリの別のチャンクの 864 00:35:28,120 --> 00:35:30,640 それは、元と少なくとも同程度大きいです。 865 00:35:30,640 --> 00:35:32,130 だから、それが問題で私たちを残します。 866 00:35:32,130 --> 00:35:36,080 >> 私は、オペレーティングシステムをしない依頼するにはどうすればよい 単なる少しpointer--用 867 00:35:36,080 --> 00:35:38,530 これは呼ばれるように、 住所、pointer--ません 868 00:35:38,530 --> 00:35:40,980 シンプルで小さなボックス このような文字列と呼ばれる? 869 00:35:40,980 --> 00:35:44,200 どうすれば、動作に尋ねるん メモリの大きな塊のためのシステム? 870 00:35:44,200 --> 00:35:48,430 これまでのところ、私はその背中を得ている 間接のGetStringを呼び出すことによって。 871 00:35:48,430 --> 00:35:50,740 それでは、どのようにgetStringさ でも、そのメモリを取得する? 872 00:35:50,740 --> 00:35:53,430 >> まあ、それはそこだと判明 ここで、この他の機能 873 00:35:53,430 --> 00:35:55,160 という私たちは今使用することから始めましょう。 874 00:35:55,160 --> 00:35:59,780 さて、これは道より不可解than--に見える と私は見ることができる唯一の​​一人ですit-- 875 00:35:59,780 --> 00:36:03,150 このラインは道より不可解に見える それは一目見ただけですべきである。 876 00:36:03,150 --> 00:36:04,650 しかし、ここでそれを離れていじめるましょう。 877 00:36:04,650 --> 00:36:07,950 >> 左側では、私は、char * tを持っている。 878 00:36:07,950 --> 00:36:13,280 だから英語で、の策定を開始してみましょう 専門用語で適切な文章。 879 00:36:13,280 --> 00:36:19,757 だから、これは割り当てて char型の変数をtと呼ばれる*。 880 00:36:19,757 --> 00:36:21,090 さて、それは本当に何を意味するのでしょうか? 881 00:36:21,090 --> 00:36:23,881 >> まあ、それは意味し、私は何が起こっています トンと呼ばれるこの変数に置くか? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 char型のアドレス。 884 00:36:26,402 --> 00:36:28,360 だから、ただ簡単です より合理的な方法 885 00:36:28,360 --> 00:36:29,930 左側を説明する。 886 00:36:29,930 --> 00:36:32,890 だから、ここでしか、このボックスを作成します。 887 00:36:32,890 --> 00:36:34,760 だから、右辺、 おそらく、起こっている 888 00:36:34,760 --> 00:36:37,170 もっと大きなことを割り当てるための メモリのどのチャンク? 889 00:36:37,170 --> 00:36:38,340 それでは、これを離れていじめるましょう。 890 00:36:38,340 --> 00:36:41,131 >> それは一目見ただけで圧倒だ、 しかし、内部ここで何が起こっているのですか? 891 00:36:41,131 --> 00:36:43,740 まず、malloc関数があります、これ 私たちの新しい友達は、明らかである 892 00:36:43,740 --> 00:36:45,450 「メモリが割り当てられます。 " 893 00:36:45,450 --> 00:36:49,560 だから、これは渡される引数です その中に、ので、それは非常に大きな引数です。 894 00:36:49,560 --> 00:36:50,970 それでは、これを離れていじめるましょう。 895 00:36:50,970 --> 00:36:53,410 >> sのstrlen関数は、もちろん、the--表し 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 聴衆:文字の数。 898 00:36:55,600 --> 00:36:56,710 DAVID J.マラン:ちょうど s内の文字の数。 899 00:36:56,710 --> 00:36:59,040 だから、sの長さ、元の文字列。 900 00:36:59,040 --> 00:37:00,350 だからG--B-E。 901 00:37:00,350 --> 00:37:02,320 だから、おそらくここでは4つです。 902 00:37:02,320 --> 00:37:05,485 なぜ私は後に1をしています sのstrlen関数を呼び出す? 903 00:37:05,485 --> 00:37:06,360 聴衆:[聞き取れない] 904 00:37:06,360 --> 00:37:07,590 DAVID J.マラン:そのために 特別なヌル文字。 905 00:37:07,590 --> 00:37:11,260 あなたは私に言わせれば、長さのものを ゲイブの名前は、私は4を言おうとしています。 906 00:37:11,260 --> 00:37:14,480 ボンネットの下には、しかし、私が必要とする ヌル文字のため、第5バイト。 907 00:37:14,480 --> 00:37:16,100 私は1をやっだから、なぜだ。 908 00:37:16,100 --> 00:37:21,730 >> 今だけの場合には、これを実行している 以外のコンピュータ上のプログラムは、言う 909 00:37:21,730 --> 00:37:24,610 CS50アプライアンス、 どこチャーのサイズ 910 00:37:24,610 --> 00:37:26,350 異なる場合があります 私自身のcomputer--から 911 00:37:26,350 --> 00:37:30,590 私はこれを呼び出すことができることが判明 オペレータはsizeof、ちょうど、コンピュータを尋ねる 912 00:37:30,590 --> 00:37:32,870 のサイズは何ですか このコンピュータにchar型? 913 00:37:32,870 --> 00:37:37,400 >> そして、これに5を乗算し char型の大きさによってその一例 914 00:37:37,400 --> 00:37:40,440 ほとんどのコンピュータ上の意志 ひとつ、malloc関数であること 915 00:37:40,440 --> 00:37:44,830 私のためにこの大きなを割り当てることが起こっている ここに右のオーバーメモリの塊。 916 00:37:44,830 --> 00:37:47,140 そして、それはreturn--ために起こっている それはですので、それはfunction--です 917 00:37:47,140 --> 00:37:48,265 私に何を返すつもり? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 聴衆:アドレス? 920 00:37:51,830 --> 00:37:53,709 DAVID J.マラン:何のアドレス? 921 00:37:53,709 --> 00:37:55,250 聴衆:それは割り当てられたメモリの? 922 00:37:55,250 --> 00:37:56,450 DAVID J.マラン:オブ メモリそれが割り当てられた。 923 00:37:56,450 --> 00:37:59,189 だから私は、率直に言って、全く分からない これはどこに終わるだろう。 924 00:37:59,189 --> 00:38:01,480 私はそれを提案するつもりだ それは0x88ので終了になるだろう。 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 完全に任意ですが、 0x50を除くどこかに、 927 00:38:06,009 --> 00:38:08,800 オペレーティングシステムのために、どのような WindowsおよびMac OSは、私のためにされません 928 00:38:08,800 --> 00:38:11,230 それが与えていることを確認してください 私のRAM異なるチャンク。 929 00:38:11,230 --> 00:38:14,210 >> だから、これは、この値である メモリのチャンクは終わるかもしれない。 930 00:38:14,210 --> 00:38:16,060 だから、これは0x88の、ここで終わるものです。 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 だから今はっきりと、私は理解することができます これはこれと同じではないことを、 933 00:38:21,570 --> 00:38:23,960 彼らはを指しているので メモリの異なるチャンク。 934 00:38:23,960 --> 00:38:29,980 だから私は今実際にこれをコピーしたい場合は、 で、のはあなたの提案した解決策を実行してみましょう。 935 00:38:29,980 --> 00:38:36,870 >> forループを作成し、ちょうど行ってみよう、 とtブラケットを行う私は、sブラケット私を取得します。 936 00:38:36,870 --> 00:38:39,760 今私が使用することができますので、 この配列に似た表記法、 937 00:38:39,760 --> 00:38:43,390 なぜならたとえmalloc関数は非常に 一般的に私にメモリを割り当て、 938 00:38:43,390 --> 00:38:45,290 メモリは、単なる連続したバイトです。 939 00:38:45,290 --> 00:38:47,240 バイト、バイト、バイト、背中合わせにバックアップする。 940 00:38:47,240 --> 00:38:50,030 >> 私は確かにプログラマーとして缶 これは、配列のように扱う 941 00:38:50,030 --> 00:38:55,090 私はこの最後におなじみを使用できることを意味します 単にいくつかの大括弧の表記。 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> ですからので、私はそこに一時停止してみましょう これさえ、すべてを一度にたくさんある 944 00:39:00,020 --> 00:39:03,530 要約への基本的な考え方も その文字列は、すべてのこの時間、 945 00:39:03,530 --> 00:39:05,550 それ自体は、新しいデータ型ではありません。 946 00:39:05,550 --> 00:39:10,150 それはちょうど、いわゆるポインタですが、 文字のアドレス、 947 00:39:10,150 --> 00:39:12,650 これだけでは、番号の意味 その人間の慣例 948 00:39:12,650 --> 00:39:15,350 私たちは、0xの何かを書く傾向がある。 949 00:39:15,350 --> 00:39:18,590 >> しかし、それは、ただの数だ 33オックスフォードストリートのように、 950 00:39:18,590 --> 00:39:20,530 それはあることを起こる CSビルのアドレス。 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 これらの詳細についてご質問? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 うん? 955 00:39:25,289 --> 00:39:28,530 >> 聴衆:なぜ私たちはチェックしますか ヌルに等しいtについて? 956 00:39:28,530 --> 00:39:30,740 >> DAVID J.マラン:なぜ私たちは nullに等しいトンをチェックする? 957 00:39:30,740 --> 00:39:33,250 私たちはdocumentation--を読めば mallocのための素晴らしいquestion--、 958 00:39:33,250 --> 00:39:37,020 それは、細かい文字で言うために起こっている 時にはmalloc関数は、NULLを返すことがあり、 959 00:39:37,020 --> 00:39:38,080 ただのGetStringなどがある。 960 00:39:38,080 --> 00:39:41,820 そして実際、のGetStringはnullを返します 、今度は、malloc関数はnullを返した場合、 961 00:39:41,820 --> 00:39:43,130 のGetStringはmalloc関数を使用していますので。 962 00:39:43,130 --> 00:39:46,400 >> OSあればそれは起こるかもしれない、 Mac OSでは、Windowsは、どのような、単純に 963 00:39:46,400 --> 00:39:48,130 あなたのためのメモリー不足。 964 00:39:48,130 --> 00:39:49,820 だから、そこに何が起こったのです。 965 00:39:49,820 --> 00:39:52,910 >> そして、私は一つの他の事を明らかにしてみましょう それはちょうどあなたの心を爆破かもしれない 966 00:39:52,910 --> 00:39:55,100 または完全に離れすぎて回線上であること。 967 00:39:55,100 --> 00:39:59,770 しかし、私はプルアップしましょう コピー用のforループと同じ、 968 00:39:59,770 --> 00:40:05,480 先ほど、これリコールした この。 Tブラケットiはsのブラケットiを取得します。 969 00:40:05,480 --> 00:40:06,740 >> ニースとユーザーフレンドリー。 970 00:40:06,740 --> 00:40:09,330 再び2週のように感じている。 971 00:40:09,330 --> 00:40:14,920 しかし、このバージョンでは、実際にすることができ 不可解に見えるこれ、このように書き換える。 972 00:40:14,920 --> 00:40:18,280 これは、ポインタと呼ばれる技術です 算術、アドレス演算。 973 00:40:18,280 --> 00:40:19,600 しかし、なぜこれが動作しますか? 974 00:40:19,600 --> 00:40:22,220 >> 今うるさく、 Cの著者は、使用することを決めた 975 00:40:22,220 --> 00:40:25,070 異なる目的のために*記号。 976 00:40:25,070 --> 00:40:29,020 私たちは、それが既に一度使用を見てきました 「私に変数を与える意味はchar *、 977 00:40:29,020 --> 00:40:31,210 それが含まれているために起こっている char型のアドレス。 " 978 00:40:31,210 --> 00:40:33,990 その文脈でそうCHAR * 「私に変数を与えること」を意味します。 979 00:40:33,990 --> 00:40:40,050 >> 残念ながら、あなたがすることなく*を使用している場合 その前に言葉、チャーのような、 980 00:40:40,050 --> 00:40:41,905 現在では呼ばれています 間接参照演算子。 981 00:40:41,905 --> 00:40:43,530 そして、私たちはずっと前にこれのより多く表示されます。 982 00:40:43,530 --> 00:40:44,930 しかし、それは単に「そこに行く」を意味します。 983 00:40:44,930 --> 00:40:49,070 誰かが私を手渡した場合は、言ってようなものだ 紙に「33オックスフォードストリート」 984 00:40:49,070 --> 00:40:53,830 私がしなければ "* 33オックスフォードストリートに、「その手段 「CSの建物への道を下る。 " 985 00:40:53,830 --> 00:40:57,220 >> だから*ちょうどあればそこに行くことを意味 その前には言葉はありません。 986 00:40:57,220 --> 00:40:59,100 だから、tは明確にするためには、何ですか? 987 00:40:59,100 --> 00:41:03,250 tはのチャンクのアドレスです 私に戻って与えられたメモリー。 988 00:41:03,250 --> 00:41:06,650 sは、明確にすべきか、のアドレスである 例では、議論してきた、 989 00:41:06,650 --> 00:41:07,500 小文字のゲイブの? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 sはアドレスですof-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 聴衆:文字列。 994 00:41:12,460 --> 00:41:14,126 DAVID J.マラン:ゲイブの元の名前の中で。 995 00:41:14,126 --> 00:41:16,660 だから、のアドレスです このメモリチャンク。 996 00:41:16,660 --> 00:41:22,220 だから私がt + i--私は、通知を、言うなら ちょうど私たちの古くからの友人である。 997 00:41:22,220 --> 00:41:24,770 それだけでインデックス変数です それは、最大でゼロから反復するだ 998 00:41:24,770 --> 00:41:26,960 文字列sの長さ。 999 00:41:26,960 --> 00:41:30,367 だから、ゼロ、1になるだろう その後、2つ、その後三つ、四つ。 1000 00:41:30,367 --> 00:41:33,200 それでは、これらの新しいを組み立てるましょう スクラッチのようなパズルのピース、可能ならば、 1001 00:41:33,200 --> 00:41:36,140 にもかかわらず、再び、構文 スクラッチよりもはるかに難解である。 1002 00:41:36,140 --> 00:41:39,522 だから、tはアドレス+である 私は私を与えるために起こっている 1003 00:41:39,522 --> 00:41:42,480 これらが全てですので、数、 私たちは、16進数で描いてきた数字。 1004 00:41:42,480 --> 00:41:43,560 しかし、彼らはただの数字だ。 1005 00:41:43,560 --> 00:41:49,960 >> Tのアドレスは私達が言ったのであれば 0x88のプラスゼロ何、0x88のだった。 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 あなたが慣れていない方でも 六角ではまだ、推測を取る。 1008 00:41:53,980 --> 00:41:54,410 >> 聴衆:オリジナル。 1009 00:41:54,410 --> 00:41:55,850 >> DAVID J.マラン:0x88の静止画。 1010 00:41:55,850 --> 00:41:58,910 だから* 0x88のは何を意味するのでしょうか? 1011 00:41:58,910 --> 00:42:02,670 それは意味する「そこに行く」という意味 効果的に、「ここに指を置く。 " 1012 00:42:02,670 --> 00:42:06,930 そして今の右側に この式、*、その後括弧内、 1013 00:42:06,930 --> 00:42:11,586 S +はiの手段秒、 ここで少しgをアップに取り組む。 1014 00:42:11,586 --> 00:42:16,220 秒+ 0が何秒であり、もちろん、sである。 1015 00:42:16,220 --> 00:42:21,230 >> だから今、それだけで*​​のような33 * sのだ オックスフォードストリートには、アドレスに行くことを意味 1016 00:42:21,230 --> 00:42:22,010 秒。 1017 00:42:22,010 --> 00:42:24,170 だからここにこの指、右手です。 1018 00:42:24,170 --> 00:42:26,050 それでは、私は何にコピーするつもり? 1019 00:42:26,050 --> 00:42:30,260 で右のもの、 ここにゲイブ、ここで少しgであった。 1020 00:42:30,260 --> 00:42:32,750 >> そして、その結果の影響 ループの最初の反復、 1021 00:42:32,750 --> 00:42:36,200 あなたはそれが見えていても、提案されているように 何よりもクレイジーより複雑 1022 00:42:36,200 --> 00:42:42,110 私たちは、以前に見たことが単純に言っている ここに行くと、ここでその文字をコピーします。 1023 00:42:42,110 --> 00:42:44,700 それはあなたの両方の場所に地図を与えている。 1024 00:42:44,700 --> 00:42:46,130 >> そして、私たちはこれをはるかに表示されます。 1025 00:42:46,130 --> 00:42:50,600 しかし、今のところ、希望がわずかにある これらの基本的なアイデアをいくつかご紹介します。 1026 00:42:50,600 --> 00:42:53,550 そして実際、それでは見てみましょう ここに1最終的なプログラム、 1027 00:42:53,550 --> 00:42:57,480 、次に約束したクレイ、 そのすべてが大丈夫になります。 1028 00:42:57,480 --> 00:42:57,980 かしこまりました。 1029 00:42:57,980 --> 00:43:01,680 だから私はそこに私達は行くup--開いてみましょう。 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 私たちは戻ってくるme--そうしましょう ずっと前にこの絵に。 1032 00:43:05,440 --> 00:43:08,360 私はここに、この最後の例を開いてみましょう。 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> だからここにスーパー、スーパーで 実現プログラム 1035 00:43:12,710 --> 00:43:15,050 次のことを行います生活の中では何もありません。 1036 00:43:15,050 --> 00:43:18,740 これは、最初の2つの変数のxを宣言 とy、今回は数値ではない、 1037 00:43:18,740 --> 00:43:19,240 それ自体。 1038 00:43:19,240 --> 00:43:20,448 彼らは、それ自体が、整数ではないよ。 1039 00:43:20,448 --> 00:43:22,899 彼らは明らかに* int型されている。 1040 00:43:22,899 --> 00:43:25,690 だから誰もが、それは何を意味するのか あなたのデータ型であれば、あなたの変数、 1041 00:43:25,690 --> 00:43:26,860 型int *スターのでしょうか? 1042 00:43:26,860 --> 00:43:30,240 つまり、int型のアドレスです。 1043 00:43:30,240 --> 00:43:31,990 >> だから私はそれがまだあるさっぱりだが。 1044 00:43:31,990 --> 00:43:35,150 それはちょうど、「最終的には、置くことを意味 ここにint型のアドレス。 " 1045 00:43:35,150 --> 00:43:38,340 それがである場所0x50を、0x88の、 メモリは、アドレスがそこに起こっている。 1046 00:43:38,340 --> 00:43:40,200 そして、それはyは何 同様に、あることを行って。 1047 00:43:40,200 --> 00:43:44,920 >> 私が今言うなら、X =のmalloc(はsizeof(int型))、 これは、というのがファンシーな方法ですが、 1048 00:43:44,920 --> 00:43:49,000 ちょっとオペレーティングシステム、malloc関数を経由して、 サイズは私に十分なメモリを与える 1049 00:43:49,000 --> 00:43:52,370 おそらく、int型の 32ビットまたは4バイトになるだろう。 1050 00:43:52,370 --> 00:43:53,680 >> だから、malloc関数は何を返すのでしょうか? 1051 00:43:53,680 --> 00:43:55,250 malloc関数は、アドレスを返します。 1052 00:43:55,250 --> 00:43:57,020 それでは、Xに格納されて取得するつもりだ? 1053 00:43:57,020 --> 00:44:00,600 のチャンクのアドレス メモリ、4バイト、それはmalloc 1054 00:44:00,600 --> 00:44:03,360 ただ尋ねることによって私のために発見 オペレーティングシステム。 1055 00:44:03,360 --> 00:44:08,240 >> さて一方、行 ここでは4、* X = 42。 1056 00:44:08,240 --> 00:44:09,990 ただ明確にするために、 ダウンそこに何が起こっているの? 1057 00:44:09,990 --> 00:44:11,530 左側に、*のx。 1058 00:44:11,530 --> 00:44:13,610 それは* 33オックスフォードストリートのようなものだ。 1059 00:44:13,610 --> 00:44:15,523 だから、* xが何を意味? 1060 00:44:15,523 --> 00:44:16,450 >> 聴衆:に移動します。 1061 00:44:16,450 --> 00:44:17,908 >> DAVID J.マラン:そのアドレスに移動します。 1062 00:44:17,908 --> 00:44:20,466 どこのそのチャンク メモリはそれに行く、である。 1063 00:44:20,466 --> 00:44:21,979 そして明らかに、どのようなそこに置か? 1064 00:44:21,979 --> 00:44:22,520 聴衆:42。 1065 00:44:22,520 --> 00:44:23,580 DAVID J.マラン:42。 1066 00:44:23,580 --> 00:44:25,650 すべての権利、* yを、同じ考え。 1067 00:44:25,650 --> 00:44:26,860 yのアドレスに移動します。 1068 00:44:26,860 --> 00:44:31,740 そこに数13を入れ、 しかし現時点では、yは何ですか? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 聴衆:yに対するメモリがありません。 1071 00:44:34,630 --> 00:44:35,710 DAVID J.マラン:あり Yのためのメモリがありません。 1072 00:44:35,710 --> 00:44:38,215 それでは、おそらくyとし 私たちが言ってきたように、含まれている? 1073 00:44:38,215 --> 00:44:38,520 >> 聴衆:ごみ。 1074 00:44:38,520 --> 00:44:39,480 >> DAVID J.マラン:一部のごみ値。 1075 00:44:39,480 --> 00:44:41,320 次に、ガベージ値がまだ数です。 1076 00:44:41,320 --> 00:44:43,160 それはまだアドレスと間違われることができます。 1077 00:44:43,160 --> 00:44:45,160 それは誰かいるかのようだ ダウン何かを走り書き、 1078 00:44:45,160 --> 00:44:48,002 と私は意味としてそれを誤解 通りをいくつかの建物。 1079 00:44:48,002 --> 00:44:50,460 そして、あなたはちょうどに移動しよう あなたが所有していないいくつかの建物、 1080 00:44:50,460 --> 00:44:53,710 あなたが持っていないメモリのまたはいくつかのチャンク 与えられて、悪い事が起こるかもしれません。 1081 00:44:53,710 --> 00:44:57,740 コンピュータがクラッシュしたり、他のいくつかの可能性があります 未確定動作が発生する可能性があります。 1082 00:44:57,740 --> 00:45:01,310 >> だから、その後、Binkyこのイントロです。 1083 00:45:01,310 --> 00:45:04,290 私はまだ20、覚えている いくつかの奇妙年後、 1084 00:45:04,290 --> 00:45:07,200 私はときに私やっとあった場所 ポインタを理解していた。 1085 00:45:07,200 --> 00:45:09,520 >> あなたはどちらも、と言うことです 3分でここに残す 1086 00:45:09,520 --> 00:45:12,170 と私にはないと思う ポインタを理解し、実現する 1087 00:45:12,170 --> 00:45:14,410 私は20のために覚えている いくつかのクレイジーな理由で年 1088 00:45:14,410 --> 00:45:17,140 いつ、なぜ、それが最終的に沈没 で、私の授業で座っ 1089 00:45:17,140 --> 00:45:19,501 仲間、Nishatメータ内 エリオットダイニングホールの裏側。 1090 00:45:19,501 --> 00:45:21,250 今、私は思い出しました これこれがあったため、 1091 00:45:21,250 --> 00:45:23,920 トピックのいずれか、私は、中 特に、苦戦。 1092 00:45:23,920 --> 00:45:26,470 その後、それは最終的にクリック、 のような私は、トピックの多くをあえて言う 1093 00:45:26,470 --> 00:45:27,460 最終的になります。 1094 00:45:27,460 --> 00:45:32,590 そして今、それはすべての気分にさせるために 幸せとすべてのより説得力、 1095 00:45:32,590 --> 00:45:35,360 私たちの中で最後のを見てみましょう ここBinkyで最後の3分、 1096 00:45:35,360 --> 00:45:37,675 私たちの友人、ニックから スタンフォードからParlante。 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [ビデオ再生] 1099 00:45:41,580 --> 00:45:42,750 >> -Hey、Binky。 1100 00:45:42,750 --> 00:45:43,500 目を覚ます! 1101 00:45:43,500 --> 00:45:45,960 これは、ポインタの楽しみのための時間です。 1102 00:45:45,960 --> 00:45:47,012 >> それは - 何ですか? 1103 00:45:47,012 --> 00:45:48,723 ポインタについて学ぶ? 1104 00:45:48,723 --> 00:45:50,580 ああ、グッディ! 1105 00:45:50,580 --> 00:45:53,563 >> 型ウェル、始めるために、私たちはしていると思います カップルのポインタが必要になるだろ。 1106 00:45:53,563 --> 00:45:54,390 >> -OK。 1107 00:45:54,390 --> 00:45:57,930 このコードは、2つのポインタを割り当て、 これは整数を指すことができます。 1108 00:45:57,930 --> 00:45:58,430 -OK。 1109 00:45:58,430 --> 00:46:02,140 さて、私は2つのポインタを参照してくださいますが、それら 何を指していないようです。 1110 00:46:02,140 --> 00:46:02,980 >> - すなわちそうです。 1111 00:46:02,980 --> 00:46:05,100 最初は、ポインタ 何を指していない。 1112 00:46:05,100 --> 00:46:08,030 彼らは呼ばれているものを指す 指示先、およびそれらの設定の 1113 00:46:08,030 --> 00:46:09,370 別のステップ。 1114 00:46:09,370 --> 00:46:10,220 >> 右、右、-OH。 1115 00:46:10,220 --> 00:46:10,950 私はそれを知っていた。 1116 00:46:10,950 --> 00:46:12,385 指示先は別のものです。 1117 00:46:12,385 --> 00:46:14,315 小胞体、それでは、どのように指示先を割り当てるのですか? 1118 00:46:14,315 --> 00:46:15,340 1119 00:46:15,340 --> 00:46:15,960 >> -OK。 1120 00:46:15,960 --> 00:46:18,970 さて、このコードは割り当て、 新しい整数ポインタの指示、 1121 00:46:18,970 --> 00:46:20,950 この部分集合xは、それを指すように設定します。 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> -Hey、それが良く見える。 1124 00:46:23,230 --> 00:46:25,060 だから、何かを作る。 1125 00:46:25,060 --> 00:46:25,990 >> -OK。 1126 00:46:25,990 --> 00:46:30,455 私よへのポインタxの逆参照 その指示先に数42を格納します。 1127 00:46:30,455 --> 00:46:32,830 このトリックのために、私は私のが必要になるでしょう 間接参照の魔法の杖。 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> 間接参照の - あなたの魔法の杖? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 That--それは素晴らしいことです。 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> - これは、コードがどのようなものです。 1134 00:46:41,080 --> 00:46:44,110 私はちょうど番号、[POP]をセットアップします 1135 00:46:44,110 --> 00:46:44,700 >> -Hey、見て。 1136 00:46:44,700 --> 00:46:46,140 そこにそれは行く。 1137 00:46:46,140 --> 00:46:50,980 >> xは以下の通りで間接参照をしている - SO 矢印は、その指示先にアクセスします。 1138 00:46:50,980 --> 00:46:53,160 そこで、この場合、店舗42。 1139 00:46:53,160 --> 00:46:57,710 ちょっと数を格納するためにそれを使用してみてください 他のポインタ、yは13〜。 1140 00:46:57,710 --> 00:46:58,760 >> -OK。 1141 00:46:58,760 --> 00:47:03,270 私はちょうどyにこっち行くよ、 その数13は、設定されたりし。 1142 00:47:03,270 --> 00:47:07,930 そして、ワンドオブを取る 間接参照だけ[BUZZ] 1143 00:47:07,930 --> 00:47:08,960 >> -OH! 1144 00:47:08,960 --> 00:47:09,500 >> ちょっと、-OH! 1145 00:47:09,500 --> 00:47:11,090 それは動作しませんでした。 1146 00:47:11,090 --> 00:47:15,630 Binky、私はデリファレンスとは思わない、と言う あなたが知っているので、yは、良い考えです 1147 00:47:15,630 --> 00:47:17,850 指示先を設定する 別のステップである。 1148 00:47:17,850 --> 00:47:20,450 そして、私は私たちが今までそれをやったとは思わない。 1149 00:47:20,450 --> 00:47:21,480 >> グッドポイント。 1150 00:47:21,480 --> 00:47:21,980 -Yeah。 1151 00:47:21,980 --> 00:47:25,680 私たちは、ポインタyを割り当てたが、私たち 指示先を指すように設定することはありません。 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> - 非常に注意深い。 1154 00:47:28,616 --> 00:47:30,240 -Hey、あなたは、そこにBinkyの良い探しています。 1155 00:47:30,240 --> 00:47:33,400 yを指すように、あなたはそれを修正することができます xと同じ指示先へ? 1156 00:47:33,400 --> 00:47:34,000 >> -sure。 1157 00:47:34,000 --> 00:47:36,780 私は自分の魔法の杖を使用します ポインタ代入の。 1158 00:47:36,780 --> 00:47:38,740 >> になるだろうことを-is 前のような問題? 1159 00:47:38,740 --> 00:47:39,240 - いいえ。 1160 00:47:39,240 --> 00:47:40,660 これは指示先に触れていない。 1161 00:47:40,660 --> 00:47:44,450 それはちょうど1つのポインタを変更する 別のと同じことを指している。 1162 00:47:44,450 --> 00:47:45,450 >> OH、なるほど。 1163 00:47:45,450 --> 00:47:48,200 xと同じ場所に今yを指しています。 1164 00:47:48,200 --> 00:47:48,910 だから、待ってください。 1165 00:47:48,910 --> 00:47:49,950 ここで、yは固定されている。 1166 00:47:49,950 --> 00:47:51,120 それは、指示先を持っています。 1167 00:47:51,120 --> 00:47:54,510 だから、ワンドオブを試すことができます 13オーバーを送信するために再び間接参照。 1168 00:47:54,510 --> 00:47:56,510 >> [OK]を、-UH。 1169 00:47:56,510 --> 00:47:58,160 ここでは、行く。 [POP] 1170 00:47:58,160 --> 00:47:59,340 >> -Hey、その見てください。 1171 00:47:59,340 --> 00:48:00,750 今Y上の作品を逆参照。 1172 00:48:00,750 --> 00:48:04,991 そして、ポインタが共有しているため、 1指示先という、どちらも13を参照してください。 1173 00:48:04,991 --> 00:48:05,490 -Yeah。 1174 00:48:05,490 --> 00:48:06,870 共有、何でも。 1175 00:48:06,870 --> 00:48:08,820 だから私たちは今の場所を切り替えるために行くの? 1176 00:48:08,820 --> 00:48:09,440 >> ああ、見て。 1177 00:48:09,440 --> 00:48:10,830 私たちは、時間がなくなっている。 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> 3ポインタのルールを覚えて-Just。 1180 00:48:13,530 --> 00:48:16,560 ナンバーワン、基本的な構造 あなたは、ポインタを持っているということです、 1181 00:48:16,560 --> 00:48:18,680 そしてそれは指示先に引き継が指しています。 1182 00:48:18,680 --> 00:48:20,640 しかし、ポインタと 指示先は、分離している 1183 00:48:20,640 --> 00:48:22,610 そして一般的なエラー ポインタを設定することです、 1184 00:48:22,610 --> 00:48:25,000 しかしそれを指示先を与えることを忘れている。 1185 00:48:25,000 --> 00:48:28,170 >> 数二、逆参照ポインタ ポインタで始まり、 1186 00:48:28,170 --> 00:48:31,050 オーバーその矢印に従う その指示先にアクセスします。 1187 00:48:31,050 --> 00:48:33,400 私達はすべて知っているように、この がある場合にのみ動作します 1188 00:48:33,400 --> 00:48:36,270 指示先、種類の ナンバーワンルールに戻って取得します。 1189 00:48:36,270 --> 00:48:39,000 >> ナンバースリー、ポインタ 割り当ては1ポインタを取り 1190 00:48:39,000 --> 00:48:42,320 とを指すように変更します 別のポインタと同じ指示先。 1191 00:48:42,320 --> 00:48:44,160 だから割当て後、 二つのポインタ 1192 00:48:44,160 --> 00:48:45,910 同じ指示先を指すようになります。 1193 00:48:45,910 --> 00:48:47,990 時には、そのは共有と呼ばれています。 1194 00:48:47,990 --> 00:48:49,740 そして、それは本当に、これだけです。 1195 00:48:49,740 --> 00:48:50,277 バイバイ今。 1196 00:48:50,277 --> 00:48:51,110 [END VIDEO再生] 1197 00:48:51,110 --> 00:48:52,568 DAVID J.マラン:それはCS50は終わりです。 1198 00:48:52,568 --> 00:48:55,110 私たちは、来週お会いしましょう​​。 1199 00:48:55,110 --> 00:48:56,064