1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Недеља 4, наставак] 2 00:00:02,310 --> 00:00:04,240 [Давид Ј. Малан - Универзитет Харвард] 3 00:00:04,240 --> 00:00:07,290 [Ово је ЦС50. - ЦС50.ТВ] 4 00:00:07,290 --> 00:00:11,290 >> Ово је ЦС50, и то је крај недеље 4. 5 00:00:11,290 --> 00:00:14,030 Дакле, неке добре вести и неке лоше вести. 6 00:00:14,030 --> 00:00:26,240 Не предавање у понедељак, није проблем поставити следеће недеље. [Студенти навијали] 7 00:00:26,240 --> 00:00:28,680 Нећеш да воле где ово иде. 8 00:00:28,680 --> 00:00:31,590 Али ми немамо ово уместо следеће среде, 9 00:00:31,590 --> 00:00:37,740 а ту је и наставни план и програм по 1 Петак предавању следећег петка, тако да можемо остати на правом путу. 10 00:00:37,740 --> 00:00:40,580 Али све ће бити снимљен као и обично, тако да се не бринем. 11 00:00:40,580 --> 00:00:44,100 >> А у вези са квизом 0 шта ћемо урадити према краја недеље 12 00:00:44,100 --> 00:00:47,140 је пост на почетну цс50.нет је курс за разјашњење 13 00:00:47,140 --> 00:00:50,160 о каквим очекивањима требало би да имате када је у питању први квизу. 14 00:00:50,160 --> 00:00:55,100 У принципу, то ће бити више избора, истина-нетачно, кратак одговор, кратке кодирања проблеми. 15 00:00:55,100 --> 00:00:57,360 Нећеш да се очекује да спроведе еквивалент 16 00:00:57,360 --> 00:01:00,030 проблема који би сте видели на псет, за које имате рачунар 17 00:01:00,030 --> 00:01:03,240 и дебагер и слично, али ће бити мали кодирање проблема. 18 00:01:03,240 --> 00:01:06,900 >> И заиста, најбољи водич да добијете осећај шта ЦС50 тестови су као 19 00:01:06,900 --> 00:01:09,180 се иде у цс50.нет, идите на квизове линка, 20 00:01:09,180 --> 00:01:11,920 и можете видети у протеклих неколико година у вредности од квизова. 21 00:01:11,920 --> 00:01:16,600 Само схватите да наставни план и програм није увек била иста током година. 22 00:01:16,600 --> 00:01:18,510 Понекад смо додали, понекад одузимају, 23 00:01:18,510 --> 00:01:20,670 па ако видите неку тему на један од оних старих тестови 24 00:01:20,670 --> 00:01:25,380 да немаш појма шта је то причао, то је или да ми је то покрити 25 00:01:25,380 --> 00:01:27,210 или да нисмо то покрити. 26 00:01:27,210 --> 00:01:31,110 Али форма коментара, ово Недеља, понедељак, уторак и 27 00:01:31,110 --> 00:01:34,770 као и курс се широм седнице у недељу увече - 28 00:01:34,770 --> 00:01:37,500 Време и место да се објави на почетној страници се курс је - 29 00:01:37,500 --> 00:01:40,120 сви ви имате прилику да погледате са наставним се курс је стипендиста 30 00:01:40,120 --> 00:01:44,830 материјал за ову годину, како у делу и као потпуно класе, 31 00:01:44,830 --> 00:01:48,400 и они ће бити снимљен по обичају као добро. 32 00:01:48,400 --> 00:01:53,380 >> У реду. Дакле, без даљег одлагања, један коментар о пролазу / неуспех и адд / дроп. 33 00:01:53,380 --> 00:01:57,980 Можда сте видели моје белешке синоћ, и то је заиста само неки додатни уверавање 34 00:01:57,980 --> 00:02:01,250 да, ако сте међу онима нарочито мање удобна, или негде између 35 00:02:01,250 --> 00:02:04,870 и осећате само мало у преко главе, 36 00:02:04,870 --> 00:02:08,430 схватите да је заиста сасвим нормално, и нема довољно подршке структура у месту, 37 00:02:08,430 --> 00:02:13,530 од којих је један радно време биле намере о побољшању све више по мом емаил прошле ноћи, 38 00:02:13,530 --> 00:02:16,520 и схватите да превише опција као прошао / није прошао за час овако 39 00:02:16,520 --> 00:02:21,540 Заиста је замишљена као механизам да преузме предност искључивање курса овако, 40 00:02:21,540 --> 00:02:24,200 тако да опет ако трошите те 10, 15, 20 сати 41 00:02:24,200 --> 00:02:28,160 Само покушавам да донесем псет да раде, а ви знате да сте тамо 90-95% од начина 42 00:02:28,160 --> 00:02:32,100 али не можете да пронађете неку проклету грешку, у пролазу / не модел који је некако у реду. 43 00:02:32,100 --> 00:02:36,230 >> Идеја је да са тог механизма онда можете ићи фокус на другим псетс 44 00:02:36,230 --> 00:02:39,530 или спава, или шта год да је то што желите да се фокусирате на. 45 00:02:39,530 --> 00:02:43,390 Дакле, схватите да имате до овог наредном уторка - технички 5. понедељак, 46 00:02:43,390 --> 00:02:50,840 али то је празник, тако да ово долази Уторак - да бисте се пребацили из пролаза / не оцењен, или обрнуто. 47 00:02:50,840 --> 00:02:54,450 А ако си стварно на литици и размишљате падају потпуно, 48 00:02:54,450 --> 00:02:56,440 молим ухвати ме после предавања или дроп ме белешку. 49 00:02:56,440 --> 00:02:59,990 Ми бисмо волели да најмање разговор пре него што понудите адио. 50 00:02:59,990 --> 00:03:03,470 У реду. Тако смо почели да се обуку точковима искључен последњи пут. 51 00:03:03,470 --> 00:03:06,030 Конкретно, ми смо фокусирани на ниске. 52 00:03:06,030 --> 00:03:09,740 Стринг је нешто што је изјавио у ЦС50 библиотеци, 53 00:03:09,740 --> 00:03:14,340 конкретно у том фајлу под називом цс50.х што ћемо почети да погледате ове недеље и следећег. 54 00:03:14,340 --> 00:03:17,250 Али стринг је заиста само поједностављење нешто 55 00:03:17,250 --> 00:03:20,980 То је мало више арцанели описати као цхар *. 56 00:03:20,980 --> 00:03:24,090 Знак да смо упознати са. То је само један лик. 57 00:03:24,090 --> 00:03:28,010 Али * од понедељка означава шта? >> [Ученик] показивач. 58 00:03:28,010 --> 00:03:31,290 Показивач. А шта је показивач? >> [Ученик] адреса. 59 00:03:31,290 --> 00:03:33,420 >> То је као адресу, локацију у меморији. 60 00:03:33,420 --> 00:03:35,910 Шта је адреса или локација или сећање? 61 00:03:35,910 --> 00:03:40,290 Опет, сви ми имамо лаптоп са концерта или 2 гигабајта меморије највероватније ових дана, 62 00:03:40,290 --> 00:03:44,160 а то значи да имате милијарде или 2 милијарде бајтова вредне памћења. 63 00:03:44,160 --> 00:03:46,240 И није битно шта је то физички изгледа, 64 00:03:46,240 --> 00:03:51,220 али будите на вери да можете пребројати све појединачне бајтова који свој лаптоп има - 65 00:03:51,220 --> 00:03:54,580 ово је бајт 0, ово је бајт 1, ово је бајт 2 милијарде - 66 00:03:54,580 --> 00:03:56,100 и то је управо оно што рачунар ради. 67 00:03:56,100 --> 00:04:00,030 Када доделити простор једне карактера, на пример, 68 00:04:00,030 --> 00:04:02,480 очигледно је да негде живи у меморији рачунара, 69 00:04:02,480 --> 00:04:05,860 а можда је у бите број 12345, 70 00:04:05,860 --> 00:04:08,470 а то је негде овде у меморији рачунара. 71 00:04:08,470 --> 00:04:12,630 А онда адресу тог лика је 12345. 72 00:04:12,630 --> 00:04:16,140 >> Сада, у недељу 0 до сада тако далеке, нисмо баш брига 73 00:04:16,140 --> 00:04:19,170 где у меморији ствари се чувају, јер ми обично користе симболе, 74 00:04:19,170 --> 00:04:22,540 променљиве, и низови да заиста добити на нашим подацима. 75 00:04:22,540 --> 00:04:24,950 Али, као и све од понедељка више данас, сада ћемо имати 76 00:04:24,950 --> 00:04:27,710 све израженије могућности са писањем програма 77 00:04:27,710 --> 00:04:31,330 да стварно манипулише меморију рачунара, међутим видите стане, 78 00:04:31,330 --> 00:04:33,720 за обе добре и лоше сврхе, 79 00:04:33,720 --> 00:04:39,620 бубе као веома чест резултат у овом тренутку у учењу ове ствари. 80 00:04:39,620 --> 00:04:42,460 Али шта то заиста значи бити цхар *? 81 00:04:42,460 --> 00:04:46,140 Идемо напред назад - и ми ћемо се вратити на Бинки као што је обећано данас. 82 00:04:46,140 --> 00:04:48,670 Идемо на једноставан пример овде. 83 00:04:48,670 --> 00:04:53,060 Дозволите ми да сачувате ову слику као цомпаре.ц, и дозволите ми само да се овде мало код шаблона 84 00:04:53,060 --> 00:05:00,490 тако укључују стдио.х, дозволите ми да предам укључују цс50.х. Ја ћу увећали тамо. 85 00:05:00,490 --> 00:05:05,850 Дозволите ми да почнем да пишем главни инт, маин (), а сада желим да урадим нешто овако: 86 00:05:05,850 --> 00:05:13,520 принтф ("Дај ми низ:"), а онда ћу користити стринг с добија ГетСтринг 87 00:05:13,520 --> 00:05:16,750 да би добили низ од корисника, а онда ћу да питам корисника за другу. 88 00:05:16,750 --> 00:05:21,870 ("Дај ми још једну ниску:"), а ја ћу их питати преко ГетСтринг да се тога. 89 00:05:21,870 --> 00:05:27,020 Ја ћу га звати т т јер долази после с и с је лепо име за ниску ако је прилично општи. 90 00:05:27,020 --> 00:05:30,030 Дакле ГетСтринг, а сада само желим да урадим проверу разум и ја ћу да кажем 91 00:05:30,030 --> 00:05:39,770 иф (а == т), онда ћу само да кажем кориснику принтф ("Ти откуцао исту ствар \ н"); 92 00:05:39,770 --> 00:05:45,520 друго ћу да одштампате нешто попут ("сте уписали нешто другачије \ н!") 93 00:05:45,520 --> 00:05:48,460 или шта год казна ће бити. Тако нешто. 94 00:05:48,460 --> 00:05:52,200 Тада, као и обично, ја ћу вратити 0 само што је значило да се ништа лоше десило, 95 00:05:52,200 --> 00:05:54,400 и ја ћу ићи напред и компајлирати и покренути овај програм. 96 00:05:54,400 --> 00:05:56,540 >> Међутим, у понедељак смо трчали овај програм, 97 00:05:56,540 --> 00:06:00,420 и заправо је речено да ЗДРАВО није здраво и пријатно није збогом. 98 00:06:00,420 --> 00:06:03,140 Понашање смо видели била је мало више овако. 99 00:06:03,140 --> 00:06:11,450 Пусти ме да идем у мој изворни директоријум, зум овде, и хајде да правимо поређење. 100 00:06:11,450 --> 00:06:14,570 Приредила реду. Дозволите ми да покренете поредити. Дај ми ниску: ЗДРАВО. 101 00:06:14,570 --> 00:06:16,300 Дајте ми још једну ниску: ЗДРАВО. 102 00:06:16,300 --> 00:06:18,000 Откуца нешто другачије! 103 00:06:18,000 --> 00:06:22,650 Па, дозволите ми да покушам нешто једноставније попут 50, 50 година. Откуца нешто другачије! 104 00:06:22,650 --> 00:06:25,740 здраво, здраво. Па јасно, нешто се дешава овде. 105 00:06:25,740 --> 00:06:28,440 Али, оно што је било објашњење зашто? 106 00:06:28,440 --> 00:06:33,850 Очигледно, линија 12 је потпуно нефункционалан. 107 00:06:34,300 --> 00:06:39,430 Шта је основни проблем овде? Да. >> [Ученик] То је у односу на адресе. 108 00:06:39,430 --> 00:06:41,850 Да, баш тако. То је заправо у односу адресе 109 00:06:41,850 --> 00:06:44,580 у којој ЗДРАВО ЗДРАВО и чувају. 110 00:06:44,580 --> 00:06:48,290 Није упоређивањем писма ЗДРАВО поново и поново, 111 00:06:48,290 --> 00:06:52,370 јер оно што се стварно догодило, све ово време смо користили ГетСтринг - 112 00:06:52,370 --> 00:06:56,130 Ова табла је поново наш рачунар меморија, 113 00:06:56,130 --> 00:07:00,100 и рецимо зовем ГетСтринг након проглашења променљиве с. 114 00:07:00,100 --> 00:07:01,930 Шта моје сећање изгледа? 115 00:07:01,930 --> 00:07:07,070 Хајде да кажемо да произвољно а изгледа овако. То је квадрат. 116 00:07:07,070 --> 00:07:09,040 И прилично сваки пут сам извући комад меморије на екрану 117 00:07:09,040 --> 00:07:12,860 ако је 32 бита сам цртање квадрата овако, јер заиста у апарату, 118 00:07:12,860 --> 00:07:17,380 показивач, адреса, је 32 бита. То је исто као инт. 119 00:07:17,380 --> 00:07:19,420 То може да варира у зависности од рачунарског система. 120 00:07:19,420 --> 00:07:24,630 Они од вас који су слабо упознати са чињеницом да је ваш Мац или ПЦ је 64 бита, 121 00:07:24,630 --> 00:07:28,120 да заправо означава да је ваш рачунар користи 64-битне показиваче, 122 00:07:28,120 --> 00:07:33,730 64-битне адресе, и међу упсидес из које је ваше рачунаре 123 00:07:33,730 --> 00:07:35,560 може имати много више РАМ него прошла. 124 00:07:35,560 --> 00:07:39,240 Да скратимо причу, назад у дану када су компјутери користе само 32 бита 125 00:07:39,240 --> 00:07:42,740 да представљају адресе, највећи број бајтова сте могли представљати 126 00:07:42,740 --> 00:07:46,280 у том случају био, шта ако имате 32 бита? 127 00:07:46,280 --> 00:07:49,590 Дакле 4 милијарде евра, у реду, јер је 2 до 32 је 4 милијарде. 128 00:07:49,590 --> 00:07:51,370 Овај број је понављају током. 129 00:07:51,370 --> 00:07:55,240 >> Дакле, ако имате само 32 бита, највећи број можете рачунати да је отприлике 4 милијарде. 130 00:07:55,240 --> 00:07:58,750 Али то је био основни ограничење рачунара до пре неколико година, 131 00:07:58,750 --> 00:08:01,180 јер ако можете само рачунати као висок као 4 милијарде евра, 132 00:08:01,180 --> 00:08:05,270 није битно ако купите 8 гигабајта меморије, или чак 5 гигабајта РАМ-а; 133 00:08:05,270 --> 00:08:07,780 Ви не можете рачунати да је висока, тако да је било бескорисно. 134 00:08:07,780 --> 00:08:11,430 Можете само да приступите прва 3 или 4 гигабајта меморије рачунара. 135 00:08:11,430 --> 00:08:14,410 То је мањи проблем сада, и можете купити МацБоок Про и Делс 136 00:08:14,410 --> 00:08:17,680 са 8 гигабајта РАМ меморије, или чак и више ових дана. 137 00:08:17,680 --> 00:08:24,100 Али, ако сам издвојити једноставно у овом програму показивач, показивач се зове ова, 138 00:08:24,100 --> 00:08:28,370 она може да изгледа овако на екрану, јер заиста морамо да одлепите овом слоју. 139 00:08:28,370 --> 00:08:33,520 Стално каже жицу, али од понедељка, стринг је заправо знак * 140 00:08:33,520 --> 00:08:35,590 адресу неког карактера. 141 00:08:35,590 --> 00:08:39,280 Па хајде да скинемо тај волан тренинг иако ћемо наставити да користи ГетСтринг за сада. 142 00:08:39,280 --> 00:08:42,600 Тако сам прогласио с, а то је комад меморије, 32 бита. 143 00:08:42,600 --> 00:08:47,370 Шта је овде у меморији по дефаулту? >> [Нечујан ученик одговор] 144 00:08:47,370 --> 00:08:50,040 Шта је то? >> [Ученик] Смеће. >> Смеће. Управо тако. 145 00:08:50,040 --> 00:08:54,610 Ако сте програмер не стављају вредност у променљивој, ко зна шта је то? 146 00:08:54,610 --> 00:08:57,990 Понекад ћете имати среће и то је 0, што је нека врста леп, чист подразумевану вредност, 147 00:08:57,990 --> 00:09:00,310 али као што смо видели понедељак, понекад је потпуна бесмислица, 148 00:09:00,310 --> 00:09:04,130 неки заиста велики позитиван или негативан број који је дошао одакле? 149 00:09:05,350 --> 00:09:07,010 Да. >> [Ученик] Функција раније. >> Да. 150 00:09:07,010 --> 00:09:10,170 >> Често функција који је добио назвао раније, јер се, 151 00:09:10,170 --> 00:09:13,920 како ви називате функције у меморији, они заузимају више простора и више од дна нагоре, 152 00:09:13,920 --> 00:09:17,040 и чим функција враћа, да меморија поново користи добија 153 00:09:17,040 --> 00:09:20,890 до следећег човека који бива позван, ко користећи свој исти комад меморије. 154 00:09:20,890 --> 00:09:23,450 И ако сам оставио смеће тамо, претходне вредности, 155 00:09:23,450 --> 00:09:28,190 можемо погрешити с као да неку вредност када се заиста нисмо ставили тамо нешто. 156 00:09:28,190 --> 00:09:30,960 Дакле, наша РАМ у овом тренутку изгледа овако. 157 00:09:30,960 --> 00:09:36,030 Сада на десној страни линије 7 зовемо ГетСтринг, 158 00:09:36,030 --> 00:09:40,150 што смо сада радили недељама, али оно што је заиста ГетСтринг ради? 159 00:09:40,150 --> 00:09:43,350 ГетСтринг написао ЦС50 особља је мало интелигентан 160 00:09:43,350 --> 00:09:46,500 у томе чим корисник почне куцање тастери и хитова Ентер, 161 00:09:46,500 --> 00:09:50,010 ГетСтринг фигуре оут колико откуцамо урадили корисник хит, 162 00:09:50,010 --> 00:09:53,360 колико карактера морам да издвоји РАМ за. 163 00:09:53,360 --> 00:09:55,660 А где је тај РАМ долази, ко зна? 164 00:09:55,660 --> 00:09:58,930 То је негде у 2 вашег рачунара гигабајта или ситница меморије. 165 00:09:58,930 --> 00:10:05,200 Али, хајде да претпоставимо да је компјутер нашао простор за реч ЗДРАВО овде. 166 00:10:05,200 --> 00:10:08,710 Реч сам откуцао је Х-Е-Л-Л-О. 167 00:10:08,710 --> 00:10:13,510 И ако скрећемо ово као низ знакова, можда ћемо га извући овако. 168 00:10:13,510 --> 00:10:17,860 Али морам да урадим 1 додатни ствар. Оно припада на крају сваког низа у Ц? 169 00:10:17,860 --> 00:10:20,710 Поништеног лик који пишемо као \ 0. 170 00:10:20,710 --> 00:10:23,980 То технички је број 0, али инверзно чини све јасније 171 00:10:23,980 --> 00:10:28,150 да је ово буквално број 0, цео 0; 172 00:10:28,150 --> 00:10:32,440 није, на пример, цитирам-завршити цитат 0 да би сте укуцате на тастатури. 173 00:10:32,440 --> 00:10:33,940 Дакле, ово је ЗДРАВО. 174 00:10:33,940 --> 00:10:36,350 >> А шта смо рекли у понедељак да функционишу као ГетСтринг 175 00:10:36,350 --> 00:10:39,580 заправо враћа све ове недеље? 176 00:10:39,580 --> 00:10:43,960 Није се враћа стринг по себи, јер то заиста не значи да 177 00:10:43,960 --> 00:10:47,710 јер жице не постоје. Они су нека врста справљања у ЦС50 библиотеци. 178 00:10:47,710 --> 00:10:51,300 Оно што је заиста ниска, више технички? >> [Ученик] То је први знак. 179 00:10:51,300 --> 00:10:55,950 Управо тако. То је прилично једноставно адреса првог карактера који корисник унесе 180 00:10:55,950 --> 00:11:02,810 Дакле, ако моја реч ЗДРАВО га завршава на бајтова број 123, а затим у бите броја 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, и тако даље, ако сам само број моје бајтове од 0 горе, 182 00:11:08,320 --> 00:11:12,650 оно што је заиста ГетСтринг враћа буквално број 123. 183 00:11:12,650 --> 00:11:19,270 Дакле, оно што се стави у с је број 123, а не слово Х, а не реч ЗДРАВО, 184 00:11:19,270 --> 00:11:23,130 једноставно је адреса на којој могу пронаћи прво слово ЗДРАВО. 185 00:11:23,130 --> 00:11:26,500 Али то не изгледа као довољно. Ја сам вас питао за серију, а не карактер. 186 00:11:26,500 --> 00:11:32,970 Па како ћемо или рачунар зна да Елло врста долазе заједно са Х? 187 00:11:35,760 --> 00:11:37,460 Шта је врста споразума имамо? Да. 188 00:11:37,460 --> 00:11:40,100 [Ученик] То говори чува се наћи још неке знакове. >> Тачно. 189 00:11:40,100 --> 00:11:44,570 >> Постоји тај људски компјутер конвенција којом када се баве жице, 190 00:11:44,570 --> 00:11:49,410 иначе познатом као знак звезда, једноставно морате да схватите 191 00:11:49,410 --> 00:11:54,350 где је сваки крај стринга у животу је тако заиста само итератинг преко њега са фор петљи, 192 00:11:54,350 --> 00:11:57,820 вхиле петље, шта год, тако да када вам је крај стринга 193 00:11:57,820 --> 00:12:02,160 Сада можете закључити из тога, ох, цела реч је ЗДРАВО. 194 00:12:02,160 --> 00:12:04,820 Они од вас са претходног програмирања искуством можда знате у Јави 195 00:12:04,820 --> 00:12:09,880 само може назвати дужина и на другим језицима можете позвати дужину или слично.. 196 00:12:09,880 --> 00:12:14,060 То је зато што у многим језицима, посебно ствари назива објектно-оријентисани језици, 197 00:12:14,060 --> 00:12:18,580 дужина нечега је врста зачаурен унутрашњости комад података самих, 198 00:12:18,580 --> 00:12:24,000 Као што смо много капсулиране личних карата и имена и кућа унутар студента у понедељак. 199 00:12:24,000 --> 00:12:28,700 Али, Ц је много нижи ниво. Нема објеката или одељења, да ли сте чули те термине пре. 200 00:12:28,700 --> 00:12:31,490 Све што треба је стварно меморијске адресе. 201 00:12:31,490 --> 00:12:35,540 Значи, ово је нека врста старински начин представљања занимљивих података структуре. 202 00:12:35,540 --> 00:12:38,760 Имате почетну вредност као на адресу првог знака 203 00:12:38,760 --> 00:12:42,340 и онда само неке произвољне конвенције које се сви слажу да прате. 204 00:12:42,340 --> 00:12:46,420 Дакле, како се жица дужине спроводи, зар предлажемо? 205 00:12:46,420 --> 00:12:51,360 Стрлен, стрлен, што су неки од вас су сада користи неколико пута. То је прилично једноставно, зар не? 206 00:12:51,360 --> 00:12:53,060 То је као 2 линије кода. 207 00:12:53,060 --> 00:12:56,140 То је прилично много за петља неке врсте, можда са додатним локалним променљиве. 208 00:12:56,140 --> 00:13:00,540 Али стрлен има само да се показивач и онда почнете да тражите \ 0. 209 00:13:00,540 --> 00:13:05,190 >> И чим га нађе, може да врати укупан број корака које је предузела је у том низу. 210 00:13:05,190 --> 00:13:07,150 Дакле, можемо закључити из овога шта се дешава даље. 211 00:13:07,150 --> 00:13:11,850 Претпоставимо онда ја изјављујем т као што сам урадио у реду 10. 212 00:13:11,850 --> 00:13:14,280 Ово је нека смеће вредност. Ко зна на први? 213 00:13:14,280 --> 00:13:18,490 Али, на десној страни линије 10 Зовем ГетСтринг поново. 214 00:13:18,490 --> 00:13:20,050 Ко зна где ово завршава? 215 00:13:20,050 --> 00:13:23,830 Хајде да кажемо да произвољно оперативни систем нашао простора за то пут овде. 216 00:13:23,830 --> 00:13:28,610 Ја се десити да случајно откуцате Х-Е-Л-Л-О опет, 217 00:13:28,610 --> 00:13:31,260 па можемо извући исту врсту слике. 218 00:13:31,260 --> 00:13:34,290 Али чињеница да имам прекраја ову слику је намерна 219 00:13:34,290 --> 00:13:37,720 јер је другачији ЗДРАВО од овог. 220 00:13:37,720 --> 00:13:43,920 Дакле, овде то може бити локација 456, то је 457, и тако даље. 221 00:13:43,920 --> 00:13:47,170 Дакле, оно што се ставља знак питања где је некада био? 222 00:13:47,170 --> 00:13:50,190 У овом случају 456. 223 00:13:50,190 --> 00:13:53,540 Ми смо брање ове бројеве самовољно јер заиста после данашњег 224 00:13:53,540 --> 00:13:57,110 нећемо да брину толико о томе шта је адреса шта је. 225 00:13:57,110 --> 00:14:02,690 Све нам је стало је да смислимо адресу неког дела података као ЗДРАВО. 226 00:14:02,690 --> 00:14:07,100 >> Дакле стварно оно што већина људи ради у компјутерској науци, када говоримо о меморијским адресама 227 00:14:07,100 --> 00:14:10,210 и говори о показивача конкретно, 228 00:14:10,210 --> 00:14:14,220 а не смета схватите 123 - кога је брига где је то ствар заправо, 229 00:14:14,220 --> 00:14:17,440 ми само знамо да је у неком нумеричком адресу - 230 00:14:17,440 --> 00:14:22,180 смо поједноставили свет и само да кажем да је с указује на то карактера 231 00:14:22,180 --> 00:14:25,080 и т указује на то карактера. 232 00:14:25,080 --> 00:14:27,430 А чињеница да је стрелица је сасвим намерна 233 00:14:27,430 --> 00:14:31,610 јер буквално сада с је показујући на Х и Т окренут на другу Х 234 00:14:31,610 --> 00:14:34,720 јер на крају крајева, није битно шта је адреса, 235 00:14:34,720 --> 00:14:40,240 али није свеједно да ми имамо могућност да изразе ту адресу са неким комадом кода. 236 00:14:40,240 --> 00:14:42,730 Нисмо баш изманипулисани ове адресе још увек 237 00:14:42,730 --> 00:14:47,770 па ћемо видети где можемо да убацим и некако радим ствари са показивачима, 238 00:14:47,770 --> 00:14:52,030 али за сада у складу 12 буквално шта су вредности можемо поређењем 239 00:14:52,030 --> 00:14:55,500 према овој причи, у складу 12? 240 00:14:56,570 --> 00:15:01,290 Ми говориш је 123 једнак једнак 456? И то дефинитивно није случај. 241 00:15:01,290 --> 00:15:05,320 А чак и концептуално, то показивач дефинитивно није иста као ова 242 00:15:05,320 --> 00:15:09,500 зато што се зове ГетСтринг два пута, а ГетСтринг не покушавају бити супер паметан, 243 00:15:09,500 --> 00:15:12,470 не покушавају да схвате, ох, ЗДРАВО откуцали пре 5 минута; 244 00:15:12,470 --> 00:15:15,090 дозволите ми да вам дати исти показивач као што сам ти дао пре, 245 00:15:15,090 --> 00:15:18,450 то је само издваја нови комад меморије сваки пут када га позовете. 246 00:15:18,450 --> 00:15:20,350 >> Па како да решите овај проблем? 247 00:15:20,350 --> 00:15:24,270 Ако виши ниво желим да упореде конце здраво и здраво - 248 00:15:24,270 --> 00:15:28,680 Брига о показивачима - како идем око одговора на питање, 249 00:15:28,680 --> 00:15:31,980 није корисник упишите исту ствар? Шта је потребно овде? Да. 250 00:15:31,980 --> 00:15:35,200 [Ученик] Користите функцију. >> Ја могу да користим функцију из кутије. 251 00:15:35,200 --> 00:15:38,170 Ја могу да користе функцију зове стрцмп с-т-р-ц-м-п, 252 00:15:38,170 --> 00:15:41,190 само скраћена верзија каже стринг поредити. 253 00:15:41,190 --> 00:15:45,070 А ако одемо у, на пример, упоредите 2, која је међу милостињу данашњим 254 00:15:45,070 --> 00:15:46,690 Ја управо то. 255 00:15:46,690 --> 00:15:51,750 Наставио сам да све остало исто од линије 1 на доле до 26 или тако нешто, 256 00:15:51,750 --> 00:15:54,360 и сада приметити тај део није променило само мало. 257 00:15:54,360 --> 00:15:57,690 Хајде да игноришемо линију 28 за тренутак и фокусирати се само на овом једном. 258 00:15:57,690 --> 00:16:00,410 Шта смо рекли у понедељак да ул упоређивање ради? 259 00:16:00,410 --> 00:16:05,200 Она управља процес узимања 2 тројке, С и Т у овом случају, 260 00:16:05,200 --> 00:16:08,480 врста практично ставља свој прст на тим 2 слова, 261 00:16:08,480 --> 00:16:11,530 и шта мора да уради нешто попут вхиле петље или за петље, 262 00:16:11,530 --> 00:16:16,050 и она каже да је ово исто? Ако је тако, помера прсте Или показиваче напред. 263 00:16:16,050 --> 00:16:17,970 Да ли су то исти, они исти, то исто, 264 00:16:17,970 --> 00:16:22,710 ово исто, то исто? И оох, ја сам на крају стринга у оба С и Т. 265 00:16:22,710 --> 00:16:26,780 Нисам нашао никакве контрадикције. Да, ови критеријуми су исти. 266 00:16:26,780 --> 00:16:31,940 И шта ул поредити повраћај уколико 2 жице су исти, очигледно? Нула. 267 00:16:31,940 --> 00:16:35,900 Дакле, 0 је добро у овом случају, јер ако се врати -1 или +1, 268 00:16:35,900 --> 00:16:40,560 То значи да је само догоди да дође пред т абецедном реду или после т. 269 00:16:40,560 --> 00:16:43,760 А зашто би то било корисно да имају функцију која вам говори која жица долази до 270 00:16:43,760 --> 00:16:46,720 или после у речнику? 271 00:16:46,720 --> 00:16:48,740 [Ученик] Сеарцхинг. >> Тражење и сортирање. 272 00:16:48,740 --> 00:16:51,730 >> Дакле, можете да урадите ствари као бинарне претраге или мехурићима поређати или спајање врсту 273 00:16:51,730 --> 00:16:53,230 где морате да упоредите ствари. 274 00:16:53,230 --> 00:16:56,420 Тако сада имамо врсту сече неке углове и само причали о сортирању 275 00:16:56,420 --> 00:16:59,430 у контексту бројева јер је лепо и лако причати о томе, 276 00:16:59,430 --> 00:17:02,430 али свакако може упоредити ниске, јабуку са бананом 277 00:17:02,430 --> 00:17:05,349 јер ако јабука је познато да дође до банане, исто тако, 278 00:17:05,349 --> 00:17:09,319 да се крећете конце около у меморији, баш као Роб урадио са врстом стапања у видеу 279 00:17:09,319 --> 00:17:15,880 а ми смо овде урадили на позорници са избора врсте, уметања сортирате, а мехурићима раси. 280 00:17:15,880 --> 00:17:18,710 Па где другде можемо узети ово? Хајде да пробамо ово. 281 00:17:18,710 --> 00:17:23,980 Идемо некако заборавимо ту лекцију за тренутак и покушајте сада и копирање 1.ц да урадите следеће. 282 00:17:23,980 --> 00:17:26,800 У складу 21 Кажем принт нешто, 283 00:17:26,800 --> 00:17:28,520 онда сам све низ од корисника, 284 00:17:28,520 --> 00:17:30,690 онда сам ово проверите. 285 00:17:30,690 --> 00:17:33,620 Нисмо баш увалио ову навику још, али хајде сада да радимо ово. 286 00:17:33,620 --> 00:17:40,990 Идемо у ствари одлепите овом слоју. Ово је стварно знак *. Овај момак је стварно знак *. 287 00:17:40,990 --> 00:17:45,690 Дакле, шта то значи да се провери да ли с == НУЛЛ? 288 00:17:45,690 --> 00:17:48,380 Испада да, када позовете функцију као ГетСтринг 289 00:17:48,380 --> 00:17:51,540 или више уопште само питајте рачунар да вам дати неке меморије, 290 00:17:51,540 --> 00:17:53,030 нешто може да крене наопако. 291 00:17:53,030 --> 00:17:56,630 Можете бити луд и питам рачунар за терабајта меморије 292 00:17:56,630 --> 00:18:01,780 тражећи трилиона бајта меморије који једноставно не постоје на рачунару, 293 00:18:01,780 --> 00:18:05,130 али ГетСтринг и друге функције треба неки начин да виче на вас 294 00:18:05,130 --> 00:18:06,820 ако сте тражили превише. 295 00:18:06,820 --> 00:18:10,450 И начин на који то ради је ГетСтринг ако сте тражили више меморије 296 00:18:10,450 --> 00:18:14,250 него је доступан на рачунару, чак и ако је то супер, супер ниске вероватноће 297 00:18:14,250 --> 00:18:17,730 јер нико од нас ће да откуцате трилион знакове, а затим притисните Ентер, 298 00:18:17,730 --> 00:18:21,980 али ниске вероватноће, иако то може бити, ја још увек желим да проверим за њега само у случају, 299 00:18:21,980 --> 00:18:26,120 а посебна вредност која ГетСтринг, одговор и друге функције враћа 300 00:18:26,120 --> 00:18:30,630 ако нешто није у реду је НУЛЛ у свим капе. 301 00:18:30,630 --> 00:18:36,520 >> А шта је НУЛЛ? НУЛЛ само тако се дешава да представља показивач. То је сећање адреса 0. 302 00:18:36,520 --> 00:18:40,800 Свет је одлучио да самовољно, ако је мој рачунар меморија - знаш шта? - 303 00:18:40,800 --> 00:18:46,260 идемо да краду само 1 бајт меморије сваког рачунара, а то је локација 0. 304 00:18:46,260 --> 00:18:49,560 Ми ћемо му дати надимак НУЛЛ, а ми ћемо да обећају 305 00:18:49,560 --> 00:18:52,660 да никада нећемо заиста ставио тамо праве податке 306 00:18:52,660 --> 00:18:56,770 зато сто самовољно треба посебну вредност, 0, нулл, звани 307 00:18:56,770 --> 00:19:00,230 тако да можемо да вичеш на кориснике, ако нешто крене наопако. 308 00:19:00,230 --> 00:19:03,590 У супротном, можда не знаш не значи 0 пут нешто овде 309 00:19:03,590 --> 00:19:05,490 или то значи нешто кренуло наопако? 310 00:19:05,490 --> 00:19:09,190 Морамо да се сви слажемо да је НУЛЛ значи ништа није вратио, 311 00:19:09,190 --> 00:19:11,700 нема јавних адреса је вратио. 312 00:19:11,700 --> 00:19:15,210 Сада, овде сам само усвајањем своје људско конвенцију И врати 1 од главног 313 00:19:15,210 --> 00:19:17,040 ако нешто крене наопако. 314 00:19:17,040 --> 00:19:20,650 То је зато што је повратак Главног конвенција је да се врати 0 ако добро, 315 00:19:20,650 --> 00:19:22,990 1 или нека друга вредност ако је лоше. 316 00:19:22,990 --> 00:19:28,200 Али ГетСтринг и било функција која се бави меморијским повратка НУЛЛ ако нешто крене лоше. 317 00:19:28,200 --> 00:19:33,480 >> Ок. Дакле, нажалост, линија 27, супер једноставан, иако је то, сасвим не копира стринг. 318 00:19:33,480 --> 00:19:35,740 Зашто? То се може видети на следећи начин. 319 00:19:35,740 --> 00:19:40,120 Ја тврдим, у складу 27 да прави копије с и назвавши је Т. 320 00:19:40,120 --> 00:19:45,790 Дакле, ја не питам корисника за 2 жице овај пут, ја само кажем вредност у с 321 00:19:45,790 --> 00:19:47,870 треба да се стави у Т, као добро. 322 00:19:47,870 --> 00:19:52,890 Дакле, сада само да покаже колико је сломљена је то у складу 29 надаље шта ја то радим? 323 00:19:52,890 --> 00:19:56,980 Прво сам проверава да ли је дужина т је већа од 0. 324 00:19:56,980 --> 00:19:59,330 Ту је неки стринг тамо. Корисник откуца нешто унутра 325 00:19:59,330 --> 00:20:03,410 Шта је линија 32 раде, очигледно? 326 00:20:03,410 --> 00:20:08,910 [Нечујан ученик одговор] >> реду. Можете да га некако закључити из онога што сам рекао да ради. 327 00:20:08,910 --> 00:20:13,200 Али технички, шта се ово ради? т [0] представља шта? 328 00:20:13,200 --> 00:20:15,140 [Ученик] Нулта карактер. >> [Малан] Нулта карактер. 329 00:20:15,140 --> 00:20:19,620 Или, још човека као, први лик у т, шта год да је, БиХ можда у овом случају. 330 00:20:19,620 --> 00:20:24,990 А тоуппер ради оно што каже. Она профитира на Нулта карактер тона, а он га мења. 331 00:20:24,990 --> 00:20:28,430 Дакле, то значи узети нулте карактер тона, чине велико слово 332 00:20:28,430 --> 00:20:30,320 и ставио га назад у тој истој локацији. 333 00:20:30,320 --> 00:20:35,540 Дакле, ако сам здраво упишите малим словима, ово би требало да промените малим х до капитала Х. 334 00:20:35,540 --> 00:20:41,400 Али проблем је у томе што се у редовима 35 и 36 шта ћу да урадим је одштампате за нас с и т. 335 00:20:41,400 --> 00:20:43,120 А шта је твој предосећај? 336 00:20:43,120 --> 00:20:47,250 Шта сам заправо ћу да видим да ли сам откуцао у здраво у свим малим словима? 337 00:20:47,250 --> 00:20:52,280 Шта се дешава да се штампа? >> [Нечујан ученик одговор] >> Шта је то? 338 00:20:52,280 --> 00:20:58,360 [Ученик] Велики Х и остали мали. >> Велики Х и остали мали за које с или т? 339 00:20:58,360 --> 00:21:03,170 [Ученик] И. >> Оба. Управо тако. Дакле, хајде да видимо шта се дешава овде. 340 00:21:03,170 --> 00:21:08,380 >> Дозволите ми да иде напред и саставити ово. Ово је цопи1, тако да цопи1. У реду. 341 00:21:08,380 --> 00:21:14,840 Зоом ин Пусти ме напред и покрените цопи1, Ентер, Реци нешто: здраво малим. 342 00:21:14,840 --> 00:21:19,570 Она капитализован копију, али то очигледно капитализован оригинал као и, 343 00:21:19,570 --> 00:21:22,070 јер оно што се сада дешава у овој причи? 344 00:21:22,070 --> 00:21:27,030 У складу 27 Ја стварно не изгледа да се копира стринг, 345 00:21:27,030 --> 00:21:30,450 али чак иако сте можда интуитивно надао да је то случај, 346 00:21:30,450 --> 00:21:33,680 Ако мислите о овој слици, оно што је заиста сам урадио? 347 00:21:33,680 --> 00:21:35,410 Половина слике је исти. 348 00:21:35,410 --> 00:21:39,390 Дакле, хајде да врати у прошлост, тако да је т још увек не постоји у причи. 349 00:21:39,390 --> 00:21:43,160 С може постојати у причи, али хајде мала здраво овај пут. 350 00:21:43,160 --> 00:21:46,710 Дакле, дозволите ми да поправим оно што сам заправо унесе 351 00:21:46,710 --> 00:21:51,280 У том случају овде имамо х-е-л-Л-О. 352 00:21:51,280 --> 00:21:58,050 Ми ћемо га извући као низ знакова, ставим линије сепаратора овде и мој \ 0. 353 00:21:58,050 --> 00:22:05,980 Дакле, ово је место где смо чим линије 1 до 24-исх, дати или узети, су погубљени. 354 00:22:05,980 --> 00:22:07,800 Ово је слика мог сећања. 355 00:22:07,800 --> 00:22:10,800 Када дођем на ред 27, шта се дешава? 356 00:22:10,800 --> 00:22:14,730 Баш као и пре, ја добијем показивач, што ћу извући као овај трг. 357 00:22:14,730 --> 00:22:19,740 То се зове Т. А шта је њена вредност по дефаулту? Ко зна? Неки смеће вредност. 358 00:22:19,740 --> 00:22:22,060 >> Тако да сам апстрактни ћу да даље као знак питања. 359 00:22:22,060 --> 00:22:27,670 И чим је десна страна линије 27 извршава, шта ја унутра стављање т? 360 00:22:27,670 --> 00:22:30,770 Иста ствар је у с. 361 00:22:30,770 --> 00:22:34,120 Дакле, ако смо за тренутак уклоните ову апстракције стрелице и кажемо, 362 00:22:34,120 --> 00:22:40,330 Ох, ово је меморија оптерећења адреса 123, када кажете Т добија с, зарез, 363 00:22:40,330 --> 00:22:42,700 буквално си ставио 123 овде. 364 00:22:42,700 --> 00:22:45,200 Сада, ако се некако поједностави наш свет поново са сликама, 365 00:22:45,200 --> 00:22:48,750 шта стварно урадио је само додао још један стрелицу вашем свету 366 00:22:48,750 --> 00:22:52,910 који је од т указујући на исти тачним ниске. 367 00:22:52,910 --> 00:22:59,730 Дакле, када у складу 31 и 32 сам заправо иде о промени Т [0], 368 00:22:59,730 --> 00:23:05,580 шта је Т [0] изгледа синоним за сада? с [0] 369 00:23:05,580 --> 00:23:07,030 Дакле, то је све што се дешава. 370 00:23:07,030 --> 00:23:09,900 И иако је ова врста осећа мало низак ниво и тајанствени 371 00:23:09,900 --> 00:23:12,760 и ова врста изгледа као можда интуитивно ово би требало да су управо радили - 372 00:23:12,760 --> 00:23:15,410 Направио сам копије ствари пре и то само радио - 373 00:23:15,410 --> 00:23:18,590 Ако сте заиста мисле о томе шта стринг заиста јесте, то је знак *. 374 00:23:18,590 --> 00:23:21,700 Па, шта је то? То је адреса неког карактера. 375 00:23:21,700 --> 00:23:24,930 Онда можда има више смисла да када покушате да урадите нешто 376 00:23:24,930 --> 00:23:29,220 супер наизглед једноставно овако, све што радиш је копирање меморијска адреса. 377 00:23:29,220 --> 00:23:32,530 Нећеш заправо ради ништа са самог низа. 378 00:23:32,530 --> 00:23:37,500 Дакле, чак и ако немате појма колико би решили овај проблем у коду, 379 00:23:37,500 --> 00:23:45,080 високом нивоу, концептуално, шта треба да урадимо да би та верна копија с, очигледно? 380 00:23:46,670 --> 00:23:48,820 Да. >> [Ученик] Дај нову локацију? >> Тачно. 381 00:23:48,820 --> 00:23:50,800 >> Морамо да т потпуно нову локацију. 382 00:23:50,800 --> 00:23:55,230 Морамо некако да створи свет у коме смо добили нови комад меморије, 383 00:23:55,230 --> 00:24:00,090 који је само ради јасноће је да ћу извући одмах испод ове, али то не треба да буде тамо. 384 00:24:00,090 --> 00:24:04,880 Али то мора да буде исте величине, тако да ћу извући ове вертикалне линије на истом месту. 385 00:24:04,880 --> 00:24:09,720 То је у реду ако је то у почетку све смеће. Ко зна шта је тамо? 386 00:24:09,720 --> 00:24:13,850 Али корак 1 ће морати да се ми дају онолико сећању као морам 387 00:24:13,850 --> 00:24:18,630 да стане копију здраво, а онда схватим како се овде копирате х, е овде, 388 00:24:18,630 --> 00:24:20,390 Ја овде и тако даље. 389 00:24:20,390 --> 00:24:24,880 Али ово је већ требало да се осећају помало очигледно, чак и ако су неки од детаља још увек апстрактна. 390 00:24:24,880 --> 00:24:28,690 Да бисте копирали ову жицу у ово, то је само за петљу или вхиле петље 391 00:24:28,690 --> 00:24:31,580 или нешто са чиме сте постали све више познато. 392 00:24:31,580 --> 00:24:35,970 Дакле, хајде да пробамо ово. Пусти ме да идем у цопи2.ц. 393 00:24:35,970 --> 00:24:43,270 У цопи2.ц имамо скоро исти програм, осим на линији 27. 394 00:24:43,270 --> 00:24:47,260 Изгледа мало комплекс, али ако га разбити комад по комад, 395 00:24:47,260 --> 00:24:48,950 лева рука страна је иста. 396 00:24:48,950 --> 00:24:52,790 Цхар * т ствара ову ствар у меморији, додуше са знаком питања 397 00:24:52,790 --> 00:24:54,680 јер ми немамо појма шта је тамо по дефаулту. 398 00:24:54,680 --> 00:24:57,920 На десној страни ми смо сада уводи нову функцију, маллоц, 399 00:24:57,920 --> 00:25:00,640 за памћење издвојити, дај меморије, 400 00:25:00,640 --> 00:25:06,900 и то је очигледно потребно колико аргумената, колико се ствари унутар заграда? 401 00:25:09,660 --> 00:25:12,130 Чуо сам мрмљање од 1 и 2, али то је само 1. 402 00:25:12,130 --> 00:25:15,320 Нема зарез, што значи да је само 1 ствар унутар заграда. 403 00:25:15,320 --> 00:25:17,720 Иако постоји друга заграда, дозволите ми да истакне 404 00:25:17,720 --> 00:25:21,460 шта је унутар крајних заграда, и то је то израз: 405 00:25:21,460 --> 00:25:25,880 (Стрлен (с) + 1) * сизеоф (цхар). 406 00:25:25,880 --> 00:25:29,190 Дакле, ако смо заиста мислимо о овоме, ово говори да ми дужину с. 407 00:25:29,190 --> 00:25:34,440 Зашто сам, ипак, додаје 1 на дужину? >> [Нечујан ученик одговор] 408 00:25:34,440 --> 00:25:40,200 Управо тако. Морамо простор за овог момка на реп, шести карактер који нема енглеског значење 409 00:25:40,200 --> 00:25:42,250 али нема посебан програмски значење. 410 00:25:42,250 --> 00:25:46,800 >> Зато нам је потребан + 1 за то, јер стрлен враћа људско очекивања дужине, 411 00:25:46,800 --> 00:25:50,890 здраво или 5, не дати додатни карактер нулл. 412 00:25:50,890 --> 00:25:52,980 Тако да сам ручно додати ово са + 1. 413 00:25:52,980 --> 00:25:56,060 А онда, * величина (цхар), нисмо видели раније. 414 00:25:56,060 --> 00:25:57,480 Ово није технички функција. 415 00:25:57,480 --> 00:26:04,150 То је посебна кључна реч која нам говори шта је величина неког типа података на рачунару 416 00:26:04,150 --> 00:26:06,980 јер у стварности, неки од нас имају 32-битне рачунаре. 417 00:26:06,980 --> 00:26:10,900 Имам прилично стари рачунар код куће, и то само користи 32 бита за представљање показиваче. 418 00:26:10,900 --> 00:26:13,900 И тако, ако сам величину типа података, то може бити 32 бита. 419 00:26:13,900 --> 00:26:18,300 Али ако ја користим мој нови фенси рачунар, можда ћу да се вратим вредност од 64 бита 420 00:26:18,300 --> 00:26:20,510 за нешто попут адресе. 421 00:26:20,510 --> 00:26:25,400 Дакле, у овом случају, само да буде супер безбедни, ми не идемо на хард нешто слично код - 422 00:26:25,400 --> 00:26:28,740 добро, шта је величина карактер у складу са оним што смо до сада рекао? 423 00:26:28,740 --> 00:26:34,450 Ми смо прилично је рекао усмено да је 1 бајт, и то је прилично тачно преко одбора. 424 00:26:34,450 --> 00:26:37,000 Али опет, претпоставке имају тенденцију да буду лоше. 425 00:26:37,000 --> 00:26:40,850 Они доводе до бугги софтвер ако људи користе софтвер на начине нисте намеравали. 426 00:26:40,850 --> 00:26:44,750 Дакле, хајде да апстрактно ово далеко и мало више уопштено рећи 427 00:26:44,750 --> 00:26:46,830 Треба оволико комаде меморије 428 00:26:46,830 --> 00:26:50,210 и сваки комад меморије треба да буде једнака величини карактера, 429 00:26:50,210 --> 00:26:54,870 који је у ствари једнак 1 у овом случају, али то је више генерички начин писања. 430 00:26:54,870 --> 00:27:00,460 Дакле, ако је реч здраво, колико бајтова се маллоц очигледно издваја за здраво? 431 00:27:00,460 --> 00:27:04,980 [Ученик] Шест. >> Шест. Тачно онолико колико смо упитнике на екрану. 432 00:27:04,980 --> 00:27:07,800 И онда се погоди сада се заснива на разумевању ГетСтринг 433 00:27:07,800 --> 00:27:12,790 шта маллоц вероватно вратити? >> [Ученик] адреса. 434 00:27:12,790 --> 00:27:17,020 Адреса цега? Од првог комад меморије. 435 00:27:17,020 --> 00:27:20,670 >> Немамо појма шта је тамо, јер нека друга функција 436 00:27:20,670 --> 00:27:23,010 могло претходно користили ову меморију. 437 00:27:23,010 --> 00:27:28,380 Али маллоц, као ГетСтринг, враћа адресу првог бајта меморије 438 00:27:28,380 --> 00:27:30,540 да је издвојено за вас. 439 00:27:30,540 --> 00:27:38,380 Међутим, оно што не урадите је да попуните овај празан са карактером обрнуте косе нулл 440 00:27:38,380 --> 00:27:43,030 јер испада можете користити маллоц да издвоји ништа: Интс, стрингови, низови, 441 00:27:43,030 --> 00:27:45,700 плута, студентске структуре. 442 00:27:45,700 --> 00:27:47,750 Можете користити маллоц потпуно уопштено. 443 00:27:47,750 --> 00:27:51,470 То не занима, или морате да знате шта сте доделу меморије за. 444 00:27:51,470 --> 00:27:55,810 Дакле, било би претенциозно да маллоц ставити \ 0 445 00:27:55,810 --> 00:27:58,340 на крају сваког комад меморије вас то даје 446 00:27:58,340 --> 00:28:02,620 јер ово \ 0 ствар је само конвенција за гудаче. 447 00:28:02,620 --> 00:28:06,310 То не користи за Интс, није коришћен за сплавова, то је не користи за студенте. 448 00:28:06,310 --> 00:28:11,730 И тако готцха са маллоц је да је терет је у потпуности на вама програмер 449 00:28:11,730 --> 00:28:16,790 да се сетите колико сте додељени бајтова, а не да се икада користе за петљу 450 00:28:16,790 --> 00:28:21,570 или док петља и проћи граници комад меморије сте дали. 451 00:28:21,570 --> 00:28:23,540 Ставите други начин, чим доделити меморију, 452 00:28:23,540 --> 00:28:28,510 Ви не можете питати оперативни систем, ох, успут, колико је велик комад меморије је то било? 453 00:28:28,510 --> 00:28:32,080 То у потпуности зависи од вас да се сетите да ли је потребно ту вредност. 454 00:28:32,080 --> 00:28:34,330 >> Дакле, хајде да видимо како да наставим да користите ову меморију. 455 00:28:34,330 --> 00:28:38,430 У складу 28 и 29 зашто ја ово радим? 456 00:28:39,850 --> 00:28:42,260 Само укупно разум чек. 457 00:28:42,260 --> 00:28:45,110 Само у случају да се нешто кренуло наопако, тражим неке луде количине меморије 458 00:28:45,110 --> 00:28:48,690 или сам толико ствари ради на рачунару који има једноставно није довољно меморије, 459 00:28:48,690 --> 00:28:51,780 тако нешто, ја бар желим да провери нулл. 460 00:28:51,780 --> 00:28:55,260 У стварности, већина рачунара ће вам дати илузију да сваки програм 461 00:28:55,260 --> 00:28:57,080 могу да користе целину вашег РАМ, 462 00:28:57,080 --> 00:29:00,740 али чак и тако, ако корисник упише у неком лудом дугог низа можда зато што су лоши момак 463 00:29:00,740 --> 00:29:03,440 и они заправо покушавају да сруши свој програм или хацк у њу, 464 00:29:03,440 --> 00:29:07,300 желите да макар провери вредност повратка маллоц и да ли је то једнако нула. 465 00:29:07,300 --> 00:29:11,630 А ако се то деси, хајде да престане сада, јер ја не знам шта да радим у том случају. 466 00:29:11,630 --> 00:29:13,950 Како да копирате тетиве? Постоји неколико начина да се то уради. 467 00:29:13,950 --> 00:29:18,850 Постоје ул копирате функције у Ц, али то је супер једноставно за нас да урадимо ово на старомодан начин. 468 00:29:18,850 --> 00:29:23,110 >> Прво дозволите ми да схватим шта је дужина с је. 469 00:29:23,110 --> 00:29:26,930 Могао сам да ставим ово у петљи, али уместо тога сам га ставио овде због јасноће. 470 00:29:26,930 --> 00:29:30,610 Дакле, н сада чува дужину оригиналног низа, што је очигледно 5. 471 00:29:30,610 --> 00:29:35,290 Онда у мом за петљу сам итератинг од 0 о до н, 472 00:29:35,290 --> 00:29:40,940 и на свакој итерацији ја постављам с [и] унутар т [и]. 473 00:29:40,940 --> 00:29:45,060 Дакле, то је оно што сам подразумевао са мојим прстима 2 указују на жицама раније. 474 00:29:45,060 --> 00:29:49,260 Што ово за петљу понавља овако, ја ћу да се копирање х на овамо, 475 00:29:49,260 --> 00:29:52,890 Е у овде, ја у овде, јер је ово с ово је Т. 476 00:29:52,890 --> 00:29:58,770 И онда на крају, у складу 35 зашто ја ово радим? 477 00:29:58,770 --> 00:30:03,770 Морам да се уверите да сам окончање ниске Т. 478 00:30:03,770 --> 00:30:06,170 И ја то урадио на овај начин бити супер експлицитан. 479 00:30:06,170 --> 00:30:09,510 Али предлажу, некога, ако би могао, другачији начин раде. 480 00:30:09,510 --> 00:30:13,930 Ја стварно не треба линије 35. Постоји још један начин да се то уради. 481 00:30:13,930 --> 00:30:18,880 Да. >> [Нечујан ученик одговор] >> Реци гласније. 482 00:30:18,880 --> 00:30:20,960 [Ученик] Мање од или једнака. >> Тачно. 483 00:30:20,960 --> 00:30:24,450 Ми смо само могли рећи мање или једнако н, која је у целини је био лош 484 00:30:24,450 --> 00:30:28,190 јер скоро увек кад одемо до једнак ствари смо бројање 485 00:30:28,190 --> 00:30:30,000 Идемо корак 1 предалеко. 486 00:30:30,000 --> 00:30:32,170 Али запамтите, колико бајтова смо издвојити? 487 00:30:32,170 --> 00:30:37,210 Ми издвојила стрлен С, па 5 + 1 за укупно 6. 488 00:30:37,210 --> 00:30:39,980 Дакле, у овом случају нисмо могли да урадимо овако нешто 489 00:30:39,980 --> 00:30:46,450 тако да ми копира не само здраво, али такође и \ 0 на самом крају. 490 00:30:46,450 --> 00:30:49,860 Алтернативно, могли бисмо да користимо функцију зове ул копија, стрцпи, 491 00:30:49,860 --> 00:30:51,700 али то не би скоро толико забавно. 492 00:30:51,700 --> 00:30:54,000 Али то је све што ради испод хаубе. 493 00:30:54,000 --> 00:30:56,050 Онда на крају, радимо исту ствар као и пре. 494 00:30:56,050 --> 00:31:01,620 Ја капитализује т и онда ја тврдим да је оригинал изгледа овако и копија изгледа тако. 495 00:31:01,620 --> 00:31:08,570 Дакле, хајде да пробамо ово. Пусти ме унутра. Направите цопи2. Ми ћемо повећати и покрените цопи2. 496 00:31:08,570 --> 00:31:13,840 Идем да откуцате здраво малим словима, и заиста сам се мала здраво као оригинал 497 00:31:13,840 --> 00:31:16,930 али капитал Поздрав за копију. 498 00:31:16,930 --> 00:31:20,300 Али ја нисам урадио још увек. Морам да урадим овде 1 Последња ствар. 499 00:31:20,300 --> 00:31:28,000 46 и 47 се јасно ослобађање меморије, али шта то заправо значи? 500 00:31:28,000 --> 00:31:33,250 Шта ја то радим, да ли мислите, позивајући линије 46 и 47 линију? 501 00:31:33,250 --> 00:31:38,900 Какав ефекат то имати? Да. 502 00:31:38,900 --> 00:31:43,140 [Нечујан ученик одговор] >> Тачно. 503 00:31:43,140 --> 00:31:46,380 >> Ви само говорите оперативни систем, хеј, хвала за ову меморију. 504 00:31:46,380 --> 00:31:48,320 Сада можете да га користите за неког другог. 505 00:31:48,320 --> 00:31:50,790 И овде је савршен пример за смеће вредности. 506 00:31:50,790 --> 00:31:55,430 Управо сам користио ову меморију да напише реч здраво на 2 места, 507 00:31:55,430 --> 00:31:57,490 овде, овде, овде и овде. 508 00:31:57,490 --> 00:32:00,910 Дакле, ово је х-е-л-л-о-\ 0. 509 00:32:00,910 --> 00:32:06,960 Али онда зовем линију 46 и линију 47, а знате шта се дешава тамо у погледу на слици? 510 00:32:06,960 --> 00:32:10,010 Заправо, чекај, ова слика је стара. 511 00:32:10,010 --> 00:32:12,550 Када направимо копију, овај момак је стварно указује овде, 512 00:32:12,550 --> 00:32:16,110 па хајде да уклоните бројеве и само апстрактна даље као наше стрелама поново. 513 00:32:16,110 --> 00:32:19,370 Шта се дешава на овој слици кад зовем бесплатно? 514 00:32:19,370 --> 00:32:22,750 [Нечујан ученик одговор] >> Ни. 515 00:32:22,750 --> 00:32:29,510 Ако зовем бесплатно на С и Т - врста трика питање - ова слика се не мења уопште 516 00:32:29,510 --> 00:32:33,880 зато позива и позивање с т само говори оперативни систем, 517 00:32:33,880 --> 00:32:39,010 хеј, можете користити поново ову меморију, али то не мења то нулл 518 00:32:39,010 --> 00:32:41,840 или неки специјални карактер, то не промени, 519 00:32:41,840 --> 00:32:47,350 то не мења х или е или л или л или о У сваком месту на било шта друго. 520 00:32:47,350 --> 00:32:51,610 У погледу слици, чим позовете бесплатно ништа се не мења. 521 00:32:51,610 --> 00:32:56,570 И ту лежи порекло смећа вредности, јер ако сам онда касније у овом програму 522 00:32:56,570 --> 00:33:01,010 питајте оперативни систем за више меморије са ГетСтринг или маллоц или нешто слично 523 00:33:01,010 --> 00:33:04,900 и оперативни систем, каже, сигурно, имам 12 бајта меморије само ослобођени, 524 00:33:04,900 --> 00:33:08,080 користите ово, шта ће бити предат? 525 00:33:08,080 --> 00:33:10,830 Ти ћеш бити предат комад меморије која се обично бих да скренем 526 00:33:10,830 --> 00:33:13,700 са упитницима, али оно што су они упитници? 527 00:33:13,700 --> 00:33:17,000 Они се деси да буде х-е-л-л-о, х-е-л-л-о. 528 00:33:17,000 --> 00:33:20,940 Ово су наши нови смеће вредности чим ослободите тог меморију. 529 00:33:20,940 --> 00:33:22,750 >> Постоји стварни свет импликација овде. 530 00:33:22,750 --> 00:33:24,720 Ово се дешава у вези са РАМ меморије, али ваши рачунари 531 00:33:24,720 --> 00:33:26,720 заправо раде исту ствар са диска. 532 00:33:26,720 --> 00:33:30,620 Причаћемо о томе посебно у будућем проблем сету који се фокусира на форензике. 533 00:33:30,620 --> 00:33:36,170 Али шта се заправо дешава ако имате неку осетљиву финансијску датотеку на радној површини 534 00:33:36,170 --> 00:33:39,600 или неки непотпуни ЈПЕГ и ви га повући у свој смећа, 535 00:33:39,600 --> 00:33:44,390 шта се дешава када га превучете у смеће или отпатке? 536 00:33:44,390 --> 00:33:47,240 Знао си шта сам причао. [Смех] 537 00:33:47,240 --> 00:33:52,370 Шта се дешава када сте увучени у тај доказ за отпатке или канта за смеће? 538 00:33:52,370 --> 00:33:55,920 [Нечујан ученик одговор] 539 00:33:55,920 --> 00:33:58,000 Па, пажљив. Шта се дешава када сте то урадили? 540 00:33:58,000 --> 00:34:01,030 Кратак одговор је ништа, зар не? 541 00:34:01,030 --> 00:34:04,790 Скетцхи или осетљиве фајл још само седи тамо негде на вашем хард диску. 542 00:34:04,790 --> 00:34:07,940 Већина од нас барем научили на тежи начин да је потребно да испразните смеће 543 00:34:07,940 --> 00:34:10,429 или ваш бин рециклирамо да стварно брисање датотеке. 544 00:34:10,429 --> 00:34:13,440 И заиста, када кликнете десним тастером миша кликните на Цонтрол или вашег канту 545 00:34:13,440 --> 00:34:15,580 или изаберите Филе, Испразни смеће или било шта друго 546 00:34:15,580 --> 00:34:21,420 а ви у ствари испразните канте за ђубре или отпатке, шта се заправо догађа онда овој слици? 547 00:34:22,810 --> 00:34:25,969 Више ништа. Дакле, ништа се заправо дешава на диску. 548 00:34:25,969 --> 00:34:30,880 >> А ако можемо привремено само дигресију и пише - ја ћу само користите леђа томе. 549 00:34:30,880 --> 00:34:34,639 Тако сада прича се мења из РАМ меморије, што је, где постоје програми 550 00:34:34,639 --> 00:34:39,250 док сте их користите, на диску, где се они чувају дугорочне 551 00:34:39,250 --> 00:34:42,920 чак и када нестане струје, за сада - и ми ћемо се вратити на то у будућности - 552 00:34:42,920 --> 00:34:46,380 хајде да се претварамо да је ово представља хард диск унутрашњост рачунара 553 00:34:46,380 --> 00:34:50,110 јер назад у дан они су користили да буду кружни дискови, баш као флопи дискова. 554 00:34:50,110 --> 00:34:55,130 Дакле, ако имате неку осетљиву Екцел фајл, то би могло да се овај комад меморије 555 00:34:55,130 --> 00:34:59,770 на диску вашег рачунара, а ја сам само цртање произвољне исту 1с и 0с. 556 00:34:59,770 --> 00:35:03,970 Када превучете фајл као да је то иоур смеће може или отпатке, 557 00:35:03,970 --> 00:35:07,750 Буквално ништа не дешава зато што Аппле и Мицрософт су само одлучио 558 00:35:07,750 --> 00:35:10,450 канта за смеће и отпатке је заиста само привремено чувар места. 559 00:35:10,450 --> 00:35:14,710 Можда на крају ОС ће то испразнити за вас, али обично то не раде ништа, 560 00:35:14,710 --> 00:35:17,090 барем док си стварно ниско на простор. 561 00:35:17,090 --> 00:35:20,870 >> Међутим, када одете на празан смеће или празно корпу за отпатке, 562 00:35:20,870 --> 00:35:23,460 Слично, ништа се дешава са овом сликом. 563 00:35:23,460 --> 00:35:28,590 Све што се дешава је на другом месту на вашем рачунару, постоји нека врста табеле. 564 00:35:28,590 --> 00:35:35,400 То је нешто као мало преварити лист који каже да је, рецимо, ресуме.доц, 565 00:35:35,400 --> 00:35:40,920 тако да ваш резиме у Мицрософт Ворд датотеци живели на локацији 123 на вашем хард диску, 566 00:35:40,920 --> 00:35:43,710 није у меморији, а не у РАМ, већ на вашем хард диску, 567 00:35:43,710 --> 00:35:49,050 и твоји скетцхи ЈПЕГ живи на 456 и ваш Екцел фајл живи на 789 или где год. 568 00:35:49,050 --> 00:35:53,640 Када избришете фајлове заправо пражњења отпада или отпатке, 569 00:35:53,640 --> 00:35:59,530 ова слика не мења. 0с и 1с на вашем хард диску не иде нигде. 570 00:35:59,530 --> 00:36:03,930 Али ово сто овај мали база сорти, ради промене. 571 00:36:03,930 --> 00:36:08,750 Када избришете свој ЦВ, то је као да се брише фајл у неком смислу, 572 00:36:08,750 --> 00:36:12,790 али све је то рачунар заборавити где је та ствар живи на вашем хард диску. 573 00:36:12,790 --> 00:36:17,870 0с и 1с да саставите свој ЦВ или било ових других датотека још увек нетакнута. 574 00:36:17,870 --> 00:36:21,960 >> Дакле, ако сте то урадили случајно, и даље постоји не-нула вероватноћа 575 00:36:21,960 --> 00:36:25,800 да можете да се опорави податке на Нортон Утилитиес или неки комерцијални софтвер 576 00:36:25,800 --> 00:36:29,810 чија сврха у животу је да пронађе 0с и 1с који су на неки начин биле сирочад, 577 00:36:29,810 --> 00:36:33,300 заборавио овде, али оставио овде, тако да можете да вратите податке. 578 00:36:33,300 --> 00:36:38,410 Или форензички истражитељи са полицијом или ФБИ би заправо узети хард диск 579 00:36:38,410 --> 00:36:42,550 и заправо траже обрасце 0с и 1с да изгледа као ЈПЕГ, изгледају као Екцел фајлове, 580 00:36:42,550 --> 00:36:46,400 и да им на тај начин поврати чак и ако рачунар има их заборавио тамо. 581 00:36:46,400 --> 00:36:49,820 Дакле, једини начин да заиста брисање података, као што ћемо разговарати у будућности, 582 00:36:49,820 --> 00:36:54,190 је да се рибати или обришите датотеку или хард диску - 583 00:36:54,190 --> 00:36:56,540 Ви стварно не могу отарасити 0с и 1с 584 00:36:56,540 --> 00:36:59,440 јер у супротном ћеш почети са гигабајта хард диск 585 00:36:59,440 --> 00:37:02,380 а ти ћеш завршити са мегабите хард диск, ако сте стално били брисање 586 00:37:02,380 --> 00:37:04,380 буквално, 0с и 1с. 587 00:37:04,380 --> 00:37:06,310 Дакле, шта би ти урадио да си заиста желео да покрију своје нумере 588 00:37:06,310 --> 00:37:10,510 а основни проблем је у томе што још увек постоји 0с и 1с на диску? 589 00:37:10,510 --> 00:37:14,930 Видим некога гестицулатинг да сте физички ће сломити уређај. То ће радити. 590 00:37:14,930 --> 00:37:19,600 [Смех] Али, ако је то нека врста скупих решења, што ће бити више разумно? 591 00:37:19,600 --> 00:37:23,270 Да. >> [Ученик] Замени их. >> Оверврите их шта? >> [Ученик] Остали подаци. 592 00:37:23,270 --> 00:37:29,070 Остали подаци. Можете само да замени диск са 0с или 1с или 0с све, све 1с. 593 00:37:29,070 --> 00:37:31,230 >> И то је заиста оно што неки од софтвера ради. 594 00:37:31,230 --> 00:37:33,570 Можете купити софтвер или чак и добити бесплатан софтвер, 595 00:37:33,570 --> 00:37:36,610 па чак и уграђена у Мац ОС ових дана, нешто мање у оперативном систему Виндовс, 596 00:37:36,610 --> 00:37:38,660 је способност да безбедно избрисати. 597 00:37:38,660 --> 00:37:41,960 Заправо, ако желите да све рун куће данас, ако имате Мац и урадили, 598 00:37:41,960 --> 00:37:45,740 ако имаш неке ствари у вашем смеће може, можете да урадите Сецуре Испразни смеће, 599 00:37:45,740 --> 00:37:47,610 који ради управо то. 600 00:37:47,610 --> 00:37:53,350 Уместо само брисања фајлова овде, то не брише 0с и 1с овде, 601 00:37:53,350 --> 00:38:01,240 уместо тога, она само мења их, на пример, да 0с и тачка, тачка, тачка. 602 00:38:01,240 --> 00:38:05,330 Дакле, једна од ваших будућих псетс ће заправо бити намерно опорави податке - 603 00:38:05,330 --> 00:38:08,430 фотографије које смо узети људи, места и ствари на кампусу 604 00:38:08,430 --> 00:38:12,810 за који ћемо направити форензичку слику меморијске картице дигиталног фотоапарата је, 605 00:38:12,810 --> 00:38:17,120 што је тачно иста идеја - а ви ћете морати да се изазов да пронађу ствари 606 00:38:17,120 --> 00:38:20,160 обрасци који представљају ЈПЕГ на вашем хард диску, 607 00:38:20,160 --> 00:38:23,610 налик тој бившој студента чије е-маил Прочитао сам пре неколико недеља није 608 00:38:23,610 --> 00:38:25,860 да се опорави фотографије своје сестре. 609 00:38:25,860 --> 00:38:30,300 Зашто не узмемо овде 5-минута паузе, па ћемо прегруписавање са више меморије. 610 00:38:33,030 --> 00:38:38,610 Дакле, овде је место где се ствари мало ума савијања, али ово је веома моћан корак 611 00:38:38,610 --> 00:38:40,480 ка разумевању све ово више. 612 00:38:40,480 --> 00:38:42,900 Овде је програм који се зове поинтерс.ц. 613 00:38:42,900 --> 00:38:45,430 То је међу узорка код данашњег. 614 00:38:45,430 --> 00:38:51,280 Приметимо да је у првих неколико редова, 19 до 22, а све што радимо је нешто попут ГетСтринг 615 00:38:51,280 --> 00:38:54,460 и враћање адресу, складиштење у С. 616 00:38:54,460 --> 00:38:58,380 Убудуће за псет чак 3 ако желите, али псет 4 и на 617 00:38:58,380 --> 00:39:01,030 где можете почети да предузме ове точкове обуку ван себе, 618 00:39:01,030 --> 00:39:04,030 не постоји разлог да се претварам да ниске постоји. 619 00:39:04,030 --> 00:39:07,030 Свакако је добро да почнем говорећи цхар *. 620 00:39:07,030 --> 00:39:12,610 >> Као на страну, у онлине референци и у књигама често може видети звезду поред променљиве. 621 00:39:12,610 --> 00:39:15,600 Можете чак да видите простор око обе стране њега. 622 00:39:15,600 --> 00:39:17,680 Сви они који су функционално исправна. 623 00:39:17,680 --> 00:39:21,180 За сада, међутим, ми ћемо стандардизују на овом приступу би супер јасно 624 00:39:21,180 --> 00:39:24,000 да цхар * је као да кажете знакова показивач. 625 00:39:24,000 --> 00:39:25,680 То је тип података. 626 00:39:25,680 --> 00:39:28,730 А онда име променљиве с је у овом случају. 627 00:39:28,730 --> 00:39:31,180 Тако смо стечен стринг и ми смо га звали с. 628 00:39:31,180 --> 00:39:35,180 А онда овде приметити да сам заправо ради мало лукавства. 629 00:39:35,180 --> 00:39:39,080 Ово се зове показивача аритметику, која је нека врста супер једноставан. 630 00:39:39,080 --> 00:39:41,790 То само значи да сабира и одузима бројеве до тројке. 631 00:39:41,790 --> 00:39:43,660 Али ово стварно ради. 632 00:39:43,660 --> 00:39:49,170 Овај програм је очигледно штампа 1 карактер по линији тако да крајњи резултат стринга с - 633 00:39:49,170 --> 00:39:54,920 Само тако можемо да поквари где ово иде, да показиваче, трчи тројки, пусти ме унутра увећали 634 00:39:54,920 --> 00:39:58,940 Сада ми дозволите тип у нечему као што је здраво и тип Ентер 635 00:39:58,940 --> 00:40:01,080 и штампа 1 карактер по линији. 636 00:40:01,080 --> 00:40:04,730 До пре друго, ми бисмо то урадили са квадратном брацкет нотацији. 637 00:40:04,730 --> 00:40:09,760 Ми би имали за петље и да ћемо урадити принтф од с [и] и да ћемо то опет и опет и опет 638 00:40:09,760 --> 00:40:11,950 са обрнуте косе н на крају сваког реда. 639 00:40:11,950 --> 00:40:16,800 Али овај програм је другачији. Овај програм се користи, буквално, аритметике. 640 00:40:16,800 --> 00:40:18,860 Дакле, шта се овде дешава? 641 00:40:18,860 --> 00:40:24,720 Пре свега, пре него што се ова петља извршава чак шта, само да буде јасно, с је у ствари? 642 00:40:24,720 --> 00:40:27,270 С? >> [Ученик] адреса. >> Адреса. 643 00:40:27,270 --> 00:40:32,980 >> И то је адреса, у случају здраво, први знак у том речју, која је х. 644 00:40:32,980 --> 00:40:37,370 Тако е, у овом конкретном примеру, адреса х. 645 00:40:37,370 --> 00:40:41,850 Дакле, шта то значи с до + и? 646 00:40:41,850 --> 00:40:46,280 Па, почиње у 0 у ово за петљу. Урадили смо то много пута. 647 00:40:46,280 --> 00:40:49,760 Ја се да идем до дужине стринга, очигледно. 648 00:40:49,760 --> 00:40:53,950 Дакле, на првој итерацији ове петље, и је очигледно 0. 649 00:40:53,950 --> 00:41:01,740 Дакле, овај израз говори с + и - а, с +0--то је очигледно само с. 650 00:41:01,740 --> 00:41:04,320 Дакле, шта је с * овде? 651 00:41:04,320 --> 00:41:08,530 Сада смо помоћу звезду на мало другачији начин. 652 00:41:08,530 --> 00:41:13,080 Дозволите ми да иде напред и ослободити од т, јер смо урадили говори о т и копије с. 653 00:41:13,080 --> 00:41:15,540 Сада само желимо да испричају причу укључује е. 654 00:41:15,540 --> 00:41:20,090 И тако, у овом тренутку, пошто типа стринг, наш свет изгледа сасвим као што је било раније 655 00:41:20,090 --> 00:41:26,630 са само с складиштење адресу х и генерално указује на ниску здраво. 656 00:41:26,630 --> 00:41:33,170 Ако ја сада линију као * (а + и), хајде да пробамо ово. 657 00:41:33,170 --> 00:41:40,140 Дакле * (а + и). Дозволите ми да поједностави јер то је 0, тако да је ово * (а +0). 658 00:41:40,140 --> 00:41:43,790 Па, чекај мало. Поједноставите даље. Ово је * (с). 659 00:41:43,790 --> 00:41:47,020 Па, сад заграде су некако глупи, па сад хајде да уради * е. 660 00:41:47,020 --> 00:41:50,540 Дакле, у првој итерацији ове петље, да линија која је истакнута, 26, 661 00:41:50,540 --> 00:41:53,650 је прилично еквивалент штампа ово. 662 00:41:53,650 --> 00:41:56,040 Шта је тип података * с? 663 00:41:56,040 --> 00:42:00,770 У том контексту, јер је звезда се дешава да се поред самог с, 664 00:42:00,770 --> 00:42:04,930 али конкретно, јер ми се више не декларисање с, 665 00:42:04,930 --> 00:42:09,730 нећемо више ствара променљиву, нема ни помена о цхар * у линији 26, 666 00:42:09,730 --> 00:42:14,280 нема помена о кључној речи ниске, ми само користимо променљиву зове с 667 00:42:14,280 --> 00:42:19,650 Испоставило се сада звезда има мало другачији и, признајем, збуњује значење. 668 00:42:19,650 --> 00:42:26,590 * И овде значи ићи на адресу у с и штампани год је тамо. 669 00:42:26,590 --> 00:42:33,750 Тако је овде је * е је - нешто као Цхутес и лестве, следите стрелицу - овде. 670 00:42:33,750 --> 00:42:35,850 Дакле, ово је * е. 671 00:42:35,850 --> 00:42:39,060 >> Па шта буде одштампан на првој итерацији те петље у складу 26? 672 00:42:39,060 --> 00:42:42,170 Ја штампати% Ц, који је чувар места за карактера, 673 00:42:42,170 --> 00:42:48,520 онда \ н за нову линију. * (А + и) где је ја 0 је управо то. 674 00:42:48,520 --> 00:42:53,670 Па шта знак да поставите у за% ц? Х. 675 00:42:53,670 --> 00:42:56,900 У наредном итерацији петље - вероватно можете да видите где ово иде - 676 00:42:56,900 --> 00:43:01,350 следећа итерација и очигледно је 1, па то значи с +1, 677 00:43:01,350 --> 00:43:05,580 и онда сад не требају јер сада заграде звезда мора да каже 678 00:43:05,580 --> 00:43:08,620 идите на меморијску адресу с +1. 679 00:43:08,620 --> 00:43:14,170 Шта је с? Хајде да врати у прошлост и рећи ово стрелица сада није стварно нам раде све услуге. 680 00:43:14,170 --> 00:43:18,450 Нека је тачније рећи да је ово чување броја 123 681 00:43:18,450 --> 00:43:25,110 јер почетак овог низа здраво, ово је адреса 123, то је 124, и тако даље. 682 00:43:25,110 --> 00:43:30,550 Дакле, на другој итерацији када кажем с +1, то је као да кажеш 123 +1, 683 00:43:30,550 --> 00:43:35,340 иначе познат као 124, па шта буде знак одштампан на другој итерацији? 684 00:43:35,340 --> 00:43:37,850 Е на меморијску адресу 124. 685 00:43:37,850 --> 00:43:44,440 Онда опет +, 125, 126, 127, и то петља срећу зауставља пре него што смо дошли овде 686 00:43:44,440 --> 00:43:49,040 зато ја користим стрлен да се уверите да ја не рачуна превише висока. 687 00:43:49,040 --> 00:43:50,810 Дакле, и то је то. 688 00:43:50,810 --> 00:43:55,000 Опет, ово је само као да смо урадили пре недељу дана. 689 00:43:55,000 --> 00:43:59,200 Пусти ме да пишем на линији испод иако не желимо да обоје. 690 00:43:59,200 --> 00:44:02,500 Ово је идентична сада ово. 691 00:44:02,500 --> 00:44:08,310 >> Дакле, иако је с стринг, као што смо то звали недељама, а стварно је знак *. 692 00:44:08,310 --> 00:44:13,270 Дакле, ако желимо да будемо супер анални, то је заиста прави писати специфичан карактер 693 00:44:13,270 --> 00:44:17,490 на-тог места коришћењем ове нумеричке адресе и овај стар оператера, 694 00:44:17,490 --> 00:44:20,470 али искрено, ово је тако много чистији. Дакле, ово није лоше. 695 00:44:20,470 --> 00:44:26,720 Нема разлога да престанем да радим овде линију 27, али 26 је функционално исти, 696 00:44:26,720 --> 00:44:31,570 и то је функционално иста за тачно разлога које смо до сада расправљали. 697 00:44:31,570 --> 00:44:33,650 И на крају, 29 је само добра пракса. 698 00:44:33,650 --> 00:44:38,420 Позивање без с значи да сада сте враћању меморију коју ти је дао ГетСтринг 699 00:44:38,420 --> 00:44:41,630 јер опет, као што сам поменуо понедељак, ГетСтринг недељама 700 00:44:41,630 --> 00:44:44,180 је увођење буба у свој код. 701 00:44:44,180 --> 00:44:46,490 Ваш код за недеља је имала меморије цурења 702 00:44:46,490 --> 00:44:49,970 где сте били питате ГетСтринг за меморију, али никада нисам био то враћању. 703 00:44:49,970 --> 00:44:53,410 И то је намерно изабрала нас педагошки 704 00:44:53,410 --> 00:44:55,880 само зато што је превише да размишљају о томе рано. 705 00:44:55,880 --> 00:44:57,710 Али сада нам треба више симетрију. 706 00:44:57,710 --> 00:45:00,830 Ако питате рачунар за меморију, као што је случај са ГетСтринг, 707 00:45:00,830 --> 00:45:02,820 као што је случај очигледно за маллоц, 708 00:45:02,820 --> 00:45:07,970 Сада морате да псет 4 па надаље, такође бесплатно таква меморија. 709 00:45:07,970 --> 00:45:11,650 Обратите пажњу да је ово другачије од казивања инт н. 710 00:45:11,650 --> 00:45:15,040 Не треба да се ослободи јер нисте звати ГетСтринг 711 00:45:15,040 --> 00:45:16,890 и није назвао маллоц. 712 00:45:16,890 --> 00:45:20,610 >> А чак и ако се зове ГетИнт као што смо на крају ћемо видети, 713 00:45:20,610 --> 00:45:25,520 ГетИнт не издваја меморију за вас, јер ви заправо може да прође око бројеве 714 00:45:25,520 --> 00:45:29,430 и пловци и слова само начин на који смо радили недељама. 715 00:45:29,430 --> 00:45:33,960 Жице, иако су посебна јер заиста они спајање више карактера. 716 00:45:33,960 --> 00:45:37,450 Дакле, они су само другачији од цхарс и флоатс и Интс и слично. 717 00:45:37,450 --> 00:45:39,980 Али ми ћемо се вратити на то пре дуго. 718 00:45:39,980 --> 00:45:44,920 Сва питања онда на овом почетку тројке? Да. 719 00:45:44,920 --> 00:45:49,690 [Нечујан ученик питање] 720 00:45:49,690 --> 00:45:51,440 Ах, веома добро питање. 721 00:45:51,440 --> 00:45:55,790 Једна од ретких ствари Ц заправо за вас, што је згодно, 722 00:45:55,790 --> 00:46:00,110 се она схвати шта је за тебе величина је од типа података 723 00:46:00,110 --> 00:46:03,060 и онда то ради некако мултипликације за вас. 724 00:46:03,060 --> 00:46:06,610 То је небитно у случају цхарс, јер готово увек знак је 1 бајт, 725 00:46:06,610 --> 00:46:08,150 па то само ради. 726 00:46:08,150 --> 00:46:11,220 Али зарад дискусије, ако сте заиста били штампање целих бројева 727 00:46:11,220 --> 00:46:15,500 а ви сте покушавали да одштампате неке с вредност која је показујући на цео број, 728 00:46:15,500 --> 00:46:20,720 не слично би требало да урадите + 4 * и само зато инт је 4 бајта. 729 00:46:20,720 --> 00:46:25,780 Показивач аритметика значи да Ц и преводилац учинити све да математику за вас. 730 00:46:25,780 --> 00:46:29,190 Све што треба да брине о томе је пребројавање у врсти људском смислу. Да. 731 00:46:29,190 --> 00:46:35,200 [Ученик] Ако прогласи низ унутра фор петљи, не морате да га ослободи касније? 732 00:46:35,200 --> 00:46:36,760 Добро питање. 733 00:46:36,760 --> 00:46:41,390 >> Ако прогласио стринг унутар за петљу, да ли треба да га ослободи касније? 734 00:46:41,390 --> 00:46:47,520 Потребно је само да се ослободи меморија да издвоји са ГетСтринг или маллоц. 735 00:46:47,520 --> 00:46:53,110 Дакле, ако сте рекли нешто као - пусти ме да витичасте заграде сада толико сви код односи. 736 00:46:53,110 --> 00:46:58,580 Ако сте урадили нешто, мада буггили, овако, цхар * т = с 737 00:46:58,580 --> 00:47:03,450 не треба да ослободе т т јер није укључивало било какво помињање маллоц или ГетСтринг. 738 00:47:03,450 --> 00:47:08,960 Ако насупрот томе што је ово урадио, ГетСтринг, онда да, ви би требало да ослободе Т. 739 00:47:08,960 --> 00:47:14,350 А у ствари, ваша једина шанса да се то уради је сада унутар ове петље, за исто питање обима 740 00:47:14,350 --> 00:47:16,060 да смо разговарали у прошлости. 741 00:47:16,060 --> 00:47:18,830 Иначе ћеш се додељује меморију, додељује меморију додељивања меморије, 742 00:47:18,830 --> 00:47:21,230 и на крају програма, јер си изван тог петље, 743 00:47:21,230 --> 00:47:24,240 Т не постоји, али никада није рекао оперативни систем 744 00:47:24,240 --> 00:47:26,750 да ниси висе треба тај меморију. 745 00:47:26,750 --> 00:47:30,430 И пре него што дуго, за псет 4 или 5 ћемо вас опремити са програмом под називом Валгринд, 746 00:47:30,430 --> 00:47:34,160 који је сличан у духу да ГДБ у томе што је донекле има неког тајно интерфејса, 747 00:47:34,160 --> 00:47:35,750 али његова сврха у животу је да вам помогне. 748 00:47:35,750 --> 00:47:39,380 И Валгринд је програм који ће у будућности тражити своје програме 749 00:47:39,380 --> 00:47:42,550 у потрази за меморијске цурења, било из ГетСтринг или маллоц, 750 00:47:42,550 --> 00:47:47,800 што ћемо почети користите све више као што престану да користе библиотеку ЦС50 толико. 751 00:47:47,800 --> 00:47:53,030 Ми сада коначно имамо неку врсту речника и врсти менталног модела у теорији 752 00:47:53,030 --> 00:47:55,170 са којима се реши овај сломљену програм. 753 00:47:55,170 --> 00:47:59,410 >> Дакле, у овом сломљеном програму, своп ради унутар свап, 754 00:47:59,410 --> 00:48:05,280 али је заправо никада није радио у главни јер главни прошао у Кс и И, бележења, 755 00:48:05,280 --> 00:48:07,260 и они су усвојени у вредностима, да тако кажем. 756 00:48:07,260 --> 00:48:09,330 Копије њих су добили замене. 757 00:48:09,330 --> 00:48:12,520 До краја свап, и б су заиста били размењени, 758 00:48:12,520 --> 00:48:16,120 али наравно к и и, као што смо разговарали у понедељак, није било. 759 00:48:16,120 --> 00:48:19,940 Зато предлажем у зелено да ово је заправо овде решење. 760 00:48:19,940 --> 00:48:22,640 И заправо, дозволите ми да померим моје звезде само да буде у складу 761 00:48:22,640 --> 00:48:24,440 иако, опет, функционално то није битно. 762 00:48:24,440 --> 00:48:28,730 У наредним недељама ћемо објаснити када и зашто је то битно. 763 00:48:28,730 --> 00:48:30,600 Дакле, у зеленом сада је решење. 764 00:48:30,600 --> 00:48:33,700 Искрено, то изгледа много гадније, јер имам све ове звезде. 765 00:48:33,700 --> 00:48:35,380 Дозволите ми да истакнем једну ствар. 766 00:48:35,380 --> 00:48:40,040 Горња линија овде где пише инт * а инт * б 767 00:48:40,040 --> 00:48:42,820 фундаментално раде исту ствар као што је увек има. 768 00:48:42,820 --> 00:48:47,070 То је прогласио 2 аргументе или параметре да замени, 769 00:48:47,070 --> 00:48:49,940 први који је инт показивач зове, 770 00:48:49,940 --> 00:48:53,100 Други који је инт показивач зове б. 771 00:48:53,100 --> 00:48:55,770 Једина ствар која је нова у овом тренутку је чињеница да ту нема звезда. 772 00:48:55,770 --> 00:48:59,340 >> Шта то значи? Није инт б није инт. 773 00:48:59,340 --> 00:49:04,100 Је адреса једног инт и б је адреса другог инт. 774 00:49:04,100 --> 00:49:06,980 Овде доле, ово је место где сам признајем Ц добија збуњујуће. 775 00:49:06,980 --> 00:49:09,790 Сада смо помоћу звезду, али има другачије значење у овом контексту. 776 00:49:09,790 --> 00:49:13,150 Зато нећемо проглашења тројке као што смо ми овде, 777 00:49:13,150 --> 00:49:15,500 Овде смо дереференцинг ствари. 778 00:49:15,500 --> 00:49:21,520 Дакле технички, звезда у овом контексту првог, другог и трећег реда унутар своп 779 00:49:21,520 --> 00:49:24,560 је дереференце оператера, што само значи да одем тамо. 780 00:49:24,560 --> 00:49:27,400 Дакле, баш као и мој прст пратили на стрелицу х, 781 00:49:27,400 --> 00:49:31,100 * Средство ићи на ту адресу и наћи ми инт која је тамо. 782 00:49:31,100 --> 00:49:34,250 * Б средства иду на адресу и донесе ми шта је тамо. 783 00:49:34,250 --> 00:49:40,730 Дакле, хајде да прекраја слику од понедељка сада користи гомилу оквире, 784 00:49:40,730 --> 00:49:43,130 дно од којих ће бити главни, 785 00:49:43,130 --> 00:49:47,600 горњи од којих ће бити замењени, 786 00:49:47,600 --> 00:49:50,880 тако да је наш свет изгледа, баш као и понедељак, овако. 787 00:49:50,880 --> 00:49:53,620 Овде је комад меморије да је главни ће користити. 788 00:49:53,620 --> 00:49:56,520 >> Подсетимо, од понедељка да програм управо имао 2 променљиве 789 00:49:56,520 --> 00:50:01,930 једна се зове к и један под називом год, а ја сам ставио бројевима 1 и 2 тамо. 790 00:50:01,930 --> 00:50:06,580 Сада када зовем замене као што сам урадио у понедељак, 791 00:50:06,580 --> 00:50:11,000 раније када сам користио црвену верзију овог програма, који изгледа овако, 792 00:50:11,000 --> 00:50:17,470 Имам 2 параметра, и Б, а шта ми пишемо овде и овде? 793 00:50:17,470 --> 00:50:21,160 Само 1 и 2, буквално копије кии. 794 00:50:21,160 --> 00:50:23,070 Данас смо то променити. 795 00:50:23,070 --> 00:50:28,510 Данас, уместо доношења у Интс и б ћемо проћи у 2 адресе. 796 00:50:28,510 --> 00:50:34,290 Те адресе се деси да се укаже на Интс, али те адресе нису сами Интс. 797 00:50:34,290 --> 00:50:37,330 Они су адресе. То је као поштанску адресу уместо. 798 00:50:37,330 --> 00:50:40,580 Зато сада морамо да само себи дају мало више детаља на екрану. 799 00:50:40,580 --> 00:50:43,250 Ово је мој рачунар меморија као што је био цео дан. 800 00:50:43,250 --> 00:50:45,120 Сада нам је потребно мало произвољно нумерисања шему. 801 00:50:45,120 --> 00:50:50,580 Дакле, хајде да кажемо, само случајно, да је ово сећање адреса 123, 124. 802 00:50:50,580 --> 00:50:55,660 Рецимо да је ово 125, ово је 126, и тако даље, али то је потпуно произвољна. 803 00:50:55,660 --> 00:50:58,590 Ми само треба мало шему нумерисања у мом сећању. 804 00:50:58,590 --> 00:51:04,030 Дакле, сада када сам прошао у кии, ја нећу да прође у кии; 805 00:51:04,030 --> 00:51:08,400 Идем да прође у поштанску адресу, да тако кажемо, од к и и 806 00:51:08,400 --> 00:51:11,870 тако да оно што добија складишти овде и овде није 1 и 2, 807 00:51:11,870 --> 00:51:16,030 али ако можете да видите мој мали текст, оно бива донет овде и овде? 808 00:51:16,030 --> 00:51:23,340 [Нечујан ученик одговор] >> Тачно. 123 добија се овде стави и 124 добија ставити овде. 809 00:51:23,340 --> 00:51:28,910 >> Сада, пошто сам користио звезду у овој првој линији начин се овде на врху, 810 00:51:28,910 --> 00:51:34,340 мој програм једноставно зна да је 123 и 124, иако су очигледно су цели бројеви 811 00:51:34,340 --> 00:51:40,160 да би свако људско примете, требало би да се тумачи као адреса, нумеричке адресе. 812 00:51:40,160 --> 00:51:43,250 Они нису по себи Интс, они су адресе, 813 00:51:43,250 --> 00:51:46,120 а то је зато што сам изричито тамо ставио звезде. 814 00:51:46,120 --> 00:51:51,360 Дакле, сада у свом првом, другом, трећем и линије актуелног кода шта се дешава овде? 815 00:51:51,360 --> 00:51:53,380 Хајде да скрене остатак слике. 816 00:51:53,380 --> 00:51:56,980 Тмп је баш као што је било у понедељак. Ништа посебно о тмп. 817 00:51:56,980 --> 00:52:03,060 То је само локални 32 бита променљива, а унутар тога сам очигледно ја складиштење вредност *. 818 00:52:03,060 --> 00:52:08,580 Дакле, ако сам само рекао тмп =, шта бих ја овде ставио? >> [Ученик] 123. 819 00:52:08,580 --> 00:52:10,370 123. Али то није оно што ја радим. 820 00:52:10,370 --> 00:52:13,670 Кажем тмп = *. Звезда значи ићи тамо. 821 00:52:13,670 --> 00:52:19,370 Дакле, овде је, 123. Како да одем тамо? Претварај као да је стрела. 822 00:52:19,370 --> 00:52:24,460 Па, то је то, 1. Па шта буде ускладиштена у тмп, очигледно? Само 1. 823 00:52:24,460 --> 00:52:29,620 Другим речима, тмп је * а, * средство идите на адресу која је тренутно у, 824 00:52:29,620 --> 00:52:31,320 што је очигледно 123. 825 00:52:31,320 --> 00:52:33,910 >> Ок, овде смо на локацији 123, видим број 1, 826 00:52:33,910 --> 00:52:35,670 па ћу тамо стави број 1. 827 00:52:35,670 --> 00:52:39,020 Шта сада да радим у линији 2, * = * б? 828 00:52:39,020 --> 00:52:44,570 Ово је један мало више укључе, јер сада шта је? То је 123. 829 00:52:44,570 --> 00:52:50,220 Дакле * је где? Баш тамо где сам раније био. Па иди тамо. Ок. 830 00:52:50,220 --> 00:52:53,420 Сада, на крају, и коначно ће почети да има смисла, надам се, 831 00:52:53,420 --> 00:53:00,280 * Б значи оно што је у Б? 124. Зато морам да идем тамо, што је за 2. 832 00:53:00,280 --> 00:53:03,430 Па шта сам ставио где? 833 00:53:03,430 --> 00:53:10,100 2 иде у овде, јер * б * иде у. Па ја ћу то да урадим. 834 00:53:10,100 --> 00:53:13,120 И већ се види, можда, да смо толико много ближе 835 00:53:13,120 --> 00:53:17,710 решавању овог глупог, једноставан проблем исправно први пут 836 00:53:17,710 --> 00:53:20,920 јер сада имамо још један сећате шта је било к, 837 00:53:20,920 --> 00:53:23,230 имамо 2 примерка, додуше, и, 838 00:53:23,230 --> 00:53:25,850 али ред 3 сада каже * б. 839 00:53:25,850 --> 00:53:31,080 Дакле, овде је б. * Б значи ићи тамо. Па где је локација 124? 840 00:53:31,080 --> 00:53:35,560 То очигледно је овде. Па шта сам овде ставио? Очигледно, тмп. 841 00:53:35,560 --> 00:53:39,600 Дакле, сада радим ово. Дакле, имам овде 1 и 2 овде. 842 00:53:39,600 --> 00:53:43,560 И шта сада о свему овоме, 123 је 124, а 1? 843 00:53:43,560 --> 00:53:47,910 Чим своп повратка, ова меморија је добра као изгубљена 844 00:53:47,910 --> 00:53:51,070 јер чим своп повратка, оперативни систем 845 00:53:51,070 --> 00:53:54,190 је слободан да користи ту меморију поново у будућности. 846 00:53:54,190 --> 00:53:58,870 Само сећање Главног је на дну ове такозване гомилу лепи около. 847 00:53:58,870 --> 00:54:01,470 >> И тако коначно имамо сада радну верзију. 848 00:54:01,470 --> 00:54:06,310 Пусти ме да идем у свап.ц и приметити следеће. 849 00:54:06,310 --> 00:54:11,280 На врху програма сам променио мој прототип бити инт * а инт * б. 850 00:54:11,280 --> 00:54:15,000 Дакле, једино што сам променио да одем из црвеног, који је био лош, до зелене, што је добро, 851 00:54:15,000 --> 00:54:17,350 је да сам додао ове звезде данас. 852 00:54:17,350 --> 00:54:21,520 Али онда овде доле у ​​себи свап сам морао да копирате, налепите оно што је само на слајду. 853 00:54:21,520 --> 00:54:24,140 Имам звезду овде, звезда овде - који одговара прототип - 854 00:54:24,140 --> 00:54:27,930 и онда све те ствари сада имају звезде, осим за тмп 855 00:54:27,930 --> 00:54:30,680 јер употреба привремене променљиве, ту нема ништа ново. 856 00:54:30,680 --> 00:54:33,040 Треба ми само привремено складиште за инт. 857 00:54:33,040 --> 00:54:34,820 Дакле, ми тамо не треба звезду. 858 00:54:34,820 --> 00:54:39,310 Ми само треба звезду тако да можемо прећи ову врсту произвољне границе 859 00:54:39,310 --> 00:54:42,900 између ове 2 фрејмова у меморији мог рачунара. 860 00:54:42,900 --> 00:54:45,630 Али једна ствар мора да се промени, а можда сте то већ осврнуо. 861 00:54:45,630 --> 00:54:48,810 Шта друга линија је очигледно другачије? >> [Ученик] & к. 862 00:54:48,810 --> 00:54:53,270 >> Да, па 25 је последња линија кода морам да променим за то да раде. 863 00:54:53,270 --> 00:54:58,360 Пре недељу дана, па чак и у понедељак лине 25 изгледала овако, замени Кс и И, 864 00:54:58,360 --> 00:55:02,020 и ово је само сломљена јер ако кажете свап (к, и) 865 00:55:02,020 --> 00:55:05,660 дајете копије кии да мењате, онда ради свој посао, 866 00:55:05,660 --> 00:55:09,080 али никада се заправо мења Кс и И саму. 867 00:55:09,080 --> 00:55:12,880 Дакле, чак и ако никада нисте видели овај лик раније са амперсанд у коду, 868 00:55:12,880 --> 00:55:15,860 Само да претпоставим. Шта амперсанд уради, изгледа? 869 00:55:15,860 --> 00:55:17,890 [Ученик] Узима адресу. >> Такес адресу. 870 00:55:17,890 --> 00:55:21,160 Дакле амперсанд говори дајте ми адресу к. 871 00:55:21,160 --> 00:55:25,590 Ко зна где је? Дешава се да 123. Не занима ме. Само ми дај адресу к. 872 00:55:25,590 --> 00:55:28,340 & И значи дај адресу и. 873 00:55:28,340 --> 00:55:34,450 И у том тренутку прича је савршено у складу са сликом ми нацртао пре тренутак. 874 00:55:34,450 --> 00:55:38,310 >> Тако ћу признати тројки, свакако за мене када сам први пут почео да учим ово, 875 00:55:38,310 --> 00:55:40,570 су дефинитивно једна од најтежих ствари на око замотајте памет. 876 00:55:40,570 --> 00:55:43,760 Али схвати, поготово што чувамо играо са оваквим стварима, 877 00:55:43,760 --> 00:55:48,030 ако га разбити овим супер једноставан врстом интелектуално незанимљив проблема 878 00:55:48,030 --> 00:55:52,270 да само кретање бројева, одговор на много конфузије са показивачима 879 00:55:52,270 --> 00:55:56,590 заиста могу бити изведене из ових основних веома механике. 880 00:55:56,590 --> 00:55:59,070 Ево адреса. Иди тамо са звездом. 881 00:55:59,070 --> 00:56:03,830 Или обрнуто, ево амперсанд. Схватим шта је заправо адреса. 882 00:56:03,830 --> 00:56:06,270 У реду. 883 00:56:06,270 --> 00:56:09,000 Па где је све ове меморије долази? 884 00:56:09,000 --> 00:56:12,360 Сте нацртали смо ову слику неколико пута, а држим обећава да ћемо се вратити на њега, 885 00:56:12,360 --> 00:56:14,920 али овде је репрезентација меморије рачунара 886 00:56:14,920 --> 00:56:17,420 То је мало више од наше означени табли овде. 887 00:56:17,420 --> 00:56:21,590 Текст сегмент на врху представља шта у вези са вашим програмом? 888 00:56:21,590 --> 00:56:26,090 [Нечујан ученик одговор] >> Извини? Реци поново. 889 00:56:26,090 --> 00:56:28,660 [Ученик] Стварни програм. >> Стварни програм. 890 00:56:28,660 --> 00:56:32,430 >> Тако 0с и 1с да сте саставили након писања Ц кода и онда ради кланг 891 00:56:32,430 --> 00:56:35,910 и генерисање до 0 и 1с крајеве стићи ушушкан у меморији 892 00:56:35,910 --> 00:56:38,570 јер када двапут кликнете на икону на вашем Мац или ПЦ 893 00:56:38,570 --> 00:56:43,010 или покрените команду као Марио на ваш брз, ваш 0с и 1с са диска 894 00:56:43,010 --> 00:56:45,700 се учита у меморију, тако да рачунар може да их манипулише 895 00:56:45,700 --> 00:56:47,540 и изврши их брже. 896 00:56:47,540 --> 00:56:50,880 Дакле иницијализују подаци и подаци неиницијализоване, нећемо много говорити о онима, 897 00:56:50,880 --> 00:56:52,420 али они су само глобалне променљиве. 898 00:56:52,420 --> 00:56:54,710 Иницијализују значи глобалне варијабле које сте дали вредности; 899 00:56:54,710 --> 00:56:59,300 неиницијализоване значи глобалне варијабле које нисте још дају вредности. 900 00:56:59,300 --> 00:57:01,900 Затим, ту је ова средина варијабле које сам потпуно ћу таласу моју руку у, 901 00:57:01,900 --> 00:57:04,860 али су ту и да чува ствари попут вашег корисничког имена 902 00:57:04,860 --> 00:57:08,090 и других врста нижих нивоа детаља. 903 00:57:08,090 --> 00:57:12,880 Али јуициест комада распоред вашем сећању је то ствар која се зове стек и хеап. 904 00:57:12,880 --> 00:57:17,470 Стек опет, да буде јасно, је меморија која се користи кад год функције зову, 905 00:57:17,470 --> 00:57:19,710 кад год постоје локалне променљиве 906 00:57:19,710 --> 00:57:22,120 и кад год постоје параметри који се доноси око. 907 00:57:22,120 --> 00:57:24,490 Све што се дешава у стеку. 908 00:57:24,490 --> 00:57:29,570 Гомила нисмо разговарали о томе, али је потребно погодити ко користи гомилу. 909 00:57:31,120 --> 00:57:32,690 Само другачији комад меморије. 910 00:57:32,690 --> 00:57:36,620 То се дешава да се овде извући на врху, али то је произвољна сликовна конвенција. 911 00:57:36,620 --> 00:57:41,670 Ко је наводно користио меморију из гомиле недељама? 912 00:57:41,670 --> 00:57:44,830 То технички ти, али индиректно. >> [Ученик] ГетСтринг. 913 00:57:44,830 --> 00:57:47,950 ГетСтринг и маллоц. Дакле, овде је основна разлика. 914 00:57:47,950 --> 00:57:51,300 >> Знате за последњих неколико недеља да ако вам треба меморије, само прогласити променљиву. 915 00:57:51,300 --> 00:57:54,560 Ако вам је потребно доста меморије, прогласи низ право унутар вашег функције. 916 00:57:54,560 --> 00:57:59,620 Али проблем смо држали пред јесте ако прогласе променљиве локално унутар функција, 917 00:57:59,620 --> 00:58:05,340 чим функција враћа, шта се дешава у меморију и тих варијабли? 918 00:58:05,340 --> 00:58:09,620 Само нека од њега више није твоје, зар не? То је само нестане врсту концептуално. 919 00:58:09,620 --> 00:58:13,950 И даље је физички тамо, очигледно, али то више није ваше право да користите. 920 00:58:13,950 --> 00:58:17,160 Ово је очигледно проблематична ако желите да пишете функције у животу 921 00:58:17,160 --> 00:58:20,440 да заправо додели меморију и не врати одмах. 922 00:58:20,440 --> 00:58:24,180 Случај у тачки: ГетСтринг сврха у животу је да немају појма унапред 923 00:58:24,180 --> 00:58:26,390 колики у низу ћу да куцате на тастатури, 924 00:58:26,390 --> 00:58:30,390 али то мора бити у стању да издвоје меморију држите Давида или здраво 925 00:58:30,390 --> 00:58:32,860 или цео есеј да би корисник је унесе 926 00:58:32,860 --> 00:58:35,280 Дакле ГетСтринг је користио маллоц. 927 00:58:35,280 --> 00:58:38,910 Маллоц стога мора да користи а не гомилу; 928 00:58:38,910 --> 00:58:40,770 уместо тога је користи ову ствар зове крнтија. 929 00:58:40,770 --> 00:58:44,430 Нема ништа другачије меморије. То није брже или спорије, или нешто слично. 930 00:58:44,430 --> 00:58:46,570 То је само физички на другој локацији. 931 00:58:46,570 --> 00:58:50,120 >> Али правило је да меморија која се додељују на гомили 932 00:58:50,120 --> 00:58:56,180 никада неће бити одузета од тебе док не зову - узети гуесс - бесплатно. 933 00:58:56,180 --> 00:59:00,510 Насупрот томе, свако сећање тражиш на стек за само проглашење низ 934 00:59:00,510 --> 00:59:03,320 или декларисање променљиве као што смо радили недељама, 935 00:59:03,320 --> 00:59:05,640 који по дефаулту завршава на стеку. 936 00:59:05,640 --> 00:59:09,550 И то ради велики 90% времена, али на тим ређим приликама 937 00:59:09,550 --> 00:59:12,470 где желите да доделите меморију и задржати га около, 938 00:59:12,470 --> 00:59:14,730 онда морате да користите функцију као маллоц. 939 00:59:14,730 --> 00:59:19,370 Или смо користили функцију као ГетСтринг, који заузврат користи маллоц. 940 00:59:19,370 --> 00:59:23,300 Хајде да видимо где ово може да се пробије и онда завирити у Бинки. 941 00:59:23,300 --> 00:59:25,820 Вратићемо се на то у будућности. 942 00:59:25,820 --> 00:59:29,270 Овде је супер једноставан програм који у прва 2 реда ради шта? 943 00:59:29,270 --> 00:59:33,460 У енглеском језику, шта ове прве 2 линије кода уради унутар главни? 944 00:59:33,460 --> 00:59:35,600 [Нечујан ученик одговор] 945 00:59:35,600 --> 00:59:37,880 Пажљиво. То ми не даје адресу Кс или И. 946 00:59:37,880 --> 00:59:41,840 [Ученик] Даје смернице за Интс. >> Добро. Дај ми 2 показивачи на целе бројеве. 947 00:59:41,840 --> 00:59:45,130 Другим речима, ми 2 комаде меморије које сам задржати цртеж данас, 948 00:59:45,130 --> 00:59:46,950 иако сам га избрисати сада, као квадрата. 949 00:59:46,950 --> 00:59:50,000 Дај ми 2 комаде меморије, један се зове к, и једна се зове - 950 00:59:50,000 --> 00:59:54,320 раније сам их звали с и т - и оно што је тип тог комад меморије? 951 00:59:54,320 --> 00:59:57,160 То ће сачувати адресу. 952 00:59:57,160 --> 00:59:59,110 То је од * типа инт. 953 00:59:59,110 --> 01:00:01,630 >> Дакле, адреса на инт ће на крају живети у к, 954 01:00:01,630 --> 01:00:03,860 адреса једног инт ће на крају живети у и, 955 01:00:03,860 --> 01:00:08,460 али у почетку, шта је унутар кии? Ко зна? Смеће вредности. 956 01:00:08,460 --> 01:00:10,180 То нема никакве везе са тројке. 957 01:00:10,180 --> 01:00:12,720 Ако нисмо ставили нешто тамо, ко зна шта је заправо тамо? 958 01:00:12,720 --> 01:00:18,950 Сада, к. Шта се овде дешава? То је легитиман сада јер је к показивач. То је инт *. 959 01:00:18,950 --> 01:00:21,870 Значи ја могу ставити у к адресу неког комад меморије. 960 01:00:21,870 --> 01:00:25,120 Шта маллоц вратити? Савршено, враћа адресе, 961 01:00:25,120 --> 01:00:28,510 адреса првог бајта у целом комад меморије. 962 01:00:28,510 --> 01:00:31,140 Колико бајтова је ово очигледно додељује, на пример, у апарату? 963 01:00:31,140 --> 01:00:33,510 Шта је величина једног инт? 4. 964 01:00:33,510 --> 01:00:36,600 Ако мислите назад у недељу 1, то није супер важно да се увек сетите да, 965 01:00:36,600 --> 01:00:38,870 али у овом случају то је корисно знати, 4 бајта. 966 01:00:38,870 --> 01:00:41,770 Дакле, ово је додељивање на гомилу 4 бајта 967 01:00:41,770 --> 01:00:46,110 и то се враћа адресу првог ми произвољно. 968 01:00:46,110 --> 01:00:47,700 Сада, шта је к радиш? 969 01:00:47,700 --> 01:00:52,200 * Кс = 42 ради шта? 970 01:00:52,200 --> 01:00:57,150 Ако у овом тренутку у причи имамо Кс, који изгледа овако са неким смеће вредности, 971 01:00:57,150 --> 01:01:04,120 ово је сада и неким смећа вредности, сада у линији 3 сам издвојила 4 бајта. 972 01:01:04,120 --> 01:01:06,950 Ова слика суштини изгледа овако. 973 01:01:06,950 --> 01:01:12,010 Или прецизније, ако је ово произвољна адреса 123, то је оно што наша прича сада изгледа. 974 01:01:12,010 --> 01:01:23,940 * Кс = 42 сада значи шта? То значи отићи на адресу 123 и ставио број 42 тамо. 975 01:01:23,940 --> 01:01:26,220 Не морам да скренем ове редове, јер ми не радимо жице. 976 01:01:26,220 --> 01:01:29,480 >> Требао сам само написао овако, и само ради демонстрационих а, 977 01:01:29,480 --> 01:01:33,240 42 као инт врста заузима много простора, 4 бајта. 978 01:01:33,240 --> 01:01:35,960 Дакле, то је оно што се тамо догодило, али сада постоји проблем. 979 01:01:35,960 --> 01:01:40,580 * И = 13. Шта се дешава овде десити? 980 01:01:40,580 --> 01:01:46,470 Проблем је * и у нашем поједностављеном свету само значи отићи на адресу у и. 981 01:01:46,470 --> 01:01:48,590 Шта је у и? То је нека смеће вредност. 982 01:01:48,590 --> 01:01:53,150 Дакле, хајде да претпоставимо да је то смеће вредност 5551212, нешто лудо тако. 983 01:01:53,150 --> 01:01:56,750 * И средства иду на адресу 5551212. 984 01:01:56,750 --> 01:02:00,450 То је као овде. То не постоји, на пример. 985 01:02:00,450 --> 01:02:05,310 Дакле * и добија 13 средства покушавам да скренем 13 овде. То не постоји. 986 01:02:05,310 --> 01:02:08,790 Сам премашила сам сегмент табле. Шта ја добијам? 987 01:02:08,790 --> 01:02:14,930 То шифровану поруку сегментација крив што ја покушавам да ставим у меморији 988 01:02:14,930 --> 01:02:19,470 вредност као 13, на месту које не постоји. 989 01:02:19,470 --> 01:02:23,900 Остатак програма можда неће радити добро, али до тог тренутка не. 990 01:02:23,900 --> 01:02:25,350 Дакле, хајде да покушамо да испричам ову причу. 991 01:02:25,350 --> 01:02:27,830 Ми ћемо се вратити на то када смо причали о хек. 992 01:02:27,830 --> 01:02:30,290 Хајде да се вратимо на ово и закључи са овим стварима се зове Бинки, 993 01:02:30,290 --> 01:02:33,710 што је присећање Стенфорд професор седи код куће игра са цлаиматион, 994 01:02:33,710 --> 01:02:36,380 да исприча причу о управо тог истог програма. 995 01:02:36,380 --> 01:02:40,580 То је само око 3 минута. Овде имамо Бинки. 996 01:02:40,580 --> 01:02:45,030 [Мушко говорник на видео] Хеј Бинки, пробуди се. То је време за забаву показивача. 997 01:02:45,030 --> 01:02:50,080 [Бинки] Шта је то? Сазнајте више о тројке? О, снаша! 998 01:02:50,080 --> 01:02:53,700 [Мушки говорник] Па, за почетак, мислим да ћемо требати пар тројки. 999 01:02:53,700 --> 01:02:57,890 >> [Бинки] Ок. Овај код издваја 2 тројке које могу указати на целе бројеве. 1000 01:02:57,890 --> 01:03:02,220 [Мушки говорник] Ок. Па, ја видим 2 тројке, али не изгледа да указују на било шта. 1001 01:03:02,220 --> 01:03:05,550 [Бинки] То је тачно. У почетку, показивачи не указују ни на шта. 1002 01:03:05,550 --> 01:03:09,270 Оно што указују на зову поинтеес и постављање их је посебан корак. 1003 01:03:09,270 --> 01:03:12,330 [Мушки говорник] Ох, у реду, у реду. Знао сам то. У поинтеес су одвојене. 1004 01:03:12,330 --> 01:03:15,630 Ер, па како ти додели поинтее? 1005 01:03:15,630 --> 01:03:21,510 [Бинки] Ок. Овај код издваја нову цео поинтее, и тај део поставља к да укаже на то. 1006 01:03:21,510 --> 01:03:23,500 [Мушки говорник] Хеј, то изгледа боље. 1007 01:03:23,500 --> 01:03:26,030 Тако да је то нешто урадити. >> [Бинки] Ок. 1008 01:03:26,030 --> 01:03:30,300 Ја ћу дереференце показивача к да меморишете број 42 у својој поинтее. 1009 01:03:30,300 --> 01:03:34,410 За овај трик ћу морати свој чаробни штапић за дереференцинг. 1010 01:03:34,410 --> 01:03:38,610 [Мушки говорник] Ваш чаробни штапић за дереференцинг? То је одлично. 1011 01:03:38,610 --> 01:03:44,230 [Бинки] Ово је оно што код изгледа. Ја ћу поставити број и ... [Пуцкетања] 1012 01:03:44,230 --> 01:03:46,100 [Мушки говорник] Хеј, погледајте, ево га иде. 1013 01:03:46,100 --> 01:03:50,990 Дакле, ради се о дереференце к следи стрелица за приступ свој поинтее, 1014 01:03:50,990 --> 01:03:53,230 у овом случају за складиштење 42 унутра. 1015 01:03:53,230 --> 01:03:57,630 Хеј, покушајте да користите га да меморишете број 13 кроз друге показивача, и. 1016 01:03:57,630 --> 01:04:03,250 [Бинки] Ок. Ја ћу само отићи овамо, и и добити број 13 поставили 1017 01:04:03,250 --> 01:04:08,360 и онда узети штапић за дереференцинг и само ... [Зујање звук] Вау! 1018 01:04:08,360 --> 01:04:10,980 [Мушки говорник] О хеј, то се не ради. 1019 01:04:10,980 --> 01:04:14,870 >> Рецимо, Бинки, ја не мислим да дереференцинг год је добра идеја 1020 01:04:14,870 --> 01:04:17,880 јер постављање поинтее је посебан корак 1021 01:04:17,880 --> 01:04:19,850 а ја не мислим да смо икада урадили. 1022 01:04:19,850 --> 01:04:21,770 [Бинки] Хм, добра ствар. 1023 01:04:21,770 --> 01:04:26,640 [Мушки говорник] Да. Ми издвојила показивача и али ми никада није постављен да укаже на поинтее. 1024 01:04:26,640 --> 01:04:28,780 [Бинки] Хм, добро запазам. 1025 01:04:28,780 --> 01:04:30,690 [Мушки говорник] Хеј, ти изгледаш добро тамо, Бинки. 1026 01:04:30,690 --> 01:04:34,160 Можеш ли да поправиш како год указује на истом поинтее као Кс? >> [Бинки] Наравно. 1027 01:04:34,160 --> 01:04:37,100 Ја ћу користити свој чаробни штапић за показивач задатка. 1028 01:04:37,100 --> 01:04:39,070 [Мушки говорник] Да ли ће то бити проблем као и раније? 1029 01:04:39,070 --> 01:04:40,840 [Бинки] Не, то не дирајте поинтеес. 1030 01:04:40,840 --> 01:04:44,780 То је само један мења показивач да укаже на исто као и други. [Пуцкетања] 1031 01:04:44,780 --> 01:04:48,570 [Мушки говорник] О, видим. Сада и указује на истом месту као и к. 1032 01:04:48,570 --> 01:04:51,140 Чекај. Сада год је фиксна. Има поинтее. 1033 01:04:51,140 --> 01:04:54,520 Дакле, можете пробати штапић за дереференцинг поново да пошаље 13 Овер. 1034 01:04:54,520 --> 01:04:58,130 [Бинки] Ух, добро. Ево иде. [Пуцкетања] 1035 01:04:58,130 --> 01:05:01,250 [Мушки говорник] Хеј, погледај то. Сада дереференцинг радове на И. 1036 01:05:01,250 --> 01:05:05,200 И зато што се показивачи деле тај један поинтее, обојица виде 13. 1037 01:05:05,200 --> 01:05:06,910 [Бинки] Да, дељење. Год. 1038 01:05:06,910 --> 01:05:08,880 >> Тако ћемо заменити места сада? 1039 01:05:08,880 --> 01:05:11,420 [Мушки говорник] О види, ми смо ван времена. >> [Бинки] Али - 1040 01:05:11,420 --> 01:05:13,880 [Мушки говорник] Само запамтите 3 правила показивач. 1041 01:05:13,880 --> 01:05:18,630 Број 1, основна структура је да имате показивач и то указује више на поинтее. 1042 01:05:18,630 --> 01:05:23,120 Али показивач и поинтее су одвојени, а честа грешка је да подесите показивач 1043 01:05:23,120 --> 01:05:25,680 али да заборавимо да га дају поинтее. 1044 01:05:25,680 --> 01:05:29,580 Број 2, показивач дереференцинг почиње у показивача и прати његову стрелу у 1045 01:05:29,580 --> 01:05:31,060 да приступите свој поинтее. 1046 01:05:31,060 --> 01:05:34,340 Као што сви знамо, ово функционише само ако постоји поинтее, 1047 01:05:34,340 --> 01:05:36,460 која врста враћа на Правило број 1. 1048 01:05:36,460 --> 01:05:39,870 Број 3, показивач додела траје један показивач и мења га 1049 01:05:39,870 --> 01:05:42,390 да укаже на исти поинтее као друга показивачем. 1050 01:05:42,390 --> 01:05:45,890 Дакле, после уступања, 2 показивачи ће указати на исту поинтее. 1051 01:05:45,890 --> 01:05:47,800 Понекад то се зове дељење. 1052 01:05:47,800 --> 01:05:50,910 >> И то је све што је до њега заиста. Ћао сада. 1053 01:05:50,910 --> 01:05:55,840 Ово је Бинки. Ово је ЦС50. Видимо следеће недеље. [Аплауз] 1054 01:05:55,840 --> 01:05:59,000 >> [ЦС50.ТВ]