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 Дејвид Џ MALAN: Во ред. 4 00:00:11,650 --> 00:00:15,610 Ова е CS50, и тоа е крајот на недела четири. 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 кога работев за локалните Middlesex Каунти Окружниот правобранителство 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 Но работата морав, и daresay дека светот, 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 >> Чекај тоа. 29 00:01:12,932 --> 00:01:13,657 Се кандидира тоа назад. 30 00:01:13,657 --> 00:01:14,733 >> Чекај една минута. 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 -Нема. 34 00:01:16,870 --> 00:01:17,369 Замрзнување тоа. 35 00:01:17,369 --> 00:01:17,930 -Full Екранот. 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 >> -Vector Во на таа дечко од страна на задното тркало. 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 >> Може ли ќе јасно дека која било? 45 00:01:32,170 --> 00:01:33,070 >> -Јас Не знам. 46 00:01:33,070 --> 00:01:34,150 Ајде да го подобрат. 47 00:01:34,150 --> 00:01:35,440 >> -Enhance Дел А6. 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 -Мислам Има доволно да се зголеми. 51 00:01:40,020 --> 00:01:40,976 Ослободете ја на мојот екран. 52 00:01:40,976 --> 00:01:42,559 >> -Јас Подобрена одраз во нејзините очи. 53 00:01:42,559 --> 00:01:44,322 -Ајде Се кандидира тоа преку засилувач на видео. 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 >> Одраз на нечиј Таму е. 59 00:01:50,402 --> 00:01:50,902 >> -Reflection. 60 00:01:50,902 --> 00:01:52,870 Таму е одраз на лицето на човекот. 61 00:01:52,870 --> 00:01:53,694 >> -На Одраз! 62 00:01:53,694 --> 00:01:54,610 Таму е рефлексија. 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 >> Може ли да се подобри сликата од тука? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 Може ли да го подобрат? 68 00:02:01,210 --> 00:02:02,190 Може ли да го подобрат? 69 00:02:02,190 --> 00:02:03,066 Може ли ние подобри ова? 70 00:02:03,066 --> 00:02:03,898 Може ли да го подобрат? 71 00:02:03,898 --> 00:02:04,740 Чекај една секунда. 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 -Times 10. 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 Чекај, да престане. 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 -Rotate Ни 75 степени околу вертикалната, ве молам. 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 Слика подобрувач кои можат да bitmap? 86 00:02:21,420 --> 00:02:24,420 >> -Можеби Може да се користат Pradeep Синг метод за да се види во Windows. 87 00:02:24,420 --> 00:02:25,902 >> -На Софтвер е држава на уметноста. 88 00:02:25,902 --> 00:02:26,866 >> -На Eigenvalue е исклучено. 89 00:02:26,866 --> 00:02:29,758 >> -Со право комбинација на algorithms-- 90 00:02:29,758 --> 00:02:32,168 >> Земени осветлување -Тој на алгоритми за да на следното ниво, 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 видео репродукција] 98 00:02:43,420 --> 00:02:45,830 Дејвид Џ MALAN: Значи тоа се сите зборови, но тие не беа 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 Ова е свој Daven 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 И навистина, во очите на Daven е само четири, можеби шест пиксели 112 00:03:19,190 --> 00:03:22,110 кои ја сочинуваат точно беше glimmering таму. 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 но не толку многу со хард диск, или спасување на датотеки надвор од оние што 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 Ова е слика што може да имаат или испратите на Фејсбук, 125 00:03:50,520 --> 00:03:51,690 или види никаде на интернет. 126 00:03:51,690 --> 00:03:54,460 Всушност, таа слика ние само видов на Daven беше 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 >> Со други зборови, што е тоа што разликува JPEG од GIF 130 00:04:05,200 --> 00:04:08,109 од пинг од Word документ од 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 >> Така што кога вашиот компјутер се отвора Збор doc, или кога компјутерот отвора 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 doc. 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 Но првите три бајти во повеќето секој JPEG почне со овие три броја. 142 00:04:40,140 --> 00:04:44,680 Па бајт нула, еден, а двајца се во повеќето секој 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 и како bitmap датотеки, и при гледањето она што отсекогаш била таму за колку 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 >> Ние, се разбира, се запознаени со децимален, нула преку девет. 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 за разлика од две или 10. 162 00:05:31,330 --> 00:05:34,530 >> Па како не ви смета на повисоки од девет во хексадецимален? 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 изгледа ако беа да се напише оние првите три 170 00:05:58,600 --> 00:06:01,980 не бајти како децимална но, на пример, како хексадецимални? 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 но левата и вистинскиот се прилично лесно. 176 00:06:14,820 --> 00:06:17,990 255 е најголем број се би можеле да претставуваат со осум бита. 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 дека шемата на една и нули претставува 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 >> Па, еден бајт, се разбира, е осум бита. 184 00:06:33,970 --> 00:06:38,980 И излегува дека ако мислите на бајт како две парчиња од четири бита, 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 Како може сега ние ги претставуваме во, да речеме, хексадецимален секој quad на битови, 190 00:06:51,840 --> 00:06:52,880 секој сет на четири битови? 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 Имате оние место, twos место, на четири место, и Eights место. 194 00:07:03,780 --> 00:07:04,341 >> ПУБЛИКАТА: 15. 195 00:07:04,341 --> 00:07:05,340 Дејвид Џ MALAN: Тоа е 15. 196 00:07:05,340 --> 00:07:08,340 Значи, ако правиме осум плус четири плус два плус еден, да добиеме 15. 197 00:07:08,340 --> 00:07:11,790 Па можев да запишам 15 подолу 1111, но целата поента тука 198 00:07:11,790 --> 00:07:13,190 е хексадецимален не, децимала. 199 00:07:13,190 --> 00:07:17,310 Така, наместо на пишување на одредување на 15, 1-5, Одам да се напише дека во хексадецимален, 200 00:07:17,310 --> 00:07:22,311 што ако мислите назад, ако имате нула преку ѓ, што е 15 ќе биде? 201 00:07:22,311 --> 00:07:22,810 ПУБЛИКАТА: ѓ. 202 00:07:22,810 --> 00:07:24,434 Дејвид Џ MALAN: Значи излегува тоа е ѓ. 203 00:07:24,434 --> 00:07:29,140 И можете да работите дека надвор со зборовите: и, ако е 10, тогаш во ред, f е 15. 204 00:07:29,140 --> 00:07:33,250 Па навистина, би можеле да ја преработи истиот сет на броеви, како ѓ ѓ. 205 00:07:33,250 --> 00:07:35,750 А потоа ако се направи малку математика, ние ќе се заклучи дека тоа е г. 206 00:07:35,750 --> 00:07:38,650 Осум е прилично лесно, затоа што имаат еден во осмици место. 207 00:07:38,650 --> 00:07:40,620 И тогаш, имаме уште неколку ѓ ѓ е. 208 00:07:40,620 --> 00:07:44,669 >> Значи она што луѓето имаат тенденција да се направи од страна на конвенцијата кога тие ги користат хексадецимален е тие само 209 00:07:44,669 --> 00:07:47,710 пишувам ова малку повеќе посочно, се ослободи од повеќето од тоа белиот простор. 210 00:07:47,710 --> 00:07:50,890 И само за да биде супер јасно читателите дека ова е хексадецимален, 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 во овој случај, тогаш d a, тогаш f f. 215 00:08:04,210 --> 00:08:06,700 Па скратам приказната, хексадецимален само има тенденција 216 00:08:06,700 --> 00:08:11,990 да биде корисно, бидејќи секој од своите бројки, нула преку ѓ, совршено линии 217 00:08:11,990 --> 00:08:13,880 со модел на четири бита. 218 00:08:13,880 --> 00:08:18,080 >> Значи, ако имате два хексадецимални цифри, нула преку Ф, повторно и повторно, 219 00:08:18,080 --> 00:08:20,256 кој ви дава совршено осум битови или еден бајт. 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 И ова беше bitmap датотека, BMP. 229 00:08:43,000 --> 00:08:47,690 И bitmap датотека, како што ќе видите следната недела, исто како модел на точки, 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 дека под хаубата, тоа има повеќе од само три бајти 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 И ќе видите ова во П сет. 236 00:09:04,704 --> 00:09:06,810 И добивање на нешто особено од ова сега 237 00:09:06,810 --> 00:09:10,720 не е толку важно, како што само фактот дека на почетокот на секоја bitmap 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 >> Сега Microsoft, Авторот на овој формат, 241 00:09:16,720 --> 00:09:18,820 има тенденција да се јавите на оние работите не ints и знаци 242 00:09:18,820 --> 00:09:22,259 и плови но зборовите и г зборови и копнее и бајти. 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 Но, ќе видиме дека во Р постави четири. 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 на самиот почеток тоа bitmap датотека. 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 Само да iterate од нула на до три, 266 00:10:19,860 --> 00:10:22,070 ако има тројца студенти на Универзитетот Харвард. 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 >> Ова е вид на како недела Еден, недела две работи сега, 270 00:10:28,630 --> 00:10:30,810 каде што само сакаат за јамка или нешто слично. 271 00:10:30,810 --> 00:10:34,500 И сакам да се јавам GetString неколку пати, а потоа печати ѓ неколку пати. 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 И јас не сакам hardcode три тука. 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 само така јас не мора да hardcode три во повеќе места. 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 >> И сега, би можел да направи нешто како за (int i = 0; i <студентите; јас ++. 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 да речеме, печати овие работи out-- па НАПРАВИ подоцна. 294 00:11:40,060 --> 00:11:42,330 Јас ќе одам да направите повеќе со this-- ова веројатно применува 295 00:11:42,330 --> 00:11:45,970 правилна примена на добивање на имиња и куќи, три 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 Што ако студентот има не само името и куќа, но, исто така, матичен број, 299 00:11:55,220 --> 00:11:57,770 и телефонски број, и е-мејл адреса, 300 00:11:57,770 --> 00:12:00,280 а можеби и почетната страница, и можеби рачка Твитер, 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 int ИД студенти. 306 00:12:16,490 --> 00:12:18,380 Така што може да се стави сите свои лични карти во таму. 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 Па ајде да одиме напред и само повик овој Чурлика студенти, што 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 Ц не доаѓаат со вграден во функционалност за студентите, 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 И под хаубата на Р постави три, веќе сте правеле тоа сега. 322 00:13:01,490 --> 00:13:05,920 Не постои такво нешто како е rect или Г овална во програмскиот јазик С 323 00:13:05,920 --> 00:13:10,570 >> Луѓе во Стенфорд имплементирани оние типови на податоци со користење на овој пристап тука, 324 00:13:10,570 --> 00:13:13,900 прогласувајќи свои нови податоци видови користење на нова клучен збор 325 00:13:13,900 --> 00:13:16,744 наречен struct и друг еден вика 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 И дека структурата се случува да имаат низа наречен име, 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, и плови, и знак, и стринг, 337 00:13:46,420 --> 00:13:50,270 и g rect, и g овална, и било кој број други работи луѓето измислиле. 338 00:13:50,270 --> 00:13:53,340 >> Значи она што е корисно за оваа сега е дека ако се вратам 339 00:13:53,340 --> 00:13:57,430 да struct 0, а заврши овој имплементација, која ја напишав 340 00:13:57,430 --> 00:14:02,080 однапред тука, забележите дека сите на неизбежен messiness дека 341 00:14:02,080 --> 00:14:05,490 беше за да почнат да се случуваат, како што додаде телефонски броеви и Чурлика и сите 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 Како да добиете на името, и куќата, и проект, 347 00:14:19,700 --> 00:14:21,640 и што друго е внатрешноста на студентите? 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 започнете да го користите работи како g rects и е ovals 358 00:14:46,130 --> 00:14:50,201 и други работи кои не се чини дека доаѓаат од недела нулта, еден, или два, 359 00:14:50,201 --> 00:14:52,950 сфатат дека тоа е затоа што на Стенфорд прогласена за некои нови типови на податоци. 360 00:14:52,950 --> 00:14:56,160 >> И навистина, тоа е токму она што ќе направи, како и, во P постави четири, кога 361 00:14:56,160 --> 00:14:59,880 ние почнуваме да се занимаваат со работи како слики, bitmaps, и многу повеќе. 362 00:14:59,880 --> 00:15:02,882 Па тоа е само навестување и ментална модел за она што е да дојде. 363 00:15:02,882 --> 00:15:04,590 Сега, јас одолговлекува малку ова утро. 364 00:15:04,590 --> 00:15:09,560 Бев вид на љубопитни да видиме што позадина Microsoft всушност 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 >> Значи се зборува сега за слики, ајде да се врати Daven тука 370 00:15:24,850 --> 00:15:26,890 на екранот и Никола, и само да ве потсетам 371 00:15:26,890 --> 00:15:30,540 дека ако би сакале да ни се придружат за ручек овој петок, од глава до нашите вообичаени рачно 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 Ова беше навидум точно имплементација на swap, 376 00:15:37,610 --> 00:15:40,460 при што земајќи две ints, еден вика, еден вика б, 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 така што можеме да го стави б во а во б без да се прави хаос на нештата. 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 >> Дејвид Џ MALAN: зазема повеќе простор, бидејќи јас сум со користење на променлива, 389 00:16:04,719 --> 00:16:05,400 и тоа е во ред. 390 00:16:05,400 --> 00:16:07,300 Тоа е вистина, но јас сум одам да се каже дека е во ред. 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 Дејвид Џ MALAN: Токму така. 395 00:16:13,571 --> 00:16:15,090 Тоа само свопови променливи на локално ниво. 396 00:16:15,090 --> 00:16:18,173 Бидејќи секој пат кога ќе се јавите на function-- кога имав коцки од Annenberg 397 00:16:18,173 --> 00:16:19,840 последен пат, ќе мора главните на дното. 398 00:16:19,840 --> 00:16:23,560 Штом ќе се јавите на функција наречена swap, swap не добие 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 Дејвид Џ MALAN: Значи копии од нив. 403 00:16:28,090 --> 00:16:31,120 Па тоа добива еден и два, ако потсетиме на пример од последниот пат, 404 00:16:31,120 --> 00:16:34,730 но копија од еден и два кои успешно се заменети. 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 дека или TFS и Ca имаат те водечки кон како што следи. 408 00:16:45,180 --> 00:16:51,210 >> Па нема трампа потсетиме изгледа like-- ајде отвори this-- изгледа вака. 409 00:16:51,210 --> 00:16:54,160 Ние се иницијализира х до еден, у две. 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 И јас може да се скрши на било кој линија број, еден, 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-- зошто е х нула? 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 Зошто е х нула во моментот? 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 Дејвид Џ MALAN: Токму така. 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 Дозволете ми да оди напред и да печати х. 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 >> Дејвид Џ MALAN: А малку погласно. 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 Дејвид Џ MALAN: Не баш консензус. 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 сакате да видите што се случува во внатрешноста на swap, што е команда? 473 00:19:05,110 --> 00:19:05,520 >> ПУБЛИКАТА: чекори. 474 00:19:05,520 --> 00:19:06,436 >> Дејвид Џ MALAN: чекори. 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, aka a. 484 00:19:27,130 --> 00:19:29,110 >> Сега, каде се нашите а и х доаѓаат од? 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 И тогаш, swap можеле да ги наречеме 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, Temp сега е еден и сега е еден. 492 00:19:50,660 --> 00:19:56,130 Но, ако го направам следниот и сега го прават печатење а, веќе се пресели во текот. 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 a е уште двајца, но б сега е еден. 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 е уште еден и y се уште две. 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 И наместо да пишувате оваа надвор, ќе почнеме да одиме низ кодот 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 Ова е копија два. 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 Ова е како недела Еден, недела две нешта во моментот. низа 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 >> Значи, ако с, првата низа, еднаква = 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 Дозволете ми да оди напред и да каже нешто : Daven и нешто: Роб. 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 >> Па ние имаме овие две линии на код, 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 и се вика ОК. 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 доби Zamyla или Габе или Daven. 578 00:23:11,360 --> 00:23:14,640 Значи, да го изберат првиот на оние, што беше Daven. 579 00:23:14,640 --> 00:23:19,174 Толку ефикасно, што GetString доби мене дека првиот случај беше Д-а-с-е-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 Дејвид Џ MALAN: Да, ликот / 0 или нула. 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 осум плус осум плус осум плус осум плус осум, 593 00:23:51,583 --> 00:23:53,320 само затоа што на бајти во ASCII. 594 00:23:53,320 --> 00:23:57,030 Како е грижам одиме да се вклопи Daven во кутивчето тука? 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 значи ништо друго од "ова е хексадецимален". 606 00:24:28,200 --> 00:24:31,030 и јас одам да се тврди дека "Д" завршува на Бајт Еден во меморијата. 607 00:24:31,030 --> 00:24:34,210 >> Добив ништо друго случува во меморија, па Daven го доби првиот спот 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 како вас, пред неколку години, би имаат имплементирано Ц себе. 620 00:24:54,960 --> 00:24:58,360 Што е GetString веројатно returning-- поради тоа 621 00:24:58,360 --> 00:25:00,946 се чувствува како тоа не е враќање Daven, само по себе, 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 >> Дејвид Џ MALAN: Локацијата на Daven. 627 00:25:10,540 --> 00:25:12,770 И тоа е тоа оттогаш недела Еден. 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 Daven живее на 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 Но, она што ова навестува сега е дека ако сите е има 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 Ако кажам, да ми стринг, дај ми Daven. 643 00:25:55,630 --> 00:25:57,230 Но ти навистина не ми даде Daven. 644 00:25:57,230 --> 00:25:59,310 Сите што ми го дадат адреса Daven е. 645 00:25:59,310 --> 00:26:04,310 Како да тогаш знам за сигурно каде Daven почнува и ends-- 646 00:26:04,310 --> 00:26:07,140 на приказната добивање weird-- каде Daven почнува и завршува, 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 >> Па, ако сте предавање ме почетокот на Daven, 650 00:26:13,620 --> 00:26:17,230 во суштина, како да знам каде што на крајот од неговото име е? 651 00:26:17,230 --> 00:26:20,550 Тој посебен null карактер, која е сега сите поважни 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 >> Дејвид Џ MALAN: Едноставно затоа што тие имаат различни адреси. 662 00:26:45,931 --> 00:26:48,820 Затоа што кога ќе се јавите GetString повторно, јас ќе се направи брзо тука, 663 00:26:48,820 --> 00:26:52,870 ако ова е втора линија, стринг т, како што го направив во таа програма, 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 Тоа нема да повторна употреба на истиот шест бајти секој време. 671 00:27:07,894 --> 00:27:09,810 Тоа се случува да добиете нова парче меморија, која 672 00:27:09,810 --> 00:27:12,780 значи т се случува да се некои други вредност овде. 673 00:27:12,780 --> 00:27:15,380 >> Па кога ќе го направите на еднаква = т, вие не сте споредување 674 00:27:15,380 --> 00:27:17,880 Д против овој и против ова и 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 Можете јасно не само да ги користите на еднаква = 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 >> ПУБЛИКАТА: Едноставно направете за телефонска линија [Беззвучен] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 Дејвид Џ MALAN: Совршена. 694 00:28:01,670 --> 00:28:02,900 ПУБЛИКАТА: [Беззвучен] 695 00:28:02,900 --> 00:28:03,310 Дејвид Џ MALAN: Да. 696 00:28:03,310 --> 00:28:05,390 Само користи за телефонска линија или додека јамка или whatever. 697 00:28:05,390 --> 00:28:08,710 Но само се однесуваат на основната идеја дека ако ова е парче на меморија или низа 698 00:28:08,710 --> 00:28:11,590 и ова е, iterate во текот на и двете во исто време. 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 затоа што еден стринг е подолго од другите. 703 00:28:18,080 --> 00:28:21,380 Значи сте ќе сакате да се провери за овој специјален вредност на крајот, нула. 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 Јас наместо случува да се каже, ако стрингот споредба на ОК запирка т е еднакво = 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 И мешајте се споредуваат, ако ги читаме неговите Човекот страница или документација или 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 Дејвид Џ MALAN: Да, поголема или помала од. 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 ќе прави доаѓа пред б, или не б доаѓаат пред азбучен ред. 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 Char *. 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 * е на адресата на знак. 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 Очигледно, char. 746 00:30:13,780 --> 00:30:16,410 >> Но, ние би можеле апсолутно имаат int * и други работи. 747 00:30:16,410 --> 00:30:20,790 Но, за сега, char * е навистина повеќето јасна и една од интерес. 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 Значи во оваа програма, копи-0, јас сум ќе одиме напред и повторно се јавите 752 00:30:31,140 --> 00:30:34,190 GetString и чување на вредноста во с. 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 Што значи т заградата 0 претставуваат лево. 776 00:31:32,480 --> 00:31:32,980 Да. 777 00:31:32,980 --> 00:31:34,339 >> ПУБЛИКАТА: Прво карактер на т? 778 00:31:34,339 --> 00:31:35,880 Дејвид Џ MALAN: Прво карактер на т. 779 00:31:35,880 --> 00:31:36,379 Тоа е тоа. 780 00:31:36,379 --> 00:31:40,024 Првиот карактер на T, сакам да му ја додели големи верзија 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 = е навистина прави? 791 00:32:09,040 --> 00:32:16,430 Ако имаме на левата рака страна тука низа t = s; 792 00:32:16,430 --> 00:32:19,400 што ми дава една кутија тука и една кутија тука. 793 00:32:19,400 --> 00:32:25,530 И претпоставувам оваа адреса е 0x, да речеме, 50 овој пат, произволно. 794 00:32:25,530 --> 00:32:28,847 Она што го прави низа т = s направи под хаубата? 795 00:32:28,847 --> 00:32:30,340 >> ПУБЛИКАТА: [Беззвучен] 796 00:32:30,340 --> 00:32:34,100 >> Дејвид Џ MALAN: Тоа продавници меморија решавање таму, па 0x50 оди таму. 797 00:32:34,100 --> 00:32:37,980 Значи, ако сега, одам до првата карактер во т и големи букви тоа, 798 00:32:37,980 --> 00:32:39,535 што сум ефективно прави да е? 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 >> И јас, на пример, Gabe во мали букви тука, вака. 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 И јас се рече т заграда 0 добива капитализирани. 806 00:33:01,980 --> 00:33:04,860 Па, т заградата 0 е на првата буква во т. 807 00:33:04,860 --> 00:33:07,840 Толку малку g се случува да се стане голем Г Но, проблемот 808 00:33:07,840 --> 00:33:09,410 е, она што не е, исто така укажуваат на? 809 00:33:09,410 --> 00:33:10,300 >> ПУБЛИКАТА: На истата. 810 00:33:10,300 --> 00:33:11,841 >> Дејвид Џ MALAN: Истото точната работа. 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 но ако проблемот е во тоа едноставно прави t = ОК само 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 >> Дејвид Џ MALAN: Да. 831 00:34:06,890 --> 00:34:08,390 Значи ние се случува да треба циклус повторно. 832 00:34:08,390 --> 00:34:11,800 И бидејќи ако сакаме да го копирате низа на во друга низа, 833 00:34:11,800 --> 00:34:14,120 веројатно сакате да го направи тоа карактер по карактер. 834 00:34:14,120 --> 00:34:17,199 Но, проблемот е, ако ова е првично с, 835 00:34:17,199 --> 00:34:22,159 сега ние треба да започне експлицитно доделување меморија за т. 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-a-b-е-/ 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 И на тоа, ние го нарекуваме овој 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 И тогаш, јас низа т. 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 Ако сакате да ја копирате на во т, што празно ние треба да го пополните тука? 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 Дејвид Џ MALAN: Да, ние треба да се пополни во празно. 862 00:35:21,380 --> 00:35:24,340 Не можам да го копирате и потоа капитализира име Габе на 863 00:35:24,340 --> 00:35:28,120 додека не побарате на оперативниот систем за друга парче на меморија 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 * т. 878 00:36:07,950 --> 00:36:13,280 Па на англиски јазик, да почнеме да се формулира соодветна казна во технички жаргон. 879 00:36:13,280 --> 00:36:19,757 Значи ова е доделување на променлива од типот char * наречен т. 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 Адреса на знак. 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 Прво, има Примерок, која очигледно е нашиот нов пријател, 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 >> 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 Дејвид Џ MALAN: Само бројот на карактери во с. 899 00:36:56,710 --> 00:36:59,040 Па должината на коментарите, оригиналниот стринг. 900 00:36:59,040 --> 00:37:00,350 Па G-a-b-e. 901 00:37:00,350 --> 00:37:02,320 Така што е веројатно четири во овој случај. 902 00:37:02,320 --> 00:37:05,485 Зошто правам 1 по повикувајќи strlen на ОК? 903 00:37:05,485 --> 00:37:06,360 ПУБЛИКАТА: [Беззвучен] 904 00:37:06,360 --> 00:37:07,590 Дејвид Џ MALAN: За што специјални null карактер. 905 00:37:07,590 --> 00:37:11,260 Ако мене ме прашувате што е должината на Име Габе, јас идам да се каже четири. 906 00:37:11,260 --> 00:37:14,480 Под капакот на моторот, иако, јас треба дека петтиот бајт за нула карактер. 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 она што е големината на знак на овој компјутер? 913 00:37:32,870 --> 00:37:37,400 >> И со множење пет во оваа пример, со големина на знак, кој 914 00:37:37,400 --> 00:37:40,440 на повеќето компјутери ќе само да биде еден, Примерок 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 Дејвид Џ MALAN: Адресата на што? 921 00:37:53,709 --> 00:37:55,250 ПУБЛИКАТА: Од меморијата тоа распределени? 922 00:37:55,250 --> 00:37:56,450 Дејвид Џ MALAN: Од меморија тоа распределени. 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 >> Ајде само оди, се создаде за телефонска линија, и направи т заградата јас добива на заградата јас. 936 00:38:36,870 --> 00:38:39,760 Бидејќи сега јас да го користите оваа низа како нотација, 937 00:38:39,760 --> 00:38:43,390 бидејќи иако Примерок многу генерички ме издвојува меморија, 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 >> ПУБЛИКАТА: Зошто ни се провери за т еднаков на нула? 956 00:39:28,530 --> 00:39:30,740 >> Дејвид Џ MALAN: Зошто ни проверете за т еднаков на нула? 957 00:39:30,740 --> 00:39:33,250 Ако го читаме documentation-- голема question-- за Примерок, 958 00:39:33,250 --> 00:39:37,020 тоа се случува да се каже во ликовната печати, понекогаш Примерок може да се врати нула, 959 00:39:37,020 --> 00:39:38,080 исто како GetString. 960 00:39:38,080 --> 00:39:41,820 И навистина, GetString враќа NULL ако, пак, Примерок враќа нула, 961 00:39:41,820 --> 00:39:43,130 бидејќи GetString користи Примерок. 962 00:39:43,130 --> 00:39:46,400 >> И дека може да се случи ако на оперативниот систем, 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 Но, дозволете ми да се повлечат до исто за телефонска линија за копирање, 968 00:39:59,770 --> 00:40:05,480 кој пред една момент, да се потсетиме беше ова. т заградата јас добива на заградата јас. 969 00:40:05,480 --> 00:40:06,740 >> Убаво и пријателски за корисниците. 970 00:40:06,740 --> 00:40:09,330 Се чувствува како недела Две повторно. 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 >> Сега annoyingly, на автори на 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 тоа ќе ги содржи на адресата на знак. " 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 тоа е сега се нарекува dereference оператор. 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 Значи она што е т, да биде јасно? 987 00:40:59,100 --> 00:41:03,250 т е адресата на парче меморија која беше дадена назад кон мене. 988 00:41:03,250 --> 00:41:06,650 е адресата на она што, да биде јасно, во примерот ние сме во дискутирање, 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 е на адреса 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 Дејвид Џ MALAN: Се оригинално име Габе е. 995 00:41:14,126 --> 00:41:16,660 Така што е на адреса на ова парче на меморија. 996 00:41:16,660 --> 00:41:22,220 Значи, ако јас кажам Т + 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 Па тоа ќе биде нула, тогаш, потоа две, а потоа три, а потоа четири. 1000 00:41:30,367 --> 00:41:33,200 Значи, да се соберат овие нови Нула-како загатка парчиња, ако сакате, 1001 00:41:33,200 --> 00:41:36,140 иако, повторно, синтаксата е далеку повеќе arcane од гребење. 1002 00:41:36,140 --> 00:41:39,522 Па т е адресата + јас се случува да ми даде 1003 00:41:39,522 --> 00:41:42,480 голем број, бидејќи тие се сите броеви кои ние сме биле цртеж како хексадецимален. 1004 00:41:42,480 --> 00:41:43,560 Но тие се само бројки. 1005 00:41:43,560 --> 00:41:49,960 >> Па ако адресата на т рековме беше 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 >> Дејвид Џ MALAN: Сепак 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 А сега на десната страна на овој израз, *, а потоа во parens, 1013 00:42:06,930 --> 00:42:11,586 s + i значи s, кое е решавање тука на малку g. 1014 00:42:11,586 --> 00:42:16,220 S + 0 е, се разбира, е, без разлика е. 1015 00:42:16,220 --> 00:42:21,230 >> Па сега, тоа е * s, што исто како * 33 Оксфорд Стрит значи одат на адресата 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 Она на десната страна, која е Габе, малку е тука, во тука. 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 И навистина, ајде да погледнеме една конечна програма тука, 1027 00:42:53,550 --> 00:42:57,480 и тогаш вети claymation, кој ќе направи сè што е во ред. 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 За прв пат објави две променливи, 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 = Примерок (sizeof (int)), ова е фенси начин да се каже, 1048 00:43:44,920 --> 00:43:49,000 еј оперативен систем, преку Примерок, ми даде доволно меморија за големината 1049 00:43:49,000 --> 00:43:52,370 на int, што е веројатно ќе биде 32 бита или четири бајти. 1050 00:43:52,370 --> 00:43:53,680 >> Значи она што не Примерок врати? 1051 00:43:53,680 --> 00:43:55,250 Примерок враќа адреса. 1052 00:43:55,250 --> 00:43:57,020 Значи она што се случува да се чуваат во X? 1053 00:43:57,020 --> 00:44:00,600 Адреса на парче меморија, четири бајти, што Примерок 1054 00:44:00,600 --> 00:44:03,360 само се најде за мене со поставување оперативниот систем. 1055 00:44:03,360 --> 00:44:08,240 >> Сега меѓувреме, линија четири тука, * 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 >> Дејвид Џ MALAN: Оди на таа адреса. 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 Дејвид Џ MALAN: 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 Дејвид Џ MALAN: Не Нема меморија за 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 >> Дејвид Џ MALAN: Некои ѓубре вредност. 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 >> Кој е да се каже, ако оставам тука во три минути 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, 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 >> Еј, 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 Овој код доделува две покажувачи, кои можат да укажуваат на цели броеви. 1108 00:45:57,930 --> 00:45:58,430 -OK. 1109 00:45:58,430 --> 00:46:02,140 Па, јас се видат двете насоки, но тие не се чини дека се покажува кон ништо. 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 Работите што се укаже се нарекуваат pointees, и поставување на нив за 1113 00:46:08,030 --> 00:46:09,370 посебен чекор. 1114 00:46:09,370 --> 00:46:10,220 >> О, во ред, во ред. 1115 00:46:10,220 --> 00:46:10,950 Го знаев тоа. 1116 00:46:10,950 --> 00:46:12,385 На pointees се одвоени. 1117 00:46:12,385 --> 00:46:14,315 Er, па како да ги распредели pointee? 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 Па, овој код доделува нова цел број pointee, 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 >> Еј, кој изгледа подобро. 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 Јас ќе dereference на покажувачот на X да ја чување на број 42 во својата pointee. 1127 00:46:30,455 --> 00:46:32,830 За овој трик, ќе ми треба мојот Магично стапче на Dereferencing. 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> Ваше магично стапче на Dereferencing? 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 >> Еј, погледнете. 1136 00:46:44,700 --> 00:46:46,140 Таму оди. 1137 00:46:46,140 --> 00:46:50,980 >> -Па Прави dereference на X следува на стрелката за да пристапите до своите pointee. 1138 00:46:50,980 --> 00:46:53,160 Во овој случај, во продавница 42 во таму. 1139 00:46:53,160 --> 00:46:57,710 Еј обиде да го користи за чување на број 13 преку други покажувач, y. 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 А потоа, да ги преземе Стап на Dereferencing и само [ЏАГОРНИ] 1143 00:47:07,930 --> 00:47:08,960 >> -OH! 1144 00:47:08,960 --> 00:47:09,500 >> О, еј! 1145 00:47:09,500 --> 00:47:11,090 Тоа не се работи. 1146 00:47:11,090 --> 00:47:15,630 Велат, Binky, јас не мислам дека dereferencing y е добра идеја, бидејќи знаете, 1147 00:47:15,630 --> 00:47:17,850 поставување на pointee е посебен чекор. 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 -Да. 1151 00:47:21,980 --> 00:47:25,680 Ние распределени покажувачот y, но ние никогаш не го постави за да се укаже на pointee. 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 Еј, ти си изгледа добро таму, Binky. 1155 00:47:30,240 --> 00:47:33,400 Може да ви го поправам така што y поени на истиот pointee како x? 1156 00:47:33,400 --> 00:47:34,000 >> Секако. 1157 00:47:34,000 --> 00:47:36,780 Ќе го користам мојот магично стапче на покажувачот Доделување. 1158 00:47:36,780 --> 00:47:38,740 >> -Дали Дека ќе биде проблем како и пред тоа? 1159 00:47:38,740 --> 00:47:39,240 Не. 1160 00:47:39,240 --> 00:47:40,660 Ова не допре pointees. 1161 00:47:40,660 --> 00:47:44,450 Тоа само се менува за еден покажувач на укажуваат на истото како друг. 1162 00:47:44,450 --> 00:47:45,450 >> О, јас го гледам. 1163 00:47:45,450 --> 00:47:48,200 Сега 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 Таа има pointee. 1167 00:47:51,120 --> 00:47:54,510 Па можете да се обидете Стап на Dereferencing повторно да се испрати на 13 завршена. 1168 00:47:54,510 --> 00:47:56,510 >> -Uh, ОК. 1169 00:47:56,510 --> 00:47:58,160 Тука оди. [POP] 1170 00:47:58,160 --> 00:47:59,340 >> Еј, погледнете во тоа. 1171 00:47:59,340 --> 00:48:00,750 Сега dereferencing работи на y. 1172 00:48:00,750 --> 00:48:04,991 И затоа што се делат совети дека еден pointee, тие и двете се види 13. 1173 00:48:04,991 --> 00:48:05,490 -Да. 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 >> -Едноставно се сеќавам на три правила покажувач. 1180 00:48:13,530 --> 00:48:16,560 Број еден, основната структура е дека имате покажувач, 1181 00:48:16,560 --> 00:48:18,680 и тоа укажува текот на pointee. 1182 00:48:18,680 --> 00:48:20,640 Но на покажувачот и pointee се одвоени, 1183 00:48:20,640 --> 00:48:22,610 и честа грешка е да се постави покажувач, 1184 00:48:22,610 --> 00:48:25,000 но да се заборави да го даде pointee. 1185 00:48:25,000 --> 00:48:28,170 >> Број два, покажувачот dereferencing започнува на покажувачот 1186 00:48:28,170 --> 00:48:31,050 и го следи нејзиното стрелка над пристап до своите pointee. 1187 00:48:31,050 --> 00:48:33,400 Како што сите знаеме, ова работи само ако постои 1188 00:48:33,400 --> 00:48:36,270 на pointee, кој вид на се врати на Правило број еден. 1189 00:48:36,270 --> 00:48:39,000 >> , Број Три покажувачот задача трае еден покажувач 1190 00:48:39,000 --> 00:48:42,320 и таа се менува да се укаже на исто pointee како уште еден покажувач. 1191 00:48:42,320 --> 00:48:44,160 Па по задача, двете насоки 1192 00:48:44,160 --> 00:48:45,910 ќе укажуваат на исти pointee. 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 видео репродукција] 1197 00:48:51,110 --> 00:48:52,568 Дејвид Џ MALAN: Тоа е тоа за CS50. 1198 00:48:52,568 --> 00:48:55,110 Ние ќе се видиме следната недела. 1199 00:48:55,110 --> 00:48:56,064