1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Тыдзень 4, працяг] 2 00:00:02,310 --> 00:00:04,240 [David J. малая - Гарвардскі універсітэт] 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 Струнны з'яўляецца тое, што абвешчаныя ў бібліятэцы 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 Char, што мы знаёмыя. Гэта ўсяго толькі адзін знак. 57 00:03:24,090 --> 00:03:28,010 Але * па стане на панядзелак пазначаецца як? >> [Студэнт] паказальнік. 58 00:03:28,010 --> 00:03:31,290 Паказальніка. І што паказальнік? >> [Студэнт] адрас. 59 00:03:31,290 --> 00:03:33,420 >> Гэта ўсё роўна, адрас, месца ў памяці. 60 00:03:33,420 --> 00:03:35,910 Што адрас або месца або памяць? 61 00:03:35,910 --> 00:03:40,290 Зноў жа, ва ўсіх нас ёсць наўтбукі з канцэрту або 2 гігабайта аператыўнай памяці, хутчэй за ўсё, у гэтыя дні, 62 00:03:40,290 --> 00:03:44,160 і гэта азначае, што ў вас ёсць мільярд або 2 млрд. байт варта памяці. 63 00:03:44,160 --> 00:03:46,240 І гэта сапраўды не мае значэння, што гэта фізічна выглядае, 64 00:03:46,240 --> 00:03:51,220 але прыняць на веру, што вы можаце палічыць усе асобныя байты, што ваш уласны ноўтбук - 65 00:03:51,220 --> 00:03:54,580 гэта байт 0, гэта 1 байт, гэта байт 2 млрд. - 66 00:03:54,580 --> 00:03:56,100 і гэта менавіта тое, што кампутар робіць. 67 00:03:56,100 --> 00:04:00,030 Калі вы вылучыць месца для аднаго знака, напрыклад, 68 00:04:00,030 --> 00:04:02,480 ён, відавочна, павінен жыць дзесьці ў памяці кампутара, 69 00:04:02,480 --> 00:04:05,860 і можа быць, гэта на нумар 12345 байт, 70 00:04:05,860 --> 00:04:08,470 і што дзесьці тут, у памяці кампутара. 71 00:04:08,470 --> 00:04:12,630 І адрас, то гэтага сімвала 12345. 72 00:04:12,630 --> 00:04:16,140 >> Зараз, у тыдзень ад 0 да цяпер да гэтага часу, мы сапраўды не клапаціліся 73 00:04:16,140 --> 00:04:19,170 , Дзе ў памяці захоўваюцца рэчы, таму што мы звычайна выкарыстоўваюць сімвалы, 74 00:04:19,170 --> 00:04:22,540 Зменныя і масівы на самай справе атрымаць на нашым дадзеных. 75 00:04:22,540 --> 00:04:24,950 Але, як у панядзелак, а тым больш сёння, вы зараз будзеце мець 76 00:04:24,950 --> 00:04:27,710 Тым больш выразныя магчымасці пры напісанні праграм 77 00:04:27,710 --> 00:04:31,330 каб сапраўды кіраваць памяццю кампутара як вы лічыце патрэбным, 78 00:04:31,330 --> 00:04:33,720 як для добрых мэтаў і дрэнна, 79 00:04:33,720 --> 00:04:39,620 памылкі быць вельмі агульны вынік на дадзены момант у вывучэнні гэтага матэрыялу. 80 00:04:39,620 --> 00:04:42,460 Але што гэта на самай справе значыць быць знак *? 81 00:04:42,460 --> 00:04:46,140 Давайце пойдзем далей назад у - і мы вернемся да Бинки як і абяцаў сёння. 82 00:04:46,140 --> 00:04:48,670 Пойдзем простым прыкладам тут. 83 00:04:48,670 --> 00:04:53,060 Дазвольце мне захаваць гэты файл як 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 Калі (S == т), то я проста хачу, каб паведаміць карыстачу Е ("Вы ўвялі тое ж самае, \ п"); 92 00:05:39,770 --> 00:05:45,520 яшчэ я хачу, каб раздрукаваць нешта накшталт ("Вы ўвялі нешта іншае! \ п") 93 00:05:45,520 --> 00:05:48,460 або што прысуд будзе. Такім чынам, нешта накшталт гэтага. 94 00:05:48,460 --> 00:05:52,200 Затым, як звычайна, я буду вяртаць 0, які проста азначаў, што нічога дрэннага не здарылася, 95 00:05:52,200 --> 00:05:54,400 і я збіраюся ісці наперад і скампіляваць і запусціць гэтую праграму. 96 00:05:54,400 --> 00:05:56,540 >> Але ў панядзелак мы запусцілі гэтую праграму, 97 00:05:56,540 --> 00:06:00,420 і на самай справе было сказана, што прывітання не Добры дзень і бывай ня бывай. 98 00:06:00,420 --> 00:06:03,140 Паводзіны, якое мы бачылі, было крыху больш, як гэта. 99 00:06:03,140 --> 00:06:11,450 Адпусціце мяне ў мой зыходны каталог, павялічыць тут, і давайце зробім зрабіць параўнанне. 100 00:06:11,450 --> 00:06:14,570 Складальнік парадку. Дазвольце мне выканаць параўнанне. Дайце мне радкі: Добры дзень. 101 00:06:14,570 --> 00:06:16,300 Дайце мне іншую радок: Добры дзень. 102 00:06:16,300 --> 00:06:18,000 Вы ўвялі нешта іншае! 103 00:06:18,000 --> 00:06:22,650 Ну, давайце я паспрабую што-небудзь прасцей, як 50, 50. Вы ўвялі нешта іншае! 104 00:06:22,650 --> 00:06:25,740 прывітанне, прывітанне. Такім чынам, ясна, што нешта тут адбываецца. 105 00:06:25,740 --> 00:06:28,440 Але якое ж было тлумачэнне, чаму? 106 00:06:28,440 --> 00:06:33,850 Мабыць, лінія 12 цалкам функцыянуе. 107 00:06:34,300 --> 00:06:39,430 Якая асноўная праблема тут? Так. >> [Студэнт] Гэта параўнанне адрасоў. 108 00:06:39,430 --> 00:06:41,850 Так, менавіта так. Гэта на самай справе параўнання адрасоў 109 00:06:41,850 --> 00:06:44,580 , У якім ПРЫВІТАННЕ ПРЫВІТАННЕ і захоўваюцца. 110 00:06:44,580 --> 00:06:48,290 Гэта не параўнанне літар ПРЫВІТАННЕ зноў і зноў, 111 00:06:48,290 --> 00:06:52,370 таму што тое, што адбылося на самай справе, увесь гэты час мы выкарыстоўвалі 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 біт. Гэта так жа, як Int. 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 можа мець значна больш памяці, чым мінулага. 124 00:07:35,560 --> 00:07:39,240 Карацей кажучы, яшчэ ў той дзень, калі кампутары выкарыстоўваюцца толькі 32 біт 125 00:07:39,240 --> 00:07:42,740 для прадстаўлення адрасоў, найбольшая колькасць байт вы маглі б прадстаўляць 126 00:07:42,740 --> 00:07:46,280 У гэтым выпадку было тое, што калі ў вас ёсць 32 біт? 127 00:07:46,280 --> 00:07:49,590 Такім чынам, 4 млрд, маюць рацыю, таму што ад 2 да 32, 4 мільярды даляраў. 128 00:07:49,590 --> 00:07:51,370 Гэты лік было паўтарэння ў курсе. 129 00:07:51,370 --> 00:07:55,240 >> Так што калі ў вас ёсць толькі 32 біта, найбольшая колькасць вы можаце разлічваць на прыкладна 4 мільярды даляраў. 130 00:07:55,240 --> 00:07:58,750 Але гэта было фундаментальнае абмежаванне кампутараў, пакуль некалькі гадоў назад 131 00:07:58,750 --> 00:08:01,180 таму што калі вы можаце разлічваць толькі дасягаць 4 млрд. 132 00:08:01,180 --> 00:08:05,270 гэта не мае значэння, калі вы купляеце 8 гігабайт аператыўнай памяці або нават 5 гігабайт аператыўнай памяці; 133 00:08:05,270 --> 00:08:07,780 Вы не можаце разлічваць, што высокі, так што гэта было бескарысна. 134 00:08:07,780 --> 00:08:11,430 Вы можаце атрымаць доступ толькі да першых 3 ці 4 гігабайтамі памяці кампутара. 135 00:08:11,430 --> 00:08:14,410 Гэта менш важнай праблемай у цяперашні час, і вы можаце купіць MacBook Pros і Dells 136 00:08:14,410 --> 00:08:17,680 з 8 гігабайтамі аператыўнай памяці або нават больш у гэтыя дні. 137 00:08:17,680 --> 00:08:24,100 Але калі я проста вылучыць у гэтай праграме паказальнік, паказальнік завецца S, 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 Такім чынам, нашы аператыўнай памяці на дадзены момант выглядае наступным чынам. 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 у тым, што, як толькі карыстач пачынае ўводзіць ключы і хітоў Enter, 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 Але давайце выкажам здагадку, што кампутар знайшоў месца для слова ПРЫВІТАННЕ прама тут. 166 00:10:05,200 --> 00:10:08,710 Я набраў слова было Н-Е-Л-Л-О. 167 00:10:08,710 --> 00:10:13,510 І калі мы правядзем гэта як паслядоўнасць сімвалаў, мы маглі б зрабіць гэта так. 168 00:10:13,510 --> 00:10:17,860 Але мне трэба зрабіць 1 дадатковую рэч. Тое, што належыць у канцы любой радкі ў 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 Так што, калі мае словы ПРЫВІТАННЕ заканчвае яго ў байт 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 Гэта як 2 радкі кода. 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 Я, здараецца, выпадкова тыпу Н-Е-Л-Л-О зноў, 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 таму што гэта іншае PRIVET, чым гэты. 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 і T паказвае на іншую 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 яна не спрабуе зразумець, ой, вы набралі ПРЫВІТАННЕ 5 хвілін назад; 244 00:15:12,470 --> 00:15:15,090 Дазвольце мне даць вам той жа паказальнік, як я даў табе раней, 245 00:15:15,090 --> 00:15:18,450 ён проста вылучае новы блок памяці кожны раз, калі вы гэта называеце. 246 00:15:18,450 --> 00:15:20,350 >> Так як жа нам вырашыць гэтую праблему? 247 00:15:20,350 --> 00:15:24,270 Калі высокім узроўні я хачу параўнаць радкі прывітанне і прывітанне - 248 00:15:24,270 --> 00:15:28,680 Я не клапачуся аб паказальнікі - як я магу ісці аб адказваючы на ​​пытанне, 249 00:15:28,680 --> 00:15:31,980 ж карыстальнік увядзіце тое ж самае? Што тут неабходная? Так. 250 00:15:31,980 --> 00:15:35,200 [Студэнт] Выкарыстоўвайце функцыю. >> Я магу выкарыстоўваць функцыі з скрынкі. 251 00:15:35,200 --> 00:15:38,170 Я магу выкарыстоўваць функцыю пад назвай STRCMP, з-т-р-с-т-р, 252 00:15:38,170 --> 00:15:41,190 толькі скарочаны версію кажучы параўнання радкоў. 253 00:15:41,190 --> 00:15:45,070 І калі мы ідзем у, напрыклад, параўнаць 2, які з'яўляецца адным з раздатачных матэрыялаў сённяшнім 254 00:15:45,070 --> 00:15:46,690 Я раблю менавіта гэта. 255 00:15:46,690 --> 00:15:51,750 Я трымаў ўсё астатняе тое ж самае ад лініі 1 на да 26 ці каля таго, 256 00:15:51,750 --> 00:15:54,360 і цяпер заўважаю гэтую частку змянілася толькі трохі. 257 00:15:54,360 --> 00:15:57,690 Давайце ігнараваць лініі 28 на імгненне і засяродзіцца толькі на гэтым. 258 00:15:57,690 --> 00:16:00,410 Што мы кажам у панядзелак, што, вул параўнання робіць? 259 00:16:00,410 --> 00:16:05,200 Ён адказвае за працэс прыняцця 2 паказальнікаў, з і т у гэтым выпадку, 260 00:16:05,200 --> 00:16:08,480 роду практычна паклаўшы руку на гэтыя 2 лісты, 261 00:16:08,480 --> 00:16:11,530 і што ён павінен зрабіць нешта накшталт завесы падчас або цыкл, 262 00:16:11,530 --> 00:16:16,050 і ён кажа гэтыя ж самае? Калі гэта так, яна рухаецца пальцаў ці паказальнікаў наперад. 263 00:16:16,050 --> 00:16:17,970 Гэта тыя ж, гэта тое ж самае, гэта тое ж самае, 264 00:16:17,970 --> 00:16:22,710 гэта тое ж самае, гэта тое ж самае? І ох, я ў канцы радка на абодвух з і т. 265 00:16:22,710 --> 00:16:26,780 Я не знайшоў ніякіх супярэчнасцяў. Так, гэтыя радкі аднолькавыя. 266 00:16:26,780 --> 00:16:31,940 А што значыць вул параўнаць вяртання, калі 2 радкі тыя ж, па-відаць? 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.c зрабіць наступнае. 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 Цяпер, вось, я проста прыняўшы чалавечае маё з'ездзе я вяртаюся 1 ад асноўнай 313 00:19:15,210 --> 00:19:17,040 калі нешта пойдзе не так. 314 00:19:17,040 --> 00:19:20,650 Гэта таму, што вяртанне асноўнай канвенцыі ў тым, каб вяртаць 0, калі добра, 315 00:19:20,650 --> 00:19:22,990 1 або іншае значэнне, калі дрэннае. 316 00:19:22,990 --> 00:19:28,200 Але 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 варта зрабіць копію з і т называючы яго. 320 00:19:40,120 --> 00:19:45,790 Так што я не прашу ў карыстальніка 2 радкі на гэты раз, я проста кажу значэнне ў ы 321 00:19:45,790 --> 00:19:47,870 павінен быць змешчаны ў т а. 322 00:19:47,870 --> 00:19:52,890 Так што цяпер проста каб прадэманстраваць, як зламаныя гэта, у радку 29 наперад за тое, што я раблю? 323 00:19:52,890 --> 00:19:56,980 Першы я правяраю, калі даўжыня т больш, чым 0. 324 00:19:56,980 --> 00:19:59,330 Там нейкая радок там. Карыстальнік увёў нешта цалі 325 00:19:59,330 --> 00:20:03,410 Што такое лінія 32 робяць, па-відаць? 326 00:20:03,410 --> 00:20:08,910 [Неразборліва адказ студэнта] >> праве. Вы можаце віды вывесці яго з таго, што я сказаў, што гэта робіць. 327 00:20:08,910 --> 00:20:13,200 Але тэхнічна, тое, што гэта робіць? T [0] ўяўляе тое, што? 328 00:20:13,200 --> 00:20:15,140 [Студэнт] характар ​​нулявы. >> [Малая] характар ​​нулявы. 329 00:20:15,140 --> 00:20:19,620 Або, што больш чалавечага тыпу, першы знак у т, што б гэта, H, можа быць, у гэтым выпадку. 330 00:20:19,620 --> 00:20:24,990 І ToUpper робіць тое, што ён кажа. Ён капитализирует нулявога сімвала т, і гэта мяняе яго. 331 00:20:24,990 --> 00:20:28,430 Такім чынам, гэта азначае ўзяць на нулявым характарам т, зрабіць яе верхні рэгістр, 332 00:20:28,430 --> 00:20:30,320 і паклаў яго назад у тым жа месцы. 333 00:20:30,320 --> 00:20:35,540 Так што, калі я тыпу прывітанне ў ніжнім рэгістры, гэта павінна змяніць малыя ч да сталіцы 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 Павялічыць маштаб Дазвольце мне ісці наперад і працаваць 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 што T [0] па-відаць сінонімам зараз? з [0] 369 00:23:05,580 --> 00:23:07,030 Так што ўсё, што адбываецца. 370 00:23:07,030 --> 00:23:09,900 І хоць гэты від адчувае сябе крыху нізкім узроўні і таемныя 371 00:23:09,900 --> 00:23:12,760 і такога роду пачуццё, што, магчыма, інтуітыўна гэта павінна было б проста працаваў - 372 00:23:12,760 --> 00:23:15,410 Я зрабіў копіі раней, і ён проста працаваў - 373 00:23:15,410 --> 00:23:18,590 калі вы на самой справе думаеце пра тое, што радок на самай справе, гэта сімвал *. 374 00:23:18,590 --> 00:23:21,700 Ну, што гэта такое? Гэта адрас некаторых характару. 375 00:23:21,700 --> 00:23:24,930 Тады, магчыма, мае сэнс, калі вы спрабуеце зрабіць нешта 376 00:23:24,930 --> 00:23:29,220 Супер здавалася б, просты, як гэта, усё, што вы робіце, капіяванне адрасы памяці. 377 00:23:29,220 --> 00:23:32,530 Вы на самой справе не робяць нічога з самой радка. 378 00:23:32,530 --> 00:23:37,500 Так што нават калі вы паняцця не маеце, як бы вы вырашыць гэтую праблему ў кодзе, 379 00:23:37,500 --> 00:23:45,080 высокім узроўні, канцэптуальна, што мы павінны зрабіць для таго, каб тая сапраўдная копія з, па-відаць? 380 00:23:46,670 --> 00:23:48,820 Так. >> [Студэнт] даць яму новае месца? >> Менавіта так. 381 00:23:48,820 --> 00:23:50,800 >> Мы павінны даць т новым месцы. 382 00:23:50,800 --> 00:23:55,230 Нам трэба нейкім чынам стварыць свет, у якім мы атрымліваем новы кавалак памяці, 383 00:23:55,230 --> 00:24:00,090 якія проста для яснасці я буду маляваць прама пад гэтым, але гэта не павінны быць там. 384 00:24:00,090 --> 00:24:04,880 Але яна павінна быць таго ж памеру, так што я буду маляваць гэтыя вертыкальныя лініі ў тым жа месцы. 385 00:24:04,880 --> 00:24:09,720 Гэта нармальна, калі гэта ўсё фігня на пачатковым этапе. Хто ведае, што там было? 386 00:24:09,720 --> 00:24:13,850 Але крок 1 будзе трэба, дайце мне столькі памяці, колькі мне трэба 387 00:24:13,850 --> 00:24:18,630 , Каб адпавядаць копію прывітанне, а затым высветліць, як скапіяваць ч тут, электронную тут, 388 00:24:18,630 --> 00:24:20,390 л Тут і так далей. 389 00:24:20,390 --> 00:24:24,880 Але гэта ўжо павінны адчуваць сябе крыху відавочная, нават калі некаторыя дэталі ўсё яшчэ абстрактна. 390 00:24:24,880 --> 00:24:28,690 Каб скапіяваць гэты радок у гэтым, гэта проста цыкл або час цыклу 391 00:24:28,690 --> 00:24:31,580 або тое, з чым вы сталі ўсё больш знаёмым. 392 00:24:31,580 --> 00:24:35,970 Так давайце паспрабуем гэта. Адпусціце мяне ў 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 Char * т стварае гэтую рэч у памяці, хоць і са знакам пытання 397 00:24:52,790 --> 00:24:54,680 таму што мы паняцця не маем, што там па змаўчанні. 398 00:24:54,680 --> 00:24:57,920 З правага боку мы цяпер ўвядзення новай функцыі, таНос, 399 00:24:57,920 --> 00:25:00,640 на памяць вылучыць, дай мне памяці, 400 00:25:00,640 --> 00:25:06,900 і ён, відавочна, бярэ, колькі аргументаў, колькі рэчаў у дужках? 401 00:25:09,660 --> 00:25:12,130 Я пачуў нараканьні 1 і 2, але гэта ўсяго толькі 1. 402 00:25:12,130 --> 00:25:15,320 Там няма коскі, якая азначае, што ёсць толькі 1 рэч у круглых дужках. 403 00:25:15,320 --> 00:25:17,720 Хоць ёсць іншыя дужкі, дазвольце мне падкрэсліць 404 00:25:17,720 --> 00:25:21,460 тое, што ўнутры самой знешняй дужкі, і менавіта гэта выраз: 405 00:25:21,460 --> 00:25:25,880 (StrLen (ы) + 1) * SizeOf (Char). 406 00:25:25,880 --> 00:25:29,190 Такім чынам, калі мы на самай справе думаю, што гэта да канца, гэта кажа мне даўжыні з. 407 00:25:29,190 --> 00:25:34,440 Чаму я, праўда, дадаўшы 1 на даўжыні? >> [Неразборліва адказ студэнта] 408 00:25:34,440 --> 00:25:40,200 Менавіта так. Нам трэба месца для гэтага хлопца ў хвост, шосты знак, які не мае сэнсу англійскай 409 00:25:40,200 --> 00:25:42,250 але ёсць спецыяльныя праграмныя сэнс. 410 00:25:42,250 --> 00:25:46,800 >> Так што нам трэба + 1 за гэта, таму 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. >> Шэсць. Роўна столькі, колькі мы маем знакі пытання на экране. 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 нешта накшталт гэтага, я па крайняй меры хочаце праверыць на NULL. 460 00:28:51,780 --> 00:28:55,260 У рэчаіснасці, большасць кампутараў дасць вам ілюзію, што ўсе праграмы 461 00:28:55,260 --> 00:28:57,080 Можна выкарыстаць сукупнасць аператыўнай памяці, 462 00:28:57,080 --> 00:29:00,740 але нават у гэтым выпадку, калі карыстальнік ўводзіць некаторыя вар'яты доўгую радок, можа быць, таму, што яны дрэннага хлопца 463 00:29:00,740 --> 00:29:03,440 і яны на самой справе спрабуюць прывесці да збою праграмы або ўзламаць яго, 464 00:29:03,440 --> 00:29:07,300 Вы хочаце, каб па крайняй меры праверыць вяртаецца значэнне таНос і ці будзе яна роўная нулю. 465 00:29:07,300 --> 00:29:11,630 І калі гэта так, давайце проста кінуць прама зараз, таму што я не ведаю, што рабіць у гэтым выпадку. 466 00:29:11,630 --> 00:29:13,950 Як скапіяваць радок? Там ёсць некалькі спосабаў зрабіць гэта. 467 00:29:13,950 --> 00:29:18,850 Ёсць вул скапіяваць функцыі ў 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 пра да п, 472 00:29:35,290 --> 00:29:40,940 і на кожнай ітэрацыі я стаўлю з [я] ўнутры т [I]. 473 00:29:40,940 --> 00:29:45,060 Дык вось што я меў на ўвазе з маімі 2-ма пальцамі, паказваючы на ​​радкоў да. 474 00:29:45,060 --> 00:29:49,260 Як гэта цыкл ітэрацыі, як гэта, я збіраюся быць капіявання г у тут, 475 00:29:49,260 --> 00:29:52,890 е ў тут, я тут, таму што ў гэта з, гэта т. 476 00:29:52,890 --> 00:29:58,770 І тады, нарэшце, у радку 35, чаму я гэта раблю? 477 00:29:58,770 --> 00:30:03,770 Мне трэба, каб пераканацца, што я ў канчатковым радок тон. 478 00:30:03,770 --> 00:30:06,170 І я зрабіў гэта такім чынам, каб быць супер відавочным. 479 00:30:06,170 --> 00:30:09,510 Але прапаную, хтосьці, калі б вы маглі, розных спосабаў зрабіць гэта. 480 00:30:09,510 --> 00:30:13,930 Я сапраўды не патрэбна радок 35. Там яшчэ адзін спосаб зрабіць гэта. 481 00:30:13,930 --> 00:30:18,880 Так. >> [Неразборліва адказ студэнта] >> Скажы гэта гучней. 482 00:30:18,880 --> 00:30:20,960 [Студэнт] менш або роўна. >> Менавіта так. 483 00:30:20,960 --> 00:30:24,450 Мы маглі б проста сказаць, менш ці роўна 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 Акрамя таго, мы маглі б выкарыстоўваць функцыю вул копія, зЬгсру, 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 Я толькі што выкарыстаў гэтую памяць, каб запісаць слова прывітанне ў 2 месцах, 507 00:31:55,430 --> 00:31:57,490 тут, тут, тут, і тут. 508 00:31:57,490 --> 00:32:00,910 Такім чынам, гэта ч-е-л-л-о-\ 0. 509 00:32:00,910 --> 00:32:06,960 Але тады я называю лініяй 46 і лініяй 47, і вы ведаеце, што там адбываецца, з пункту гледжання карціна? 510 00:32:06,960 --> 00:32:10,010 На самай справе, пачакайце, гэтая карціна старога. 511 00:32:10,010 --> 00:32:12,550 Як толькі мы зрабіць копію, гэты хлопец на самай справе паказвае тут, 512 00:32:12,550 --> 00:32:16,110 так што давайце выдаліць лічбы і проста абстрагавацца ад, як нашы стрэлкі зноў. 513 00:32:16,110 --> 00:32:19,370 Што адбываецца ў гэтай карціне, калі я тэлефаную бясплатна? 514 00:32:19,370 --> 00:32:22,750 [Неразборліва адказ студэнта] >> Ня цотнымі. 515 00:32:22,750 --> 00:32:29,510 Калі я пазваню бясплатна на з і т - свайго роду пытанне з падвохам - гэта карціна не мяняецца на ўсіх 516 00:32:29,510 --> 00:32:33,880 таму, што выклік і выклік с т проста кажа аперацыйнай сістэме, 517 00:32:33,880 --> 00:32:39,010 эй, вы можаце выкарыстоўваць гэтую памяць зноў, але гэта не мяняе гэтага да нуля 518 00:32:39,010 --> 00:32:41,840 ці адмысловымі знакамі, гэта не змяніць, 519 00:32:41,840 --> 00:32:47,350 гэта не мяняе ч або электроннай або л або л або высновы ў любым месцы ні з чым. 520 00:32:47,350 --> 00:32:51,610 З пункту гледжання карціну, як толькі Вы тэлефануеце бясплатна, нічога не мяняецца. 521 00:32:51,610 --> 00:32:56,570 І ў гэтым заключаецца паходжанне смецця значэння, таму што калі я потым у гэтай праграме 522 00:32:56,570 --> 00:33:01,010 спытаеце аперацыйнай сістэмы для дадатковай памяці з 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 Гэта адбываецца, рабіць з аператыўнай памяццю, але вашы кампутары 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 Эскізныя або адчувальнай файл па-ранейшаму проста сядзеў там дзесьці на вашым цвёрдым дыску. 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 або абярыце Файл, 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 >> І калі мы проста часова адцягнуцца і пісаць - I'll проста выкарыстоўваць заднюю гэтага. 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 на дыску вашага кампутара, і я проста маляванне ж адвольнага 1 і 0. 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 Можа быць, у рэшце рэшт АС будзе ачысціць яго для вас, але, як правіла, ён нічога не робіць, 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 не ў памяці, а не ў памяці, а на цвёрдым дыску, 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 гэтая карціна не мяняецца. 0 і 1 на цвёрдым дыску нікуды не хаджу. 570 00:35:59,530 --> 00:36:03,930 Але гэтая табліца, гэтая маленькая база дадзеных гатункаў, змяняецца. 571 00:36:03,930 --> 00:36:08,750 Пры выдаленні вашага рэзюмэ, гэта як калі б файл выдаляецца, у пэўным сэнсе, 572 00:36:08,750 --> 00:36:12,790 але кампутар не будзе забываць, дзе гэтая штука жыве на вашым цвёрдым дыску. 573 00:36:12,790 --> 00:36:17,870 0 і 1, якія складаюць ваша рэзюмэ або любы з гэтых іншых файлаў застаюцца некранутымі. 574 00:36:17,870 --> 00:36:21,960 >> Так што калі вы зрабілі гэта выпадкова, яшчэ ёсць ненулявое верагоднасць 575 00:36:21,960 --> 00:36:25,800 што вы можаце аднавіць дадзеныя з дапамогай Нортан Утыліты і некаторыя камерцыйныя праграмы 576 00:36:25,800 --> 00:36:29,810 чые мэты ў жыцці, каб знайсці 0 і 1, якія накшталт сіроты, 577 00:36:29,810 --> 00:36:33,300 забыліся тут, але пакінуў тут, так што вы можаце атрымаць вашыя дадзеныя назад. 578 00:36:33,300 --> 00:36:38,410 Ці судовых следчых паліцыі або ФБР будзе на самой справе ўзяць жорсткі дыск 579 00:36:38,410 --> 00:36:42,550 а на самай справе шукаць ўзоры з 0 і 1, якія выглядаюць як 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 Вы не можаце рэальна пазбавіцца ад 0 і 1 584 00:36:56,540 --> 00:36:59,440 таму што інакш вы б пачаць з гігабайтны жорсткі дыск 585 00:36:59,440 --> 00:37:02,380 і вы ў канчатковым выніку з мегабайта жорсткага дыска, калі вы ўвесь час былі выдалення, 586 00:37:02,380 --> 00:37:04,380 літаральна, 0 і 1. 587 00:37:04,380 --> 00:37:06,310 Такім чынам, што б вы зрабілі, калі б вы сапраўды хацелі, каб замесці сляды 588 00:37:06,310 --> 00:37:10,510 і асноўнай праблемай з'яўляецца тое, што яшчэ ёсць 0 і 1 на дыску? 589 00:37:10,510 --> 00:37:14,930 Я бачу, хтосьці жэстыкулюючы, што вы фізічна зламаць прылада. Гэта будзе працаваць. 590 00:37:14,930 --> 00:37:19,600 [Смяецца] Але калі гэта свайго роду дарагое рашэнне, што было б больш разумным? 591 00:37:19,600 --> 00:37:23,270 Так. >> [Студэнт] перапісаць іх. >> Перазапісаць іх ці што? >> [Студэнт] Іншыя дадзеныя. 592 00:37:23,270 --> 00:37:29,070 Іншыя дадзеныя. Вы можаце проста перазапісаць дыск з 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 калі ў вас ёсць некаторыя рэчы ў вашай смеццевае вядро, вы можаце зрабіць Бяспека Empty Trash, 599 00:37:45,740 --> 00:37:47,610 які робіць менавіта гэта. 600 00:37:47,610 --> 00:37:53,350 Замест таго каб проста сцерці файлы тут, яна не сцірае 0 і 1 тут, 601 00:37:53,350 --> 00:38:01,240 хутчэй, ён проста мяняе іх, напрыклад, на 0 і кропка, кропка, кропка. 602 00:38:01,240 --> 00:38:05,330 Таму адной з вашых будучых 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 нават 3, калі вы хочаце, але 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 Цяпер, аднак, мы будзем стандартаваць гэты падыход, каб зрабіць Super Clear 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 Цяпер дазвольце мне тыпу ў нешта накшталт прывітанне і тып Enter 635 00:39:58,940 --> 00:40:01,080 і ён друкуе 1 знака ў радку. 636 00:40:01,080 --> 00:40:04,730 Да секунду назад, мы б зрабілі гэта з квадратнымі пазначэнне кранштэйна. 637 00:40:04,730 --> 00:40:09,760 Мы б цыкл, і мы будзем рабіць Printf з [я], і мы будзем рабіць гэта зноў і зноў і зноў 638 00:40:09,760 --> 00:40:11,950 з зваротнай касой рысай п ў канцы кожнага радка. 639 00:40:11,950 --> 00:40:16,800 Але гэтая праграма адрозніваецца. Гэтая праграма выкарыстоўваецца, у літаральным сэнсе, арыфметыка. 640 00:40:16,800 --> 00:40:18,860 Так што ж тут адбываецца? 641 00:40:18,860 --> 00:40:24,720 Перш за ўсё, да гэтага цыкл выконвае нават тое, што, проста каб быць ясна, з'яўляецца на самой справе? 642 00:40:24,720 --> 00:40:27,270 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 Такім чынам, гэты выраз гаварыў з + я - хутчэй, з +0--гэта, відавочна, толькі з. 650 00:41:01,740 --> 00:41:04,320 Так што ж такое * з тут? 651 00:41:04,320 --> 00:41:08,530 Цяпер мы выкарыстоўваем зорка ў некалькі іншы шлях. 652 00:41:08,530 --> 00:41:13,080 Дазвольце мне ісці наперад і пазбавіцца ад т, таму што мы зрабілі гаворым аб т і копіі з. 653 00:41:13,080 --> 00:41:15,540 Цяпер мы проста хочам, каб распавесці гісторыю з удзелам с. 654 00:41:15,540 --> 00:41:20,090 І вось у гэты момант, пасля таго, як тып радкі, наш свет выглядае зусім як гэта было раней 655 00:41:20,090 --> 00:41:26,630 за ўсё з захоўваннем адрас ч і ў больш агульным паказваючы на ​​радок прывітанне. 656 00:41:26,630 --> 00:41:33,170 Калі я цяпер раблю такую ​​радок * (S + I), давайце паспрабуем гэта. 657 00:41:33,170 --> 00:41:40,140 Так * (S + I). Дазвольце мне спрасціць гэта, таму што гэта 0, так што гэта * (S +0). 658 00:41:40,140 --> 00:41:43,790 Ну, пачакай хвілінку. Спрашчэнне далей. Гэта * (с). 659 00:41:43,790 --> 00:41:47,020 Ну, а цяпер дужках з'яўляюцца свайго роду дурным, так што цяпер давайце проста рабіць * с. 660 00:41:47,020 --> 00:41:50,540 Такім чынам, у першай ітэрацыі гэтага цыклу, што лінія якая падкрэсліла, 26, 661 00:41:50,540 --> 00:41:53,650 у значнай ступені эквівалентна друку гэтым. 662 00:41:53,650 --> 00:41:56,040 Што такое тып дадзеных * з? 663 00:41:56,040 --> 00:42:00,770 У гэтым кантэксце, таму што зорка апынецца побач з сябе, 664 00:42:00,770 --> 00:42:04,930 але больш канкрэтна, таму што мы больш не абвясціўшы ёй, 665 00:42:04,930 --> 00:42:09,730 Мы не ствараем зменную больш, няма ніякай згадкі знак * у радку 26, 666 00:42:09,730 --> 00:42:14,280 няма ніякай згадкі ключавога слова радкі, мы проста з дапамогай зменнай с, 667 00:42:14,280 --> 00:42:19,650 Аказваецца цяпер зорка мае некалькі іншы і, трэба прызнаць, блытаючы сэнс. 668 00:42:19,650 --> 00:42:26,590 * Ы тут азначае перайсці па адрасе ў с і друку ўсе, што ёсць. 669 00:42:26,590 --> 00:42:33,750 Такім чынам, з тут, * S ёсць - накшталт як жолабы і лесвіцы, прытрымлівайцеся за стрэлкай - тут. 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 Затым \ п для новага радка. * (S + I), дзе я = 0 з'яўляецца менавіта гэта. 674 00:42:48,520 --> 00:42:53,670 Так што знак трэба змясціць у% для C? H. 675 00:42:53,670 --> 00:42:56,900 У наступнай ітэрацыі цыклу - можна, верагодна, убачыць, дзе гэта адбываецца - 676 00:42:56,900 --> 00:43:01,350 Наступная ітэрацыя я, відавочна, 1, так што гэта азначае с +1, 677 00:43:01,350 --> 00:43:05,580 і цяпер мне трэба дужкі, таму што цяпер зорка павінна сказаць 678 00:43:05,580 --> 00:43:08,620 перайдзіце па адрасе памяці з +1. 679 00:43:08,620 --> 00:43:14,170 Што такое S? Давайце вярнуцца ў мінулае і сказаць, што гэта стрэлка цяпер на самай справе не робяць нам ніякіх паслуг. 680 00:43:14,170 --> 00:43:18,450 Давайце больш канкрэтна сказаць, што гэта захоўванні нумар 123 681 00:43:18,450 --> 00:43:25,110 таму што ў пачатку гэтага радка Добры дзень, гэта адрас 123, гэта 124, і гэтак далей. 682 00:43:25,110 --> 00:43:30,550 Такім чынам, на другі ітэрацыі, калі я кажу з +1, гэта, як кажуць 123 1, 683 00:43:30,550 --> 00:43:35,340 інакш вядомая як 124, так што знак атрымлівае надрукаваны на другі ітэрацыі? 684 00:43:35,340 --> 00:43:37,850 E на адрас памяці, 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 на г-м месцы з дапамогай гэтых лікавых адрасоў і гэтая зорка аператара, 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 Струны, аднак, з'яўляюцца асаблівымі, таму што на самой справе яны канкатэнацыі некалькіх сімвалаў. 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 * я толькі таму, што Int складае 4 байта. 729 00:46:20,720 --> 00:46:25,780 Арыфметыка з паказальнікамі азначае, што 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, як гэтая, сімвал * T = S, 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 але ён ніколі не працаваў у асноўным таму, што асноўная прайшло ў х і у, нагадаем, 755 00:48:05,280 --> 00:48:07,260 і тыя былі прынятыя ў каштоўнасцямі, так бы мовіць. 756 00:48:07,260 --> 00:48:09,330 Копіі з іх былі дадзены памяняць. 757 00:48:09,330 --> 00:48:12,520 Да канца падпампоўкі, і б сапраўды былі абменены, 758 00:48:12,520 --> 00:48:16,120 але, вядома, х і у, як мы абмяркоўвалі ў панядзелак, не было. 759 00:48:16,120 --> 00:48:19,940 Таму я прапаную ў зялёным тут, што гэта на самай справе рашэнне тут. 760 00:48:19,940 --> 00:48:22,640 А на самай справе, дазвольце мне рухацца маёй зоркі проста быць паслядоўным 761 00:48:22,640 --> 00:48:24,440 хоць, зноў жа, функцыянальна гэта не мае значэння. 762 00:48:24,440 --> 00:48:28,730 У будучыні тыдняў мы будзем тлумачыць, калі і чаму гэта мае значэнне. 763 00:48:28,730 --> 00:48:30,600 Такім чынам, у зялёным зараз з'яўляецца рашэннем. 764 00:48:30,600 --> 00:48:33,700 Шчыра кажучы, гэта выглядае нашмат брудней, таму што ў мяне ёсць усе гэтыя зоркі. 765 00:48:33,700 --> 00:48:35,380 Дазвольце мне адзначыць адну рэч. 766 00:48:35,380 --> 00:48:40,040 Верхняя радок тут, дзе ён кажа Int * і Int * б 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 >> Што гэта значыць? Ня INT, каб не з'яўляецца Int. 773 00:48:59,340 --> 00:49:04,100 Гэта адрас Int і б гэта адрас іншага Int. 774 00:49:04,100 --> 00:49:06,980 Тут, унізе, гэта дзе я прызнаю C збівае з толку. 775 00:49:06,980 --> 00:49:09,790 Цяпер мы выкарыстоўваем зоркай, але ён мае рознае значэнне ў гэтым кантэксце. 776 00:49:09,790 --> 00:49:13,150 Таму што мы не аб'яўляем паказальнікі, як мы тут, 777 00:49:13,150 --> 00:49:15,500 Тут мы разыменования рэчы. 778 00:49:15,500 --> 00:49:21,520 Такім чынам, тэхнічна, зоркі ў гэтым кантэксце першай, другой і трэцяй лініі ўнутры своп 779 00:49:21,520 --> 00:49:24,560 з'яўляецца аператарам разыменования, які проста азначае, што ісці туды. 780 00:49:24,560 --> 00:49:27,400 Гэтак жа, як мой палец рушыў услед за стрэлкамі гадзін, 781 00:49:27,400 --> 00:49:31,100 * Сродкі ідуць на гэты адрас і знайсці мяне Int, што ёсць. 782 00:49:31,100 --> 00:49:34,250 * У азначае, перайсці па адрасе і перадаць мне, што там. 783 00:49:34,250 --> 00:49:40,730 Так што давайце перамалёваць малюнак з панядзелка зараз выкарыстоўваецца стэк кадраў, 784 00:49:40,730 --> 00:49:43,130 ніжні, адзін з якіх будзе асноўным, 785 00:49:43,130 --> 00:49:47,600 верхняя, адна з якіх будзе своп, 786 00:49:47,600 --> 00:49:50,880 так што наш свет выглядае, як панядзелак, як гэта. 787 00:49:50,880 --> 00:49:53,620 Вось кавалак памяці, што асноўнай збіраецца выкарыстоўваць. 788 00:49:53,620 --> 00:49:56,520 >> Нагадаем, з панядзелка, што праграма проста было 2 зменных, 789 00:49:56,520 --> 00:50:01,930 1 завецца х і адна называецца у, і я паклаў ліку 1 і 2. 790 00:50:01,930 --> 00:50:06,580 Цяпер, калі я тэлефаную памяняць, як я зрабіў у панядзелак, 791 00:50:06,580 --> 00:50:11,000 Раней, калі я выкарыстаў чырвоную версію гэтай праграмы, якая выглядае так, 792 00:50:11,000 --> 00:50:17,470 Я атрымаў 2 параметру, а, б, і што ж мы пішам тут і тут? 793 00:50:17,470 --> 00:50:21,160 Толькі 1 і 2, літаральна капіюе х і у. 794 00:50:21,160 --> 00:50:23,070 Сёння мы гэта змяніць. 795 00:50:23,070 --> 00:50:28,510 Сёння замест перадачы ў цэлых а і б мы збіраемся перадаць у 2-адрасоў. 796 00:50:28,510 --> 00:50:34,290 Гэтыя адрасы здарыцца, каб паказаць на цэлыя, але гэтыя адрасы не цэлымі сябе. 797 00:50:34,290 --> 00:50:37,330 Яны адрасоў. Гэта як паштовы адрас. 798 00:50:37,330 --> 00:50:40,580 Так што цяпер нам трэба проста даць сабе трохі больш падрабязна на экране. 799 00:50:40,580 --> 00:50:43,250 Гэта мая памяць кампутара, як гэта было ўвесь дзень. 800 00:50:43,250 --> 00:50:45,120 Цяпер нам трэба адвольнай схемы нумарацыі. 801 00:50:45,120 --> 00:50:50,580 Так што давайце проста скажам, проста выпадкова, што гэта адрас памяці, 123, 124. 802 00:50:50,580 --> 00:50:55,660 Давайце проста скажам, што гэта 125, гэта 126, і гэтак далей, але гэта зусім адвольнымі. 803 00:50:55,660 --> 00:50:58,590 Нам проста трэба некаторы схемы нумарацыі ў маёй памяці. 804 00:50:58,590 --> 00:51:04,030 Так што цяпер, калі я на самай справе праходзяць у х і у, я не збіраюся пераходзіць у х і ў; 805 00:51:04,030 --> 00:51:08,400 Я збіраюся перайсці ў паштовы адрас, так бы мовіць, х і ў 806 00:51:08,400 --> 00:51:11,870 так што тое, што атрымлівае захоўваецца тут і тут не 1 і 2, 807 00:51:11,870 --> 00:51:16,030 Але калі вы можаце ўбачыць мае дробны тэкст, тое, што прайшло ў тут і тут? 808 00:51:16,030 --> 00:51:23,340 [Неразборліва адказ студэнта] >> Менавіта так. 123 атрымлівае пакласці тут, і 124 атрымлівае пакласці тут. 809 00:51:23,340 --> 00:51:28,910 >> Цяпер, таму што я выкарыстаў зорка ў гэтай самай першай радку шлях тут, на вяршыні, 810 00:51:28,910 --> 00:51:34,340 мая праграма проста ведае, што 123 і 124, хоць яны, відавочна, цэлыя 811 00:51:34,340 --> 00:51:40,160 што любы чалавек мог заўважыць, яны павінны быць інтэрпрэтаваныя як адрасы, лікавыя адрасу. 812 00:51:40,160 --> 00:51:43,250 Яны не з'яўляюцца самі па сабе цэлымі, яны адрасоў, 813 00:51:43,250 --> 00:51:46,120 і гэта таму, што я відавочна паставіў зоркі там. 814 00:51:46,120 --> 00:51:51,360 Так што цяпер у маёй першай, другой і трэцяй лініі фактычнага кода, што тут адбываецца? 815 00:51:51,360 --> 00:51:53,380 Давайце намалюем астатняй часткі карціны. 816 00:51:53,380 --> 00:51:56,980 Tmp гэтак жа, як гэта было ў панядзелак. Нічога асаблівага TMP. 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 = *. Зорка сродкі ідуць туды. 821 00:52:13,670 --> 00:52:19,370 Дык вось, 123. Як мне туды ісці? Бабінцам, што ёсць стрэлка. 822 00:52:19,370 --> 00:52:24,460 Ну, так і ёсць, 1. Так што ж атрымлівае захоўваецца ў TMP, па-відаць? Проста 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 Цяпер тое, што я раблю ў радку 2, * = * б? 828 00:52:39,020 --> 00:52:44,570 Гэта адна крыху больш складана, таму што зараз гэта? Гэта 123. 829 00:52:44,570 --> 00:52:50,220 Так што * гэта дзе? Там, дзе я быў раней. Так што ідзіце туды. Добра. 830 00:52:50,220 --> 00:52:53,420 Цяпер, нарэшце, і, нарэшце, гэта пачне мець сэнс, спадзяюся, 831 00:52:53,420 --> 00:53:00,280 * Б азначае, што ў б? 124. Так што мне трэба пайсці туды, што на 2. 832 00:53:00,280 --> 00:53:03,430 Так што я стаўлю дзе? 833 00:53:03,430 --> 00:53:10,100 2 ідзе ў тут, таму што * б * пераходзіць ст. Так што я буду рабіць. 834 00:53:10,100 --> 00:53:13,120 І вы ўжо можаце бачыць, мабыць, што мы значна бліжэй 835 00:53:13,120 --> 00:53:17,710 да вырашэння гэтай дурной, простая задача правільна ў першы раз 836 00:53:17,710 --> 00:53:20,920 таму што цяпер у нас яшчэ ёсць успамін пра тое, што х быў, 837 00:53:20,920 --> 00:53:23,230 у нас ёсць 2-х экземплярах, па агульным прызнанні, у, 838 00:53:23,230 --> 00:53:25,850 але лінія 3 зараз кажа, * б. 839 00:53:25,850 --> 00:53:31,080 Дык вось б. * У азначае пайсці туды. Дык дзе ж размяшчэнне 124? 840 00:53:31,080 --> 00:53:35,560 Гэта мабыць тут. Такім чынам, што ж я тут? Відавочна, TMP. 841 00:53:35,560 --> 00:53:39,600 Так што цяпер я гэта раблю. Так што ў мяне ёсць 1 і 2 тут тут. 842 00:53:39,600 --> 00:53:43,560 І што цяпер пра ўсё гэта, 123, 124 і 1? 843 00:53:43,560 --> 00:53:47,910 Як толькі своп вяртаецца, гэтая памяць так добра, як страцілі 844 00:53:47,910 --> 00:53:51,070 таму што як толькі своп вяртаецца, аперацыйная сістэма 845 00:53:51,070 --> 00:53:54,190 мае права выкарыстоўваць гэтую памяць у будучыні. 846 00:53:54,190 --> 00:53:58,870 Толькі асноўнай памяці ў ніжняй гэтага так званага стэкам блукае нейкі час паблізу. 847 00:53:58,870 --> 00:54:01,470 >> І вось мы, нарэшце, зараз рабочая версія. 848 00:54:01,470 --> 00:54:06,310 Адпусціце мяне ў swap.c, і звярніце ўвагу на наступнае. 849 00:54:06,310 --> 00:54:11,280 У верхняй частцы праграмы я змяніў мой прататып, каб быць Int * і * б 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 і тады ўсе гэтыя рэчы зараз маюць зоркі, за выключэннем TMP 855 00:54:27,930 --> 00:54:30,680 таму, што выкарыстанне часовых зменных, няма нічога новага. 856 00:54:30,680 --> 00:54:33,040 Мне проста трэба часовае сховішча для унутр. 857 00:54:33,040 --> 00:54:34,820 Такім чынам, нам не патрэбныя зоркі там. 858 00:54:34,820 --> 00:54:39,310 Нам проста трэба зорцы, каб мы маглі перасекчы такога роду адвольныя мяжы 859 00:54:39,310 --> 00:54:42,900 Паміж гэтымі 2 кадра ў памяці майго кампутара. 860 00:54:42,900 --> 00:54:45,630 Але апошняе, што павінна змяніцца, і вы, магчыма, убачыў яго ўжо. 861 00:54:45,630 --> 00:54:48,810 Якія іншыя лініі, відавочна, адрозніваецца цяпер? >> [Студэнт] & х. 862 00:54:48,810 --> 00:54:53,270 >> Так, так што 25 з'яўляецца апошняй радку кода мне трэба змяніць, каб гэта працавала. 863 00:54:53,270 --> 00:54:58,360 Тыдзень таму, і нават у панядзелак лініі 25 выглядала так, памяняйце месцамі х і у, 864 00:54:58,360 --> 00:55:02,020 і гэта было проста зламаная, таму што калі вы кажаце свопу (х, у) 865 00:55:02,020 --> 00:55:05,660 Вы даеце копіі х і ў памяняць, то ён робіць сваю справу, 866 00:55:05,660 --> 00:55:09,080 але вы ніколі не змяняецца х і ў сябе. 867 00:55:09,080 --> 00:55:12,880 Так што нават калі вы ніколі не бачылі гэты знак, перш чым з амперсанда ў кодзе, 868 00:55:12,880 --> 00:55:15,860 проста ўзяць здагадка. Што рабіць амперсанда, па-відаць? 869 00:55:15,860 --> 00:55:17,890 [Студэнт] прымае адрас. >> Прымае адрас. 870 00:55:17,890 --> 00:55:21,160 Такім чынам, амперсанда кажа, дайце мне адрас х. 871 00:55:21,160 --> 00:55:25,590 Хто ведае, дзе гэта? Гэта здараецца, 123. Мне ўсё роўна. Проста дайце мне адрас х. 872 00:55:25,590 --> 00:55:28,340 І ў азначае даць мне адрас у. 873 00:55:28,340 --> 00:55:34,450 І ў гэты момант гісторыя цалкам адпавядае з карцінай мы зрабілі хвіліну таму. 874 00:55:34,450 --> 00:55:38,310 >> Такім чынам, я прызнаю, паказальнікі, вядома, для мяне, калі я ўпершыню пачаў Даведаўшыся пра гэта, 875 00:55:38,310 --> 00:55:40,570 быў вызначана адным з самых цяжкіх рэчаў, каб абгарнуць свой розум вакол. 876 00:55:40,570 --> 00:55:43,760 Але разумееце, тым больш, што мы працягваем гуляць з гэтымі рэчамі, 877 00:55:43,760 --> 00:55:48,030 Калі вы разбіць яго на гэтыя супер просты выгляд інтэлектуальна нецікавыя праблемы 878 00:55:48,030 --> 00:55:52,270 за ўсё рухаецца вакол нумара, адказ на шмат блытаніны з паказальнікамі 879 00:55:52,270 --> 00:55:56,590 сапраўды можа быць атрымана з гэтых самых асноўных механікі. 880 00:55:56,590 --> 00:55:59,070 Вось адрас. Ідзі туды з зоркай. 881 00:55:59,070 --> 00:56:03,830 Ці наадварот, вось амперсанда. Высветліць, што адрас на самай справе. 882 00:56:03,830 --> 00:56:06,270 Добра. 883 00:56:06,270 --> 00:56:09,000 Дык дзе ж усё гэта памяць прыходзяць? 884 00:56:09,000 --> 00:56:12,360 Мы намалявалі гэтую карціну некалькі разоў, і я трымаю перспектыўным, мы вернемся да яго, 885 00:56:12,360 --> 00:56:14,920 але вось ўяўленне памяці кампутара 886 00:56:14,920 --> 00:56:17,420 , Што крыху больш, чым нашы пазначаныя дошцы тут. 887 00:56:17,420 --> 00:56:21,590 Тэкст у верхнім сегменце ўяўляе тое, што ў адносінах да вашай праграме? 888 00:56:21,590 --> 00:56:26,090 [Неразборліва адказ студэнта] >> Прабачце? Скажыце яшчэ раз. 889 00:56:26,090 --> 00:56:28,660 [Студэнт] Фактычнае праграмы. >> Фактычныя праграмай. 890 00:56:28,660 --> 00:56:32,430 >> Такім чынам, 0 і 1, што вы сабралі пасля напісання кода C і затым запусціць Clang 891 00:56:32,430 --> 00:56:35,910 і генерыруючых 0 і 1 канцах тым, што былі там хаваюцца ў памяці 892 00:56:35,910 --> 00:56:38,570 таму што, калі вы двойчы пстрыкніце значок на вашым Mac ці PC 893 00:56:38,570 --> 00:56:43,010 або выканайце каманду, як Марыё на ваша запрашэнне, ваша 0 і 1 з дыска 894 00:56:43,010 --> 00:56:45,700 загружаюцца ў памяць, так што кампутар можа кіраваць імі 895 00:56:45,700 --> 00:56:47,540 і выконваць іх хутчэй. 896 00:56:47,540 --> 00:56:50,880 Так ініцыялізаваць дадзеныя і неинициализированные дадзеныя, мы не будзем шмат казаць пра тых, 897 00:56:50,880 --> 00:56:52,420 але гэта толькі глабальныя зменныя. 898 00:56:52,420 --> 00:56:54,710 Initialized азначае глабальныя зменныя, якія вы далі значэння; 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 Malloc таму неабходна выкарыстоўваць не стэк; 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 Вось гэта супер простую праграму, якая ў першыя 2 радкі што робіць? 943 00:59:29,270 --> 00:59:33,460 У ангельскай мове, то, што гэтыя першыя 2 радкі кода зрабіць ўнутры асноўнага? 944 00:59:33,460 --> 00:59:35,600 [Неразборліва адказ студэнта] 945 00:59:35,600 --> 00:59:37,880 Асцярожна. Гэта не дае мне адрас х ці ў. 946 00:59:37,880 --> 00:59:41,840 [Студэнт] Дае паказальнікаў на цэлыя. >> Добра. Дайце мне 2 паказальнікаў на цэлыя лікі. 947 00:59:41,840 --> 00:59:45,130 Іншымі словамі, дайце мне 2 участкаў памяці, што я трымаю чарцёж сёння, 948 00:59:45,130 --> 00:59:46,950 хоць я сцёр яго цяпер, як квадраты. 949 00:59:46,950 --> 00:59:50,000 Дайце мне 2 участкаў памяці, адна называецца х, адна называецца у - 950 00:59:50,000 --> 00:59:54,320 Раней я называў іх з і т - а што гэта тып, што частка памяці? 951 00:59:54,320 --> 00:59:57,160 Гэта будзе захоўваць адрас. 952 00:59:57,160 --> 00:59:59,110 Гэта тыпу * 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 Такім чынам, гэта азначае, што я магу пакласці ў X ст адрас некаторых кавалак памяці. 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 * Х = 42, што робіць? 970 01:00:52,200 --> 01:00:57,150 Калі ў гэты момант у гісторыі мы маем х, які выглядае, як гэта з некаторымі смецця значэнне, 971 01:00:57,150 --> 01:01:04,120 гэта адразу ў некаторых смецця значэнне, цяпер у радку 3 Я выдзеліць 4 байт. 972 01:01:04,120 --> 01:01:06,950 Гэтая карціна істотна выглядае наступным чынам. 973 01:01:06,950 --> 01:01:12,010 Ці, больш дакладна, калі гэта адвольны адрас 123, гэта тое, што наша гісторыя выглядае цяпер. 974 01:01:12,010 --> 01:01:23,940 * Х = 42 азначае цяпер, што? Гэта азначае, што пераход на адрас 123 і паклаў ліку 42 там. 975 01:01:23,940 --> 01:01:26,220 Мне не трэба, каб зрабіць гэтыя радкі, таму што мы не робім радкоў. 976 01:01:26,220 --> 01:01:29,480 >> Я толькі што напісаў гэта так, і толькі дзеля дэманстрацыі, у 977 01:01:29,480 --> 01:01:33,240 42, унутр выгляд займае шмат месца, 4 байт. 978 01:01:33,240 --> 01:01:35,960 Дык вось што там адбылося, але ёсць праблема. 979 01:01:35,960 --> 01:01:40,580 * У = 13. Што адбудзецца тут? 980 01:01:40,580 --> 01:01:46,470 Праблема ў тым, * у ў нашым спрошчаным свеце азначае толькі перайсці па адрасе у. 981 01:01:46,470 --> 01:01:48,590 Што ў Y? Гэта нейкая фігня значэнне. 982 01:01:48,590 --> 01:01:53,150 Такім чынам, давайце выкажам здагадку, што смецце значэнне 5551212, нешта вар'ят, як гэта. 983 01:01:53,150 --> 01:01:56,750 * У сродкі ідуць на рашэнне 5551212. 984 01:01:56,750 --> 01:02:00,450 Гэта ўсё роўна тут. Ён не існуе, напрыклад. 985 01:02:00,450 --> 01:02:05,310 Такім чынам, у * атрымлівае 13 азначае, што я спрабую зрабіць тут 13. Яна не існуе. 986 01:02:05,310 --> 01:02:08,790 Я перавысілі сегмент дошцы. Што я атрымаю? 987 01:02:08,790 --> 01:02:14,930 Гэта загадкавае віне сегментацыі паведамленне, таму што я спрабую паставіць у памяці 988 01:02:14,930 --> 01:02:19,470 значэння, як 13 ў месцы, якое не існуе. 989 01:02:19,470 --> 01:02:23,900 Астатняя частка праграмы можа працаваць добра, але да гэтага моманту ён не робіць. 990 01:02:23,900 --> 01:02:25,350 Так давайце паспрабуем распавесці гэтую гісторыю. 991 01:02:25,350 --> 01:02:27,830 Мы вернемся да гэтага, калі мы казалі аб шестигр. 992 01:02:27,830 --> 01:02:30,290 Давайце вернемся да гэтага і заключыць з гэтай рэччу, званай Бинки, 993 01:02:30,290 --> 01:02:33,710 Нагадаем якой з'яўляецца прафесар Стэнфардскага седзячы ў сябе дома, гуляючы з Claymation, 994 01:02:33,710 --> 01:02:36,380 каб распавесці гісторыю менавіта той жа праграмы. 995 01:02:36,380 --> 01:02:40,580 Гэта ўсяго толькі каля 3 хвілін. Тут мы маем Бинки. 996 01:02:40,580 --> 01:02:45,030 [Мужчынскі дынаміка на відэа] Гэй, Бинки, прачніся. Гэта час для паказальніка весела. 997 01:02:45,030 --> 01:02:50,080 [Бинки] Што гэта? Даведацца пра паказальнікаў? О, сентыментальны! 998 01:02:50,080 --> 01:02:53,700 [Мужчынскі дынамік] Ну, для пачатку, я думаю, мы будзем мець патрэбу ў некалькіх паказальнікаў. 999 01:02:53,700 --> 01:02:57,890 >> [Бинки] Добра. Гэты код вылучае 2 паказальнікі, якія могуць паказваць на цэлыя лікі. 1000 01:02:57,890 --> 01:03:02,220 [Мужчынскі дынамік] Добра. Ну, я бачу 2 паказальнікаў, але яны, падобна, не паказваючы ні да чаго. 1001 01:03:02,220 --> 01:03:05,550 [Бинки] Гэта дакладна. Першапачаткова, паказальнікі не паказваюць ні да чаго. 1002 01:03:05,550 --> 01:03:09,270 Тое, што яны паказваюць называюць pointees, а іх стварэння з'яўляецца асобным крокам. 1003 01:03:09,270 --> 01:03:12,330 [Мужчынскі дынамік] Ах, так, так. Я ведаў, што. Pointees асобна. 1004 01:03:12,330 --> 01:03:15,630 Э-э, так як вы вылучыць pointee? 1005 01:03:15,630 --> 01:03:21,510 [Бинки] Добра. Гэты код стварае новы цэлае pointee, і гэтая частка мноства Х, каб паказаць на гэта. 1006 01:03:21,510 --> 01:03:23,500 [Мужчынскі дынамік] Гэй, гэта выглядае лепш. 1007 01:03:23,500 --> 01:03:26,030 Так што гэта нешта рабіць. >> [Бинки] Добра. 1008 01:03:26,030 --> 01:03:30,300 Я буду разыменовать х, каб захаваць нумар 42 у сваім pointee. 1009 01:03:30,300 --> 01:03:34,410 Для гэтага трука мне патрэбна мая чароўная палачка разнаймення. 1010 01:03:34,410 --> 01:03:38,610 [Мужчынскі дынамік] Ваша чароўная палачка разнаймення? Гэта вельмі добра. 1011 01:03:38,610 --> 01:03:44,230 [Бинки] Гэта тое, што код выглядае наступным чынам. Я проста наладзіць колькасць і ... [Замест яе зухаваты гук] 1012 01:03:44,230 --> 01:03:46,100 [Мужчынскі дынамік] Гэй, паглядзіце, там яна ідзе. 1013 01:03:46,100 --> 01:03:50,990 Так робяць разнаймення на х варта стрэлку, каб адкрыць яе 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 [Бинки] Добра. Я пайду сюды, каб у і атрымаем лік 13 створаны 1017 01:04:03,250 --> 01:04:08,360 , А затым ўзяць палачку разнаймення і проста ... [Гудучы гук] Ух ты! 1018 01:04:08,360 --> 01:04:10,980 [Мужчынскі дынамік] О, эй, гэта не працуе. 1019 01:04:10,980 --> 01:04:14,870 >> Скажам, Бинки, я не думаю, што ў разнаймення гэта добрая ідэя 1020 01:04:14,870 --> 01:04:17,880 таму што стварэнне pointee асобны крок 1021 01:04:17,880 --> 01:04:19,850 і я не думаю, што мы калі-небудзь рабілі гэта. 1022 01:04:19,850 --> 01:04:21,770 [Бинки] Хм, добры пытанне. 1023 01:04:21,770 --> 01:04:26,640 [Мужчынскі дынамік] Так. Мы вылучылі паказальнік у, але мы ніколі не ўсталюйце яго, каб паказаць на pointee. 1024 01:04:26,640 --> 01:04:28,780 [Бинки] Хм, вельмі назіральныя. 1025 01:04:28,780 --> 01:04:30,690 [Мужчынскі дынамік] Гэй, вы шукаеце там добра, Бинки. 1026 01:04:30,690 --> 01:04:34,160 Вы можаце гэта выправіць, так што ў паказвае на той жа pointee як х? >> [Бинки] Вядома. 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 [Бинки] Не, гэта не датычыцца 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 Такім чынам, вы можаце паспрабаваць палачку разнаймення зноў адправіць на 13 старэй. 1034 01:04:54,520 --> 01:04:58,130 [Бинки] Ну, добра. Тут ідзе. [Замест яе зухаваты гук] 1035 01:04:58,130 --> 01:05:01,250 [Мужчынскі дынамік] Гэй, паглядзі на гэта. Цяпер разнаймення работ па у. 1036 01:05:01,250 --> 01:05:05,200 І таму, што паказальнікі абмену, што адна pointee, яны абодва бачаць 13. 1037 01:05:05,200 --> 01:05:06,910 [Бинки] Так, абмен. Усё роўна. 1038 01:05:06,910 --> 01:05:08,880 >> Такім чынам, мы збіраемся, каб памяняцца месцамі цяпер? 1039 01:05:08,880 --> 01:05:11,420 [Мужчынскі дынамік] О, глядзіце, мы па-за часам. >> [Бинки] Але - 1040 01:05:11,420 --> 01:05:13,880 [Мужчынскі дынамік] Толькі памятайце, 3 становішча паказальніка. 1041 01:05:13,880 --> 01:05:18,630 Нумар 1, базавая структура з'яўляецца тое, што ў вас ёсць паказальнік і ён паказвае да 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, разнаймення паказальніка пачынаецца з паказальніка і варта яго стрэлкі над 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 які выгляд вяртаецца ў Правіла № ​​1. 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 Гэта Бинки. Гэта CS50. Убачымся на наступным тыдні. [Апладысменты] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]