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 [Това е CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> Това е CS50, и това е края на 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 се публикува на началната страница cs50.net на курса обяснение 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 на проблем, който ще видите на pset, за които имате компютър 17 00:01:00,030 --> 00:01:03,240 дебъгер и други подобни, но няма да има малки кодиране проблеми. 18 00:01:03,240 --> 00:01:06,900 >> И наистина, най-доброто ръководство, за да се получи усещане от това, което CS50 викторини са като 19 00:01:06,900 --> 00:01:09,180 е да отидете на cs50.net, отидете на Викторини връзка, 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 Просто се опитвам да получите някои pset да работят и да знаеш, че 90-95% от пътя 42 00:02:28,160 --> 00:02:32,100 но не можете да намерите някаква проклета бъг, в един проход / не модел, който е нещо добре. 43 00:02:32,100 --> 00:02:36,230 >> Идеята е, че с този механизъм може да отидете фокусира върху другите си psets 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 String е нещо, което е обявено в библиотеката CS50, 53 00:03:09,740 --> 00:03:14,340 специално в този файл, наречен cs50.h, които ние ще започнем да погледнете в тази и следващата седмица. 54 00:03:14,340 --> 00:03:17,250 Но низ е наистина само опростяване на нещо 55 00:03:17,250 --> 00:03:20,980 това е малко по-arcanely описан като знак *. 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 гигабайта RAM, най-вероятно тези дни, 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 Позволете ми да запазите този файл като compare.c, и нека просто се шаблон някакъв код тук 84 00:04:53,060 --> 00:05:00,490 така че да включва stdio.h, нека да отдам включват cs50.h. Ще я увеличите там. 85 00:05:00,490 --> 00:05:05,850 Позволете ми да започнете да пишете INT, главната (свободен), а сега искам да направя нещо подобно: 86 00:05:05,850 --> 00:05:13,520 ФОРМАТ ("Дай ми низ:") и след това аз ще използвам низ и получава GetString 87 00:05:13,520 --> 00:05:16,750 да се получи низ от потребителя, тогава аз ще поиска от потребителя за друго. 88 00:05:16,750 --> 00:05:21,870 ("Дай ми друг низ:"), и аз отивам да ги питам чрез GetString да получите този. 89 00:05:21,870 --> 00:05:27,020 Ще го наречем тон, защото т идва, след като и е хубаво име за низ, ако това е доста общи. 90 00:05:27,020 --> 00:05:30,030 Така GetString и сега просто искам да се направи проверка на здрав разум и аз ще кажа 91 00:05:30,030 --> 00:05:39,770 ако (а == т) тогава аз съм просто ще съобщите на потребителя, ФОРМАТ ("сте написали едно и също нещо \ N!"); 92 00:05:39,770 --> 00:05:45,520 иначе аз отивам да разпечатате нещо подобно ("сте написали нещо различно! \ N") 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 и всъщност беше казано, че HELLO не е HELLO и довиждане не е сбогом. 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 HELLO и HELLO, в който се съхраняват. 110 00:06:44,580 --> 00:06:48,290 Това не е сравнение буквите HELLO отново и отново, 111 00:06:48,290 --> 00:06:52,370 защото това, което наистина се е случило, през цялото това време сме използвали GetString - 112 00:06:52,370 --> 00:06:56,130 Дъската отново е паметта на нашия компютър, 113 00:06:56,130 --> 00:07:00,100 и да кажем, че аз наричам GetString след обявяване на променлива и. 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 Тези от вас, които са смътно запознати с факта, че вашия Mac или PC е 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 може да има много повече RAM, отколкото миналата година. 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 гигабайта RAM или дори 5 гигабайта RAM; 133 00:08:05,270 --> 00:08:07,780 не можете да разчитате, че високите, така че е безполезно. 134 00:08:07,780 --> 00:08:11,430 Може да има достъп само до първите три или четири гигабайта памет на вашия компютър. 135 00:08:11,430 --> 00:08:14,410 Това е по-малко значение сега, и вие може да се купи MacBook Pros и Dells 136 00:08:14,410 --> 00:08:17,680 с 8 гигабайта RAM или дори повече тези дни. 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 Така че нека да вземем това колело обучение изключва, въпреки че ние ще продължим използване на GetString за сега. 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 Какво е това? >> Студент Garbage. >> Garbage. Точно така. 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 Така RAM ни в този момент изглежда така. 157 00:09:30,960 --> 00:09:36,030 Сега от дясната страна на линия 7 се обаждате GetString, 158 00:09:36,030 --> 00:09:40,150 които сме били прави за седмица, но това, което се GetString наистина правят? 159 00:09:40,150 --> 00:09:43,350 GetString написана от CS50 персонал е малко по-интелигентен 160 00:09:43,350 --> 00:09:46,500 че веднага след като потребителят стартира Пишещите клавиши и Хитове Въведете 161 00:09:46,500 --> 00:09:50,010 GetString цифри, колко натискания на клавиши на потребителя хит, 162 00:09:50,010 --> 00:09:53,360 колко знака трябва да се разпределят RAM. 163 00:09:53,360 --> 00:09:55,660 И къде дойде този RAM, кой знае? 164 00:09:55,660 --> 00:09:58,930 Това е някъде на вашия компютър 2 гигабайта или какво ли още не на паметта. 165 00:09:58,930 --> 00:10:05,200 Но нека предположим, че компютърът намерили място за думата HELLO тук. 166 00:10:05,200 --> 00:10:08,710 Думата написах е H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 И ако ние привличаме това като поредица от символи, бихме могли да го привлече по този начин. 168 00:10:13,510 --> 00:10:17,860 Но аз трябва да направя 1 допълнително нещо. Какво принадлежи в края на всеки низ в C? 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 Така че това е HELLO. 174 00:10:33,940 --> 00:10:36,350 >> А какво да кажем в понеделник, че функция като GetString 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 защото конците не съществуват. Те са вид производство в библиотеката CS50. 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 Така че, ако думата ми HELLO свършва до байт номер 123 и след това при байт номер 124, 181 00:11:02,810 --> 00:11:08,320 125, 126 и т.н., ако аз просто броя на байтове ми от 0 нагоре, 182 00:11:08,320 --> 00:11:12,650 това, което наистина GetString се връща, е буквално на номер 123. 183 00:11:12,650 --> 00:11:19,270 Така че това, което се поставя в областта на науката, е номер 123, буквата H, а не думата HELLO, 184 00:11:19,270 --> 00:11:23,130 просто адрес, на който мога да намеря първата буква на HELLO. 185 00:11:23,130 --> 00:11:26,500 Но това не изглежда достатъчно. Попитах ви за низ, не е характер. 186 00:11:26,500 --> 00:11:32,970 И така, как ние или компютър знае, че ELLO вид, заедно с H? 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 сега можете да заключим от това, о, цялата дума е HELLO. 194 00:12:02,160 --> 00:12:04,820 Онези от вас, преди опит в програмирането може да знае в Java 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 Но C е много по-ниско ниво. Няма обекти или класове, ако сте чували тези условия, преди да. 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 Strlen, strlen, който някои от вас сега се използва няколко пъти. Това е доста проста, нали? 206 00:12:51,360 --> 00:12:53,060 Това е като два реда код. 207 00:12:53,060 --> 00:12:56,140 Това е доста много за верига от някакъв вид, може би с допълнителна локална променлива. 208 00:12:56,140 --> 00:13:00,540 Но strlen просто трябва да вземе показалец и след това да започнете да търсите за \ 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 Обаждам GetString отново. 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 Случайно се случи да въведете H-E-L-L-O отново, 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 защото това е различно HELLO от това. 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 Всичко, от което се интересуваме е, че можем да разбера адреса на някаква част от данните като HELLO. 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 защото буквално сега и е насочена най-H и т е насочена в друга H 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 защото сте се обадили GetString два пъти, а GetString не се опитва да бъде супер умен, 243 00:15:09,500 --> 00:15:12,470 тя не се опитва да реализира, о, сте въвели HELLO 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 Ако по-високо ниво, искам да се сравни струните Здравейте и HELLO - 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 Мога да използвам функция, наречена strcmp, S-т-р-в-м-р, 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 вид на почти си пръст на тези две писма, 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 И какво ул. сравнение връщане, ако две струни са едни и същи, очевидно? Zero. 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 И така, какво означава да се проверява, ако == NULL? 288 00:17:45,690 --> 00:17:48,380 Оказва се, че когато ти се обадя функция като GetString 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 но GetString и други функции трябва по някакъв начин крещи на вас 294 00:18:05,130 --> 00:18:06,820 Ако сте поискали твърде много. 295 00:18:06,820 --> 00:18:10,450 И начина, по който GetString прави това е, ако сте помолили за повече памет 296 00:18:10,450 --> 00:18:14,250 отколкото е налична в компютъра, дори ако това е супер, супер малка вероятност 297 00:18:14,250 --> 00:18:17,730 защото никой от нас не ще да въведете един трилион знака и след това натиснете Enter, 298 00:18:17,730 --> 00:18:21,980 но малка вероятност, че тя може да бъде, аз все още искате да проверите за него само в случай, 299 00:18:21,980 --> 00:18:26,120 и специална стойност GetString, отговор и други функции връща 300 00:18:26,120 --> 00:18:30,630 ако нещо не е наред, е NULL във всички капачки. 301 00:18:30,630 --> 00:18:36,520 >> И това, което е NULL? NULL просто така се случва да представляват показалеца. Това е памет адрес 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 Отиваме да го дадете псевдоним на NULL, и отиваме да обещае 305 00:18:49,560 --> 00:18:52,660 , че ние никога няма да вложи реални данни има 306 00:18:52,660 --> 00:18:56,770 защото ние просто произволно се нуждаят от специална стойност 0, известен още като NULL, 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 Имаме всички са съгласни, че NULL нищо средство е върнато, 311 00:19:09,190 --> 00:19:11,700 не е върнат настоящ адрес. 312 00:19:11,700 --> 00:19:15,210 Сега, тук аз съм просто приемането на човешката ми Конвенцията от I върне един от главния 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 Но GetString и всяка функция, която се занимава в паметта се връща NULL, ако има нещо лошо. 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 да се направи копие на S и го наричат ​​тон. 320 00:19:40,120 --> 00:19:45,790 Така че аз не искам на потребителя за две струни този път, аз съм просто казвам стойност в S 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 [Ученик] zeroth характер. >> [Малан] характер zeroth. 329 00:20:15,140 --> 00:20:19,620 Или, по-човешки като първия знак в тона, каквото и да е, H може би в този случай. 330 00:20:19,620 --> 00:20:24,990 И toupper прави това, което казва. Той капитализира на zeroth характер на тон и го променя. 331 00:20:24,990 --> 00:20:28,430 Така че това означава вземе zeroth характер на тон, да я направи главна, 332 00:20:28,430 --> 00:20:30,320 и той се връща в това същото място. 333 00:20:30,320 --> 00:20:35,540 Така че, ако напишете просто 'Здравей' с малки букви, това трябва да се промени малката часа до столицата H. 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 [Ученик] Big H и останалите малки. >> Големият H и останалите малки, за които или тон? 339 00:20:58,360 --> 00:21:03,170 [Ученик] Както. >> Двете. Точно така. Така че нека да видим какво става тук. 340 00:21:03,170 --> 00:21:08,380 >> Нека вървим напред и събират. Това е copy1, така че се copy1. Добре. 341 00:21:08,380 --> 00:21:14,840 Zoom инча Нека отида напред и да работи copy1, Enter, кажи нещо: Здравейте малки. 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 S може да съществува в историята, но нека малки здравей това време. 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 високо ниво, концептуално, това, което ние трябва да направим, за да направи ТП "Вярно с оригинала" на S, очевидно? 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 Така че нека опитаме това. Нека отида в copy2.c. 393 00:24:35,970 --> 00:24:43,270 В copy2.c имаме почти същата програма с изключение на ред 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, но това е само едно. 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 (Strlen (а) + 1) * sizeof (Чар). 406 00:25:25,880 --> 00:25:29,190 Така че, ако ние всъщност мисля, че това чрез това се казва, дайте ми дължината на S. 407 00:25:29,190 --> 00:25:34,440 Защо съм, все пак, добавяйки едно върху дължината? >> Чува студент отговор] 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 за това, защото strlen връща човешко очакване на дължина, 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 [Ученик] Six. >> Six. Точно толкова, колкото имаме въпросителни знаци на екрана. 432 00:27:04,980 --> 00:27:07,800 И след това да вземе Предполагам, че сега на базата на вашето разбиране за GetString 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 Но изчистване, като GetString, връща адреса на първия байт от паметта 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 да използвате цялост на вашия RAM, 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 Има ул. копирате функции в C, но е супер лесно за нас да го направим по старомодния начин. 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 до N, 472 00:29:35,290 --> 00:29:40,940 и на всяка итерация Слагам [] вътрешността на тон [I]. 473 00:29:40,940 --> 00:29:45,060 Така че това е, което аз подразбиращи се с моите две пръсти, сочещи към струните преди. 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 Ние може просто да се каже, по-малка или равна на N, което по принцип е лошо 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 Разпределени strlen ите, така че 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 Освен това, бихме могли да използвате функция, наречена ул. копие, strcpy, 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 Така че нека се опитаме сега. Нека тук. Направете copy2. Ще се увеличат и тичам copy2. 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 Току-що използва тази памет да напише думата здравей две места, 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 това не променя часа или електронна или L или L или о или място за нищо друго. 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 поиска от операционната система за повече памет с GetString или изчистване или нещо подобно, че 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 Това се случва, да се направи с RAM, но вашите компютри 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 или някаква бегла JPEG и го плъзнете в кошчето 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 Sketchy или чувствителни файл е все още само седи там някъде в твърдия ви диск. 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 или изберете File (Файл), Empty Trash или каквото 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 Така че сега историята се променя от RAM, която е мястото, където съществуват програми 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 Така че, ако имате някои чувствителни файл на Excel, може да отнеме това парче на паметта 555 00:34:55,130 --> 00:34:59,770 диск на вашия компютър, и аз съм просто изготвяне същия произволна 1s и 0s. 556 00:34:59,770 --> 00:35:03,970 Когато плъзнете файл, като това в кошчето ви или кошчето, 557 00:35:03,970 --> 00:35:07,750 буквално нищо не се случва, защото Apple и Microsoft току-що реши 558 00:35:07,750 --> 00:35:10,450 кофа за боклук и кошчето наистина е само временно контейнер. 559 00:35:10,450 --> 00:35:14,710 Може би в крайна сметка OS ще го изпразни за вас, но обикновено, тя не прави нищо, 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 Това е нещо като малък лист измама, която казва, че, да речем, resume.doc, 565 00:35:35,400 --> 00:35:40,920 така че вашето резюме в Microsoft Word файл, свикнал да живея на място 123 на вашия твърд диск, 566 00:35:40,920 --> 00:35:43,710 не в паметта, а не в RAM, но на твърдия ви диск, 567 00:35:43,710 --> 00:35:49,050 и схематични живота JPEG 456, и Excel файлове живее на 789 или там, където 568 00:35:49,050 --> 00:35:53,640 Когато изтривате файлове от изпразване на кошчето или в кошчето, 569 00:35:53,640 --> 00:35:59,530 тази картина не се променя. 0s и 1s на вашия твърд диск, не ходи никъде. 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 0s и 1s, че съставяте автобиографията си или някой от тези файлове са все още непокътнати. 574 00:36:17,870 --> 00:36:21,960 >> Така че, ако си направил това случайно, все още има ненулева вероятност 575 00:36:21,960 --> 00:36:25,800 че да можете да възстановите данните си, като използвате Norton Utilities или някакъв комерсиален софтуер 576 00:36:25,800 --> 00:36:29,810 цел, чиято в живота е да се намери 0s и 1s, които са вид сираци, 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 и действително изглежда за модели на 0s и 1s, че прилича на JPEG, изглежда Excel файлове, 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 Вие наистина не може да се отърве на 0s и 1s 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 буквално 0s и 1s. 587 00:37:04,380 --> 00:37:06,310 И така, какво бихте направили, ако наистина искате да покрие песните си 588 00:37:06,310 --> 00:37:10,510 и основният проблем е, че има все още 0s и 1s на диска? 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 Други данни. Можете да замените вашия диск с 0s 1s или всички 0s, всички 1s. 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 и дори построен в Mac OS тези дни, но не толкова в Windows 596 00:37:36,610 --> 00:37:38,660 е способността да изтрие сигурно. 597 00:37:38,660 --> 00:37:41,960 Всъщност, ако искате да всички хоумрън днес, ако имате Mac и да направите това, 598 00:37:41,960 --> 00:37:45,740 ако имаш някои неща в кошчето, можете да направите Secure Empty Trash 599 00:37:45,740 --> 00:37:47,610 което прави точно това. 600 00:37:47,610 --> 00:37:53,350 Вместо само изтрива файлове тук, то не изтрива 0s и 1s тук, 601 00:37:53,350 --> 00:38:01,240 Вместо това, тя просто променя всички тях, например, да 0s и точка, точка, точка. 602 00:38:01,240 --> 00:38:05,330 Така че една на бъдещите си psets ще бъдат реално умишлено възстановяване на данни - 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 модели, които представляват JPEG файлове на вашия хард диск, 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 Ето програма, наречена pointers.c. 613 00:38:42,900 --> 00:38:45,430 Тя е сред примерен код днес. 614 00:38:45,430 --> 00:38:51,280 Забележете, че в първите няколко реда, 19 до 22, всичко, което правим, е нещо като GetString 615 00:38:51,280 --> 00:38:54,460 и връщане на един адрес, да го приберете в областта на науката. 616 00:38:54,460 --> 00:38:58,380 Отсега нататък за pset дори три, ако искате но pset 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 Сега ме пусне тип в нещо като HELLO и вида Enter 635 00:39:58,940 --> 00:40:01,080 и го отпечатва един характер на линия. 636 00:40:01,080 --> 00:40:04,730 До преди секунда, щеше да направи това с квадратна скоба нотация. 637 00:40:04,730 --> 00:40:09,760 Ще имаме за цикъл и ние ще направим ФОРМАТ на S [I] и ние ще го направим отново и отново и отново 638 00:40:09,760 --> 00:40:11,950 с наклонена черта N в края на всеки ред. 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 S? >> [Ученик] адрес. >> Адрес. 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 Така че този израз се казва + I - по-скоро, +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 Позволете ми да отида напред и да се отървете от тон, защото сме готови да говорим за тона и копия от S. 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 Ако аз сега направете линия като * (S + I), нека опитаме това. 657 00:41:33,170 --> 00:41:40,140 Така * (+ I). Позволете ми да се опрости тази процедура, защото това е 0, така че това е * (0). 658 00:41:40,140 --> 00:41:43,790 Е, чакай малко. Допълнително опростяване. Това е * (а). 659 00:41:43,790 --> 00:41:47,020 Е, сега скоби са много глупаво, така че нека сега просто правя * S. 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 има не споменава дума низ, ние сме само с помощта на променлива, наречена S, 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 Печатам% C, която е контейнер за герой, 673 00:42:42,170 --> 00:42:48,520 \ N за нова железопътна линия. * (+ I), където 0 е само това. 674 00:42:48,520 --> 00:42:53,670 Така че това, което Чар мога да поставя в% в? H. 675 00:42:53,670 --> 00:42:56,900 В следващата итерация на цикъла - вероятно можете да видите, когато това се случва - 676 00:42:56,900 --> 00:43:01,350 следващата итерация е очевидно едно, така че това означава и една, 677 00:43:01,350 --> 00:43:05,580 и след това сега трябва скобите, защото сега звездата трябва да каже 678 00:43:05,580 --> 00:43:08,620 отидете на адреса в паметта и една. 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 Така на втората итерация, когато аз казвам, е един, това е като да кажеш, сто двайсет и три един милион, 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 защото аз съм с strlen да се уверите, че аз не се брои твърде висока. 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 ItH място, използването на тези цифровите адреси и тази звезда оператор, 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 Разговори безплатно и означава, че сега сте като паметта че GetString ти даде 699 00:44:38,420 --> 00:44:41,630 защото отново, както споменах понеделник, GetString за седмица 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 която сте били питам GetString за паметта, но никога не сте го върнат. 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 Ако попитате компютър за паметта, както е делото за GetString, 707 00:45:00,830 --> 00:45:02,820 както е в случая очевидно за изчистване, 708 00:45:02,820 --> 00:45:07,970 Сега трябва да за pset 4 нататък също такава памет. 709 00:45:07,970 --> 00:45:11,650 Забележете, това е различно от това да кажа INT N. 710 00:45:11,650 --> 00:45:15,040 Вие не трябва да освободите това, защото не се обади GetString 711 00:45:15,040 --> 00:45:16,890 и не се обади изчистване. 712 00:45:16,890 --> 00:45:20,610 >> И дори ако сте се обадили GetInt, тъй като в крайна сметка ние ще видим, 713 00:45:20,610 --> 00:45:25,520 GetInt не заделя памет за вас, защото всъщност можете да преминават около числа 714 00:45:25,520 --> 00:45:29,430 и поплавъци и символа само начина, по който ние сме били прави в продължение на седмици. 715 00:45:29,430 --> 00:45:33,960 Strings, обаче, са специални, защото наистина те са конкатенация на няколко символа. 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 Едно от малкото неща, C всъщност се прави за вас, което е удобно, 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 Pointer аритметика означава, че C и компилатор, че математиката за вас. 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 Трябва само да освободите памет, които разпределят с GetString или с изчистване. 735 00:46:47,520 --> 00:46:53,110 Така че, ако просто кажете нещо подобно - нека ме фигурни скоби, така че всички код е свързано. 736 00:46:53,110 --> 00:46:58,580 Ако си направил нещо, макар и buggily, като този, Чар * т = 737 00:46:58,580 --> 00:47:03,450 не е нужно безплатни тон, защото не става дума за всяко споменаване на изчистване или GetString. 738 00:47:03,450 --> 00:47:08,960 Ако за разлика от това, GetString, тогава да, ще трябва да се безплатни тон. 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 И не след дълго, за pset 4 или 5 ще ви снабди с програма, наречена Valgrind 746 00:47:30,430 --> 00:47:34,160 която е подобна по дух GDB в това, че има известна степен на тайнствена интерфейс, 747 00:47:34,160 --> 00:47:35,750 но своята цел в живота е да ви помогне. 748 00:47:35,750 --> 00:47:39,380 И Valgrind е програма, която в бъдеще ще търсите програми 749 00:47:39,380 --> 00:47:42,550 търси изтичане на памет, независимо дали от GetString или изчистване, 750 00:47:42,550 --> 00:47:47,800 които ние ще започнете да използвате толкова повече, колкото ние спрете да използвате CS50 библиотеката, както много. 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 но всъщност той никога не е работил в основната защото основният приет през X и Y, изземване, 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 но разбира X и Y, както говорихме в понеделник, не са били. 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 първото от които е INT показалеца нарича 770 00:48:49,940 --> 00:48:53,100 вторият от които е INT показалеца, наречено "б". 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 ние сме тук, dereferencing неща. 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 >> Спомнете си как в понеделник, че програмата има две променливи, 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 Имам две параметри, А и Б, и какво пишете тук и тук? 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 Днес, вместо да преминава в цели числа А и Б, че ще премине в два адреса. 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 , така че това, което се съхраняват тук и тук не е един и два, 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 Сега, ако току-що каза TMP = а, какво ще слагам тук? >> [Ученик] 123. 819 00:52:08,580 --> 00:52:10,370 123. Но това не е това, което правя. 820 00:52:10,370 --> 00:52:13,670 Казвам TMP = * а. Star средства отиват там. 821 00:52:13,670 --> 00:52:19,370 Така че тук е 123. Как да отида там? Преструваме, че има стрелка. 822 00:52:19,370 --> 00:52:24,460 Е, там е едно. Така че това, което се съхранява в ПТУ, очевидно? Само 1. 823 00:52:24,460 --> 00:52:29,620 С други думи, TMP е *, * средство отидете на адреса, на който в момента е в 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 Сега какво да правя в съответствие два, а = * б? 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 имаме две копия, разбира се, г., 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 Така че сега правя това. Така че аз имам една тук и 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 Нека отида в swap.c, и забележите следното. 849 00:54:06,310 --> 00:54:11,280 В горната част на програмата съм се променил прототип да ми Int * а и вътр * б. 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 между тези два кадъра в памет на моя компютър. 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 и това е само счупени, защото ако ти кажа суап (X, Y) 865 00:55:02,020 --> 00:55:05,660 вие давате копия на Х и Y да се сменят, а след това прави нещо, 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 >> Така 0s и 1s, че сте компилирали след писмено C код и след това работи звъня 891 00:56:32,430 --> 00:56:35,910 и генериране на 0s и 1s краищата да сгушено в паметта 892 00:56:35,910 --> 00:56:38,570 защото, когато щракнете два пъти върху иконата на вашия Mac или PC 893 00:56:38,570 --> 00:56:43,010 или изпълнявате команда като Марио си бърз, 0s и 1s от диска 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 Това е технически, но косвено. >> Студент GetString. 913 00:57:44,830 --> 00:57:47,950 GetString и изчистване. Така че тук е основната разлика. 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 Дело в точка: Целта на GetString в живота е да има никаква представа предварително 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 Така GetString е използвал изчистване. 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 Или сме използвали функция като GetString, което от своя страна използва изчистване. 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 Тук е супер проста програма, която в първите два реда какво прави? 943 00:59:29,270 --> 00:59:33,460 На английски език, какво правят тези първи два реда код в рамките на основната? 944 00:59:33,460 --> 00:59:35,600 [Чува студент отговор] 945 00:59:35,600 --> 00:59:37,880 Внимателно. Той не ми даде адреса на Х или Y. 946 00:59:37,880 --> 00:59:41,840 [Ученик] дава насоки за цели числа. >> Добре. Дайте ми две указатели към цели числа. 947 00:59:41,840 --> 00:59:45,130 С други думи, дай ми две парчета памет, която държа рисунка днес, 948 00:59:45,130 --> 00:59:46,950 въпреки че аз го изтри сега, като квадрати. 949 00:59:46,950 --> 00:59:50,000 Дайте ми две парчета памет, наречена X, единият наречен Y - 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 Това е * тип Int. 953 00:59:59,110 --> 01:00:01,630 >> Така адрес на Int в крайна сметка ще живеят в х 954 01:00:01,630 --> 01:00:03,860 адреса на Int в крайна сметка ще живеят в години, 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 Сега, х. Какво се случва тук? Това вече е легитимно защото х е показалеца. Това е INT *. 959 01:00:18,950 --> 01:00:21,870 Така че, това означава, че мога да сложа в х адрес на известно парче на паметта. 960 01:00:21,870 --> 01:00:25,120 Какво означава изчистване се върне? Perfect, той се връща адреси, 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 Какъв е размера на Int? 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 A * х = 42 с какво се занимава? 970 01:00:52,200 --> 01:00:57,150 Ако в този момент в историята имаме Х, който прилича на това с някои боклук стойност, 971 01:00:57,150 --> 01:01:04,120 Сега това е Y с някои боклук стойност, в съответствие три съм заделени 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 като INT вид на заема много място, 4 байта. 978 01:01:33,240 --> 01:01:35,960 Така че това е това, което се е случило там, но има проблем сега. 979 01:01:35,960 --> 01:01:40,580 * Y = 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 * Y средства отиват за справяне с 5551212. 984 01:01:56,750 --> 01:02:00,450 Това е като тук. Той не съществува, например. 985 01:02:00,450 --> 01:02:05,310 Така * Y получава 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 >> [Binky Добре. Този код разпределя 2 указатели, които могат да посочат до цели числа. 1000 01:02:57,890 --> 01:03:02,220 [Мъж говорител] Добре. Е, виждам две указатели, но те не изглежда да бъде насочен към нещо. 1001 01:03:02,220 --> 01:03:05,550 Бинки] Точно така. Първоначално указатели не подсказват с нищо. 1002 01:03:05,550 --> 01:03:09,270 Неща, които те посочват, са наречени pointees, и установяването им е отделна стъпка. 1003 01:03:09,270 --> 01:03:12,330 [Мъж говорител] О, надясно, надясно. Знаех това. Pointees са отделни. 1004 01:03:12,330 --> 01:03:15,630 Er, така че как да ви отпусне pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky Добре. Този код заделя нова цяло число pointee, и тази част определя за да посочите. 1006 01:03:21,510 --> 01:03:23,500 [Мъж говорител] Хей, това изглежда по-добре. 1007 01:03:23,500 --> 01:03:26,030 Така че, да се направи нещо. >> [Binky] Добре. 1008 01:03:26,030 --> 01:03:30,300 Аз ще показалеца х сочен за да съхраните номер 42 в своята pointee. 1009 01:03:30,300 --> 01:03:34,410 За този трик ще имам нужда от моята магическа пръчка dereferencing. 1010 01:03:34,410 --> 01:03:38,610 [Мъж говорител] магическа пръчка на dereferencing? Това е страхотно. 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 Така прави и сочен за х стрелка, за да достъп до pointee си, 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 [Binky Добре. Просто ще отида тук, за да г. и да получите номер 13 1017 01:04:03,250 --> 01:04:08,360 и след това се дюзата на dereferencing и просто ... [Бръмчащ звук] Уау! 1018 01:04:08,360 --> 01:04:10,980 [Мъж говорител] О, хей, това не е работа. 1019 01:04:10,980 --> 01:04:14,870 >> Кажи, Бинки, аз не мисля, че е добра идея dereferencing г. 1020 01:04:14,870 --> 01:04:17,880 , тъй като създаването на pointee е отделна стъпка 1021 01:04:17,880 --> 01:04:19,850 и аз не мисля, че някога го е направил. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Хм, добра точка. 1023 01:04:21,770 --> 01:04:26,640 [Мъж говорител] Да. Разпределени показалеца г., но ние никога няма да го настроите да се отбележи на pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Хм, много наблюдателен. 1025 01:04:28,780 --> 01:04:30,690 [Мъж говорител] Хей, ти изглежда добре там, Бинки. 1026 01:04:30,690 --> 01:04:34,160 Мога ли да го оправиш, така че Y точки към един и същи pointee като х? >> [Binky] Разбира се. 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 [Binky] Не, това не засяга на pointees. 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 Така че, изчакайте. Сега г. е фиксиран. Има pointee. 1033 01:04:51,140 --> 01:04:54,520 Така че можете да опитате дюзата на dereferencing отново да изпрати над 13. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Ух, добре. Тук върви. [Пукащ звук] 1035 01:04:58,130 --> 01:05:01,250 [Мъж говорител] Хей, виж това. Сега dereferencing произведения на годишна. 1036 01:05:01,250 --> 01:05:05,200 И тъй като указатели се споделят, че един pointee, и двамата 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky Да, споделяне. Както и да е. 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 в основната структура е, че имате показалец и го посочва на pointee. 1042 01:05:18,630 --> 01:05:23,120 Но показалеца и pointee са отделни, и честа грешка е да се създаде указател 1043 01:05:23,120 --> 01:05:25,680 а за да забравиш да му се даде pointee. 1044 01:05:25,680 --> 01:05:29,580 Номер 2, показалецът dereferencing започва от показалеца и следва стрелката върху 1045 01:05:29,580 --> 01:05:31,060 да достъп до pointee си. 1046 01:05:31,060 --> 01:05:34,340 Както всички знаем, това работи само ако има pointee, 1047 01:05:34,340 --> 01:05:36,460 какъв вид се върне към Правило номер едно. 1048 01:05:36,460 --> 01:05:39,870 Номер 3, показалецът задача отнема един показалеца и се променя 1049 01:05:39,870 --> 01:05:42,390 да сочи към една и съща pointee като друг показалеца. 1050 01:05:42,390 --> 01:05:45,890 Така че след прехвърлянето, 2 указатели ще посочи със същия pointee. 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 Това е Binky. Това е CS50. Ще се видим следващата седмица. [Аплодисменти] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]