1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Semajno 4, daŭrigis] 2 00:00:02,310 --> 00:00:04,240 [Davido J. Malan - Universitato Harvard] 3 00:00:04,240 --> 00:00:07,290 [Jen CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> Ĉi tiu estas CS50, kaj ĉi tiu estas la fino de semajno 4. 5 00:00:11,290 --> 00:00:14,030 Do iuj bonaj novaĵoj kaj iuj malbonaj novaĵoj. 6 00:00:14,030 --> 00:00:26,240 Neniu prelego lundon, ne estas problemo starigis proksima semajno. [Studentoj huraado] 7 00:00:26,240 --> 00:00:28,680 Vi ne tuj ŝatis kie ĉi iras. 8 00:00:28,680 --> 00:00:31,590 Sed ni havas ĉi anstataŭ sekva merkredo, 9 00:00:31,590 --> 00:00:37,740 kaj ekzistas ankaŭ por la syllabus 1 vendredo prelego venontan vendredon por ke ni povas resti sur vojo. 10 00:00:37,740 --> 00:00:40,580 Sed ĉiu estos filmado kiel kutime, do ne zorgu. 11 00:00:40,580 --> 00:00:44,100 >> Kaj rilate al kvizon 0 kion ni faros al semajno fino 12 00:00:44,100 --> 00:00:47,140 estas eldoni en la kurso de hejmpaĝo cs50.net eksplikon 13 00:00:47,140 --> 00:00:50,160 de kia atendojn vi devus havi, kiam temas pri la unua kvizo. 14 00:00:50,160 --> 00:00:55,100 En ĝenerala, estos multnombraj elekto, vera-malvera, mallonga respondo, mallonga kodigo problemojn. 15 00:00:55,100 --> 00:00:57,360 Vi ne tuj atendus apliki la ekvivalenta 16 00:00:57,360 --> 00:01:00,030 de problemo ke vi vidus sur pset, por kiuj vi havas komputilon 17 00:01:00,030 --> 00:01:03,240 kaj erarserĉilo kaj similaj, sed ne estos malgranda kodigo problemojn. 18 00:01:03,240 --> 00:01:06,900 >> Kaj efektive, la plej bona gvidilo por akiri senton de tio, kion CS50 kvizojn estas kiel 19 00:01:06,900 --> 00:01:09,180 estas iri al cs50.net, iru al la Quizzes ligilo, 20 00:01:09,180 --> 00:01:11,920 kaj vi povas vidi la pasintaj kelkaj jaroj valoro de Quizzes. 21 00:01:11,920 --> 00:01:16,600 Nur rimarkas ke la kursaro ne ĉiam estis la sama dum la jaroj. 22 00:01:16,600 --> 00:01:18,510 Kelkfoje oni aldonas, foje subtrahi, 23 00:01:18,510 --> 00:01:20,670 do se vi vidas iun temon en unu el tiuj malnovaj kvizojn 24 00:01:20,670 --> 00:01:25,380 ke vi tute ne scias kion ĝi parolas, ĝi estas tre bone, ke ni ne kovras ĝin 25 00:01:25,380 --> 00:01:27,210 aŭ kiu ne kovris ĝin. 26 00:01:27,210 --> 00:01:31,110 Sed en la formo de recenzoj, ĉi dimanĉo, lundo, kaj Mardo 27 00:01:31,110 --> 00:01:34,770 tiel kiel kurson mondaj revizio kunsido je dimanĉo nokte - 28 00:01:34,770 --> 00:01:37,500 tempo kaj loko por anonci en la paso de hejmpaĝo - 29 00:01:37,500 --> 00:01:40,120 vi ĉiuj havas ŝancon por revizii la kurson de instruado uloj 30 00:01:40,120 --> 00:01:44,830 la materialo por ĉi tiu jaro, ambaŭ en sekcio kaj kiel plena klaso, 31 00:01:44,830 --> 00:01:48,400 kaj tiuj estos filmado kiel kutime ankaŭ. 32 00:01:48,400 --> 00:01:53,380 >> Bone. Do sen pli enkonduko, unu komenton pri pass / maltrafas kaj aldoni / faligi. 33 00:01:53,380 --> 00:01:57,980 Vi eble vidis miajn notojn hieraŭ nokte, kaj ĉi tiu estas vere nur iuj aldonaj konsilojn 34 00:01:57,980 --> 00:02:01,250 ke se vi estas inter tiuj aparte malpli komfortaj aŭ ie inter 35 00:02:01,250 --> 00:02:04,870 kaj vi sentante malmulta en super via kapo, 36 00:02:04,870 --> 00:02:08,430 rimarkas ke estas ja sufiĉe normala, kaj ekzistas ampleksa apogo strukturo en loko, 37 00:02:08,430 --> 00:02:13,530 unu el kiuj oficejo horoj estis la intenco de plibonigo des pli por mia retpoŝto lasta nokto, 38 00:02:13,530 --> 00:02:16,520 kaj realigi ankaŭ, ke estas eblo kiel pasas / malsukcesos por klaso kiel tiu 39 00:02:16,520 --> 00:02:21,540 vere estas intencita kiel mekanismo por preni la rando ekstere de kurso kiel ĉi tiu, 40 00:02:21,540 --> 00:02:24,200 por ke denove se vi elspezante tiuj 10, 15, 20 horoj 41 00:02:24,200 --> 00:02:28,160 nur klopodis akiri pset labori kaj vi scias ke estas 90-95% de la vojo 42 00:02:28,160 --> 00:02:32,100 sed vi ne povas trovi iujn malbenita cimo, en pass / malsukcesos modelo kiu estas speco de okay. 43 00:02:32,100 --> 00:02:36,230 >> La ideo estas ke kun tiu mekanismo vi povas tiam iru fokuso sur via aliaj psets 44 00:02:36,230 --> 00:02:39,530 aŭ dormi aŭ kiel ajn ĝi estas, ke vi volas enfokusigi. 45 00:02:39,530 --> 00:02:43,390 Do rimarkas ke vi havas ĝis la proksima mardo - teknike la 5a lundo, 46 00:02:43,390 --> 00:02:50,840 sed ĝi estas ferio, do ĉi venas mardo - ŝanĝi de pass / malsukcesas gradita aŭ inverse. 47 00:02:50,840 --> 00:02:54,450 Kaj se vi estas vere en la abismon kaj pensas delasante aro, 48 00:02:54,450 --> 00:02:56,440 bonvolu kapti min post prelego aŭ faligi min noton. 49 00:02:56,440 --> 00:02:59,990 Ni ŝatus almenaŭ babilejo antaux vi diros adieu. 50 00:02:59,990 --> 00:03:03,470 Bone. Do ni komencis prenante la trejnado radoj ekstere lasta fojo. 51 00:03:03,470 --> 00:03:06,030 En aparta, ni centris en linio. 52 00:03:06,030 --> 00:03:09,740 Linio estas io ke tio deklaris en la CS50 biblioteko, 53 00:03:09,740 --> 00:03:14,340 specife en tiu dosiero nomata cs50.h kiu ni komencu rigardi ĉi tiun semajnon kaj apud. 54 00:03:14,340 --> 00:03:17,250 Sed kordoj estas vere nur simpligo de io 55 00:03:17,250 --> 00:03:20,980 ke estas iom pli arcanely priskribita kiel char *. 56 00:03:20,980 --> 00:03:24,090 Char ni estas familiara kun. Estas nur sola karaktero. 57 00:03:24,090 --> 00:03:28,010 Sed * ekde lundo signifita kio? >> [Studento] A puntero. 58 00:03:28,010 --> 00:03:31,290 Al puntero. Kaj kio estas puntero? >> [Studento] An adreso. 59 00:03:31,290 --> 00:03:33,420 >> Estas kiel adreson, loko en memoro. 60 00:03:33,420 --> 00:03:35,910 Kio estas la adreso aŭ situo aŭ memoro? 61 00:03:35,910 --> 00:03:40,290 Denove, ni ĉiuj havas tekkomputiloj kun koncerto aŭ 2 gigabajtoj de RAM probable tiuj tagoj, 62 00:03:40,290 --> 00:03:44,160 kaj tio signifas ke vi havas miliardoj aŭ 2 miliardoj bitokoj valoro de memoro. 63 00:03:44,160 --> 00:03:46,240 Kaj ĝi ne vere gravas kion fizike similas, 64 00:03:46,240 --> 00:03:51,220 sed prenu sur fido, kiun vi povas kalkuli ĉiujn individuajn bitokoj ke via propra komputilo havas - 65 00:03:51,220 --> 00:03:54,580 ĉi tiu estas bajto 0, ĉi tiu estas bajto 1, ĉi tiu estas bajto 2 miliardoj - 66 00:03:54,580 --> 00:03:56,100 kaj tio estas ĝuste kion komputilo faras. 67 00:03:56,100 --> 00:04:00,030 Kiam vi destini spaco por sola karaktero, ekzemple, 68 00:04:00,030 --> 00:04:02,480 ĝi evidente havas por vivi ie en via komputilo memoro, 69 00:04:02,480 --> 00:04:05,860 kaj eble ĝi estas en bajto numeron 12345, 70 00:04:05,860 --> 00:04:08,470 kaj tio estas ie tie supre en via komputilo memoro. 71 00:04:08,470 --> 00:04:12,630 Kaj la adreso tiam de tiu karaktero estas 12345. 72 00:04:12,630 --> 00:04:16,140 >> Nun, en semajno 0 tra nun tiele nun, ni ne vere zorgis 73 00:04:16,140 --> 00:04:19,170 kie en memoro aĵoj estas stokitaj ĉar ni kutime uzas simbolojn, 74 00:04:19,170 --> 00:04:22,540 variabloj, kaj tabeloj por fakte atingi niajn datumojn. 75 00:04:22,540 --> 00:04:24,950 Sed ekde lundo kaj des pli nuntempe, vi nun havos 76 00:04:24,950 --> 00:04:27,710 des pli esprima kapablojn kun skribi programojn 77 00:04:27,710 --> 00:04:31,330 por vere manipuli komputilon memoro tamen vi vidas persvadi, 78 00:04:31,330 --> 00:04:33,720 por ambaŭ bonaj intencoj kaj malbonaj, 79 00:04:33,720 --> 00:04:39,620 erarojn esti tre komuna rezulto je ĉi tiu punkto en lerni ĉi aĵoj. 80 00:04:39,620 --> 00:04:42,460 Sed kion tio vere signifas esti char *? 81 00:04:42,460 --> 00:04:46,140 Ni iru antaŭen al - kaj ni revenos al Binky kiel promesis hodiaŭ. 82 00:04:46,140 --> 00:04:48,670 Ni iru al simpla ekzemplo tie. 83 00:04:48,670 --> 00:04:53,060 Lasu min savi ĉi tiun dosieron kiel compare.c, kaj lasu min nur ricevi iun ŝablonon kodo tie 84 00:04:53,060 --> 00:05:00,490 tiel inkluzivi stdio.h, lasu min ankaux doni min inkluzivas cs50.h. Mi zomi tie supre. 85 00:05:00,490 --> 00:05:05,850 Lasu min komenci skribi ĉefa int, ĉefa (malplena), kaj nun mi volas fari ion kiel jene: 86 00:05:05,850 --> 00:05:13,520 printf ("Donu al mi string:") kaj tiam mi uzos ĉenon s gets GetString 87 00:05:13,520 --> 00:05:16,750 por havi ĉenon de la uzanto, tiam mi tuj demandos la uzanton por alia. 88 00:05:16,750 --> 00:05:21,870 ("Donu al mi alian string:") kaj mi tuj petas ilin tra GetString atingi tion. 89 00:05:21,870 --> 00:05:27,020 Mi nomas ĝin t ĉar t venas post s kaj s estas bela nomo por kordoj, se ĝi estas bela generic. 90 00:05:27,020 --> 00:05:30,030 Do GetString, kaj nun mi volas nur fari prudento ĉeko kaj mi tuj diros 91 00:05:30,030 --> 00:05:39,770 se (j == t) tiam mi nur diros la uzanto printf ("Vi tajpis la samon! \ n"); 92 00:05:39,770 --> 00:05:45,520 alie mi tuj presi ion kiel ("Vi tajpitaj io malsama! \ n") 93 00:05:45,520 --> 00:05:48,460 aŭ kion ajn la frazo estos. Do io simila. 94 00:05:48,460 --> 00:05:52,200 Tiam kiel kutime, mi revenos 0 kiu ĵus indikis, ke nenio malbona okazis, 95 00:05:52,200 --> 00:05:54,400 kaj mi tuj iros antaŭen kaj tradukigi kaj ruli tiun programon. 96 00:05:54,400 --> 00:05:56,540 >> Sed lunde ni kuris koncerna programo, 97 00:05:56,540 --> 00:06:00,420 kaj fakte estis dirinta ke SALUTON ne SALUTON kaj Adiaŭ ne estas adiaŭ. 98 00:06:00,420 --> 00:06:03,140 La konduto ni vidis, estis iom pli kiel ĉi tio. 99 00:06:03,140 --> 00:06:11,450 Lasu min iri al mia fonto dosierujo, zoom ĉi tien, kaj ni do faru kompari. 100 00:06:11,450 --> 00:06:14,570 Kompilita okay. Mi kuros kompari. Donu al mi kordoj: SALUTON. 101 00:06:14,570 --> 00:06:16,300 Donu al mi alian kordoj: SALUTON. 102 00:06:16,300 --> 00:06:18,000 Vi tajpis ion malsama! 103 00:06:18,000 --> 00:06:22,650 Nu, mi provos ion simplan kiel 50, 50. Vi tajpis ion malsama! 104 00:06:22,650 --> 00:06:25,740 hi, hi. Do klare, iu okazas tie. 105 00:06:25,740 --> 00:06:28,440 Sed kio estis la klarigo por tio? 106 00:06:28,440 --> 00:06:33,850 Ŝajne, linio 12 estas tute disfuncional. 107 00:06:34,300 --> 00:06:39,430 Kio estas la fundamenta problemo ĉi tie? Yeah. >> [Studento] Oni komparas la adresoj. 108 00:06:39,430 --> 00:06:41,850 Yeah, precize. Ĝi estas vere komparas la adresoj 109 00:06:41,850 --> 00:06:44,580 en kiu SALUTON kaj SALUTON estas stokitaj. 110 00:06:44,580 --> 00:06:48,290 Ĝi estas ne kompari la literoj SALUTON denove kaj denove, 111 00:06:48,290 --> 00:06:52,370 ĉar tio, kio vere okazis, ĉiuj ĉi tempo ni estis uzante GetString - 112 00:06:52,370 --> 00:06:56,130 Tiu ĉi tabulo estas denove nia komputilo memoro, 113 00:06:56,130 --> 00:07:00,100 kaj diru mi vokas GetString post deklari variablon s. 114 00:07:00,100 --> 00:07:01,930 Kion do mia memoro aspektas? 115 00:07:01,930 --> 00:07:07,070 Ni arbitre diras ke s aspektas kiel ĉi tio. Ĝi estas kvadrata. 116 00:07:07,070 --> 00:07:09,040 Kaj preskaux iu tempo mi desegnis pecon de memoro sur la ekrano 117 00:07:09,040 --> 00:07:12,860 se estas 32 bitoj Mi estis desegni kvadratoj kiel ĉi tion ĉar ĝuste en la aparaton, 118 00:07:12,860 --> 00:07:17,380 puntero, adreson, estas 32 bitoj. Ĝi estas la sama kiel int. 119 00:07:17,380 --> 00:07:19,420 Kiu povas varii bazita sur komputila sistemo. 120 00:07:19,420 --> 00:07:24,630 Tiuj el vi, kiuj estas pigre familiara kun la fakto ke via Mac aŭ PC estas 64 bitoj, 121 00:07:24,630 --> 00:07:28,120 ke en la praktiko signifas, ke via komputilo uzante 64-bitan punteros, 122 00:07:28,120 --> 00:07:33,730 64-bita adresoj, kaj inter la upsides de tiu estas via komputiloj 123 00:07:33,730 --> 00:07:35,560 povas havi multe pli RAM ol pasintaj tempoj. 124 00:07:35,560 --> 00:07:39,240 Longan rakonton, reen en la tago, kiam komputiloj uzis nur 32 bitoj 125 00:07:39,240 --> 00:07:42,740 por reprezenti adresoj, la plej granda nombro da bajtoj vi povus reprezenti 126 00:07:42,740 --> 00:07:46,280 en tiu kazo estis kio, se vi havas 32 bitojn? 127 00:07:46,280 --> 00:07:49,590 Do 4 miliardoj, rajto, ĉar 2 al la 32 estas 4 miliardoj. 128 00:07:49,590 --> 00:07:51,370 Ĉi tiu nombro estas _recurring_ en la kurso. 129 00:07:51,370 --> 00:07:55,240 >> Do, se vi nur havas 32 bitojn, la plej alta nombro vi povas rakonti al estas proksimume 4 milionoj. 130 00:07:55,240 --> 00:07:58,750 Sed tio estis fundamenta limigo de komputiloj ĝis antaŭ kelkaj jaroj 131 00:07:58,750 --> 00:08:01,180 ĉar se vi nur povas kalkuli tiel alta kiel 4 miliardoj, 132 00:08:01,180 --> 00:08:05,270 ne gravas se vi aĉetos 8 gigabajtoj de RAM aŭ eĉ 5 gigabajtoj de RAM; 133 00:08:05,270 --> 00:08:07,780 vi ne povas kalkuli ke alta, tiel estis senutila. 134 00:08:07,780 --> 00:08:11,430 Vi nur povis aliri la unuaj 3 aŭ 4 gigabajtoj de via komputilo memoro. 135 00:08:11,430 --> 00:08:14,410 Tio estas malpli de temo nun, kaj vi povas aĉeti MacBook Avantaĝoj kaj valetoj 136 00:08:14,410 --> 00:08:17,680 kun 8 gigabajtoj de RAM aŭ eĉ pli ĉi tiuj tagoj. 137 00:08:17,680 --> 00:08:24,100 Sed se mi rezervu sufiĉe simple en ĉi tiu programo puntero, puntero nomita s, 138 00:08:24,100 --> 00:08:28,370 eble aspektas kiel tiu en la ekrano cxar ja ni bezonas senŝeligi reen ĉi tavolo. 139 00:08:28,370 --> 00:08:33,520 Mi parolas tiele kordoj, sed ekde lundo, kordoj estas vere char *, 140 00:08:33,520 --> 00:08:35,590 la adreso de iu gravulo. 141 00:08:35,590 --> 00:08:39,280 Do ni prenu, ke trejnado rado ekstere kvankam ni daŭre uzi GetString por nun. 142 00:08:39,280 --> 00:08:42,600 Do mi deklaris s, kaj ĉi tiu estas peco de memoro, 32 bitoj. 143 00:08:42,600 --> 00:08:47,370 Kio estas en ĉi tie en memoro defaŭlte? >> [Inaudible studento respondon] 144 00:08:47,370 --> 00:08:50,040 Kio estas tio? >> [Studento] Garbage. >> Garbage. Ekzakte. 145 00:08:50,040 --> 00:08:54,610 Se vi la programisto ne metas valoron en variablo, kiu scias kio ĝi estas? 146 00:08:54,610 --> 00:08:57,990 Kelkfoje vi ricevas bonŝanca kaj estas 0, kio estas speco de bona, pura defaŭlta valoro, 147 00:08:57,990 --> 00:09:00,310 sed kiel ni vidis lundo, foje ĝi estas kompleta sensencaĵo, 148 00:09:00,310 --> 00:09:04,130 iuj vere grandaj pozitivaj aŭ negativaj numero kiu venis de kie? 149 00:09:05,350 --> 00:09:07,010 Yeah. >> [Studento] La funkcio antaŭe. >> Jes. 150 00:09:07,010 --> 00:09:10,170 >> Ofte la funkcio kiu got nomis antaŭe pro memoras, 151 00:09:10,170 --> 00:09:13,920 kiel vi nomas funkcioj en memoro, ili prenu pli kaj pli spaco de la fundo supren, 152 00:09:13,920 --> 00:09:17,040 kaj tuj kiam la funkcio revenas, ke memoro gets reutilizado 153 00:09:17,040 --> 00:09:20,890 per la venonta ulo kiun gets vokis, kiu uzas vian saman tranĉaĵo de memoro. 154 00:09:20,890 --> 00:09:23,450 Kaj se vi havas maldekstre rubo tie, antaŭaj valoroj, 155 00:09:23,450 --> 00:09:28,190 ni povus konfuzi s kiel havanta iun valoron kiam vere ni ne metu ion ajn tie. 156 00:09:28,190 --> 00:09:30,960 Do nia RAM je ĉi tiu punkto aspektas kiel ĉi tio. 157 00:09:30,960 --> 00:09:36,030 Nun sur la dekstra flanko de la linio 7 ni vokas GetString, 158 00:09:36,030 --> 00:09:40,150 kiuj ni estas faras nun por semajnojn, sed kio GetString vere faras? 159 00:09:40,150 --> 00:09:43,350 GetString skribita de la CS50 dungitaro estas iom inteligenta 160 00:09:43,350 --> 00:09:46,500 en tiu tuj kiam la uzanto tajpas startas klavoj kaj sukcesojn Enter, 161 00:09:46,500 --> 00:09:50,010 GetString figuroj el kiom da keystrokes faris la uzanto sukceson, 162 00:09:50,010 --> 00:09:53,360 kiom da karakteroj mi bezonas destini RAM por. 163 00:09:53,360 --> 00:09:55,660 Kaj kie tiu RAM devenas, kiu scias? 164 00:09:55,660 --> 00:09:58,930 Estas ie en via komputilo 2 gigabajtoj aŭ whatnot de memoro. 165 00:09:58,930 --> 00:10:05,200 Sed ni supozu, ke la komputilo trovis spacon por la vorto SALUTON ĉi tie. 166 00:10:05,200 --> 00:10:08,710 La vorto mi tajpis estis H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 Kaj se ni desegni tiun kiel vico de karakteroj, ni povus desegni ĝin kiel ĉi tio. 168 00:10:13,510 --> 00:10:17,860 Sed mi bezonas fari 1 aldona afero. Kio apartenas al la fino de ajna ĉeno en C? 169 00:10:17,860 --> 00:10:20,710 La nula karaktero, kiujn ni skribu kiel \ 0. 170 00:10:20,710 --> 00:10:23,980 Estas teknike la nombro 0, sed la backslash faras ĉiujn klara 171 00:10:23,980 --> 00:10:28,150 ke tio estas laŭvorte la nombro 0, la entjero 0; 172 00:10:28,150 --> 00:10:32,440 ĝi ne estas, ekzemple, citaĵo-unquote 0 kiu vi povus skribi en la klavaro. 173 00:10:32,440 --> 00:10:33,940 Do ĉi tiu estas SALUTON. 174 00:10:33,940 --> 00:10:36,350 >> Kaj kion ni diras lundon ke funkcio kiel GetString 175 00:10:36,350 --> 00:10:39,580 Estas vere reveni ĉiuj tiuj semajnoj? 176 00:10:39,580 --> 00:10:43,960 Oni ne reveni ĉenon per si mem pro tio ne vere havi signifo 177 00:10:43,960 --> 00:10:47,710 ĉar ĉenoj ne ekzistas. Ili estas speco de fabrikada en la CS50 biblioteko. 178 00:10:47,710 --> 00:10:51,300 Kio estas vere ŝnuro, pli teknike? >> [Studento] Ĝi estas la unua signo. 179 00:10:51,300 --> 00:10:55,950 Ekzakte. Estas sufiĉe simple la adreso de la unua signo, ke la uzanto tajpas in 180 00:10:55,950 --> 00:11:02,810 Do, se mi tion diros SALUTON finas ĝin en bajto numeron 123 kaj poste en bajto numeron 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, kaj tiel plu, se mi ĝuste nombro mia bitokoj de 0 plu supren, 182 00:11:08,320 --> 00:11:12,650 kio vere GetString revenas estas laŭvorte la numeron 123. 183 00:11:12,650 --> 00:11:19,270 Do kio gets metis en s estas la nombro 123, ne la litero H, ne la vorto SALUTON, 184 00:11:19,270 --> 00:11:23,130 tute simple la adreso en kiu mi povas trovi la unuan literon de SALUTON. 185 00:11:23,130 --> 00:11:26,500 Sed tio ne ŝajnas kiel sufiĉa. Mi demandis vin pro ĉenon, ne karakteron. 186 00:11:26,500 --> 00:11:32,970 Nu do kiel ni aŭ al la komputilo scias ke ELLO ia venis kune kun la H? 187 00:11:35,760 --> 00:11:37,460 Kio estas la tipo de interkonsento ni havas? Yeah. 188 00:11:37,460 --> 00:11:40,100 [Studento] Ĝi gardas dirante mem trovi iun pli gravuloj. >> Ekzakte. 189 00:11:40,100 --> 00:11:44,570 >> Estas ĉi tiu homa-komputila konvencio laŭ kiu kiam vi traktas kun kordoj, 190 00:11:44,570 --> 00:11:49,410 alie konata nun kiel char steloj, vi simple devas kalkuli 191 00:11:49,410 --> 00:11:54,350 kie la fino de ĉiu linio en la vivo estas por vere nur ripetanta super ĝi kun por ciklo, 192 00:11:54,350 --> 00:11:57,820 momenton buklo, kion ajn, por ke kiam vi trovas la fino de la ŝnuro 193 00:11:57,820 --> 00:12:02,160 nun vi povas konkludi el tio, ho, la tuta vorto SALUTON. 194 00:12:02,160 --> 00:12:04,820 La de vi kun antaŭa programado sperto sciu en Java 195 00:12:04,820 --> 00:12:09,880 vi povas simple nomi. longa kaj en aliaj lingvoj vi povas nomi longo aŭ simila. 196 00:12:09,880 --> 00:12:14,060 Tio estas ĉar en multaj lingvoj, precipe tion nomis objekteman lingvoj, 197 00:12:14,060 --> 00:12:18,580 la longo de io estas ia encapsuladas ene de la peco de datumoj mem, 198 00:12:18,580 --> 00:12:24,000 multe ŝatis ni encapsuladas IDs kaj nomoj kaj domoj ene de studento lundon. 199 00:12:24,000 --> 00:12:28,700 Sed C estas multe pli malalta nivelo. Ne estas objektoj aŭ klasoj, se vi aŭdis tiujn terminojn antaŭe. 200 00:12:28,700 --> 00:12:31,490 Vi nur vere estas memoro adresoj. 201 00:12:31,490 --> 00:12:35,540 Do ĉi tiu estas speco de la antikva maniero reprezenti interesa datumstrukturoj. 202 00:12:35,540 --> 00:12:38,760 Vi havas komencon valoro kiel la adreson de la unua signo 203 00:12:38,760 --> 00:12:42,340 kaj tiam nur iuj arbitraj konvencio kiu ĉiuj konsentas sekvi. 204 00:12:42,340 --> 00:12:46,420 Do kiel estas cxeno longa implementado, ĉu ni proponas? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, kiun iuj el vi jam uzis kelkajn fojojn. Estas bela simpla, ĉu ne? 206 00:12:51,360 --> 00:12:53,060 Estas kiel 2 linioj de kodo. 207 00:12:53,060 --> 00:12:56,140 Estas preskaux a por buklo de iu varo, eble kun plia loka variablo. 208 00:12:56,140 --> 00:13:00,540 Sed strlen nur devas preni puntero kaj poste komencu serĉi \ 0. 209 00:13:00,540 --> 00:13:05,190 >> Kaj tuj kiam li trovas ĝin, ĝi povas reveni al la tuteca nombro de paŝoj kiuj ĝi estas prenita en tiu linio. 210 00:13:05,190 --> 00:13:07,150 Do ni povas konkludi el tiu kio iras sur proksima. 211 00:13:07,150 --> 00:13:11,850 Supozi tiam mi deklaras t kiel mi faris en linio 10. 212 00:13:11,850 --> 00:13:14,280 Tio estas iom da rubo valoro. Kiu scias unue? 213 00:13:14,280 --> 00:13:18,490 Sed sur la dekstra flanko de la linio de 10 Mi vokas GetString denove. 214 00:13:18,490 --> 00:13:20,050 Kiu scias kie tio finas? 215 00:13:20,050 --> 00:13:23,830 Ni arbitre diras ke la mastruma sistemo trovis lokon por ĝi maniero super tie. 216 00:13:23,830 --> 00:13:28,610 Mi hazarde hazarde tajpi H-E-L-L-Aŭ denove, 217 00:13:28,610 --> 00:13:31,260 kaj tiel ni povas desegni la sama speco de foto. 218 00:13:31,260 --> 00:13:34,290 Sed la fakto, ke mi havas reviziitaj ĉi bildo estas intenca 219 00:13:34,290 --> 00:13:37,720 ĉar tio estas malsama SALUTON ol ĉi tiu. 220 00:13:37,720 --> 00:13:43,920 Do jen tiu povas esti loko 456, jen 457, kaj tiel plu. 221 00:13:43,920 --> 00:13:47,170 Do kio gets metis kie la demandosigno iam estis? 222 00:13:47,170 --> 00:13:50,190 En ĉi tiu kazo 456. 223 00:13:50,190 --> 00:13:53,540 Ni pluki tiujn numerojn arbitre ĉar vere post hodiaŭ 224 00:13:53,540 --> 00:13:57,110 ni ne tuj zorgas tiom pri kio la adreso de io estas. 225 00:13:57,110 --> 00:14:02,690 Ĉiuj ni zorgas pri estas ke ni povas kalkuli la adreson de iu peco de datumoj kiel SALUTON. 226 00:14:02,690 --> 00:14:07,100 >> Do vere kion multaj homoj faras en komputiko, kiam parolas pri memoro adresoj 227 00:14:07,100 --> 00:14:10,210 kaj raportante punteros specife, 228 00:14:10,210 --> 00:14:14,220 anstataŭ ĝeni elŝeligi 123 - who cares kie ĉi aĵoj vere estas, 229 00:14:14,220 --> 00:14:17,440 ni nur scias ke estas en iu nombraj adreso - 230 00:14:17,440 --> 00:14:22,180 ni simpligi la mondo kaj nur diri, ke s indikante ke karaktero 231 00:14:22,180 --> 00:14:25,080 kaj t estas indikante ke karaktero. 232 00:14:25,080 --> 00:14:27,430 Kaj la fakto ke ĝi estas sago estas sufiĉe intenca 233 00:14:27,430 --> 00:14:31,610 ĉar laŭvorte nun s montrante H kaj t estas montrante ĉe la alia H 234 00:14:31,610 --> 00:14:34,720 ĉar en la fino de la tago, ne gravas kion la adreso estas, 235 00:14:34,720 --> 00:14:40,240 sed gravas, ke ni havas la kapablon esprimi ke adreso kun iu peco de kodo. 236 00:14:40,240 --> 00:14:42,730 Ni ne vere manipulitaj tiuj adresoj nur ankoraŭ 237 00:14:42,730 --> 00:14:47,770 do ni vidos, kie ni povas interject kaj ordigi de fari aferojn kun indikoj, 238 00:14:47,770 --> 00:14:52,030 sed por nun en linio 12 laŭvorte kion valoroj ni komparas 239 00:14:52,030 --> 00:14:55,500 laŭ tiu rakonto en linio 12? 240 00:14:56,570 --> 00:15:01,290 Ni diras nur 123 egala egala al 456? Kaj tio certe ne estas la kazo. 241 00:15:01,290 --> 00:15:05,320 Kaj eĉ koncepte, ĉi puntero certe ne estas la sama kiel tiu 242 00:15:05,320 --> 00:15:09,500 ĉar vi nomas GetString dufoje, kaj GetString ne pretendas esti super saĝa, 243 00:15:09,500 --> 00:15:12,470 ĝi ne provas realigi, ho, vi tajpis SALUTON 5 minutoj; 244 00:15:12,470 --> 00:15:15,090 mi donos al vi la saman puntero kiel mi donis al vi antaŭe, 245 00:15:15,090 --> 00:15:18,450 ĝi nur allocates nova bloko de memoro ĉiufoje vi nomas ĝin. 246 00:15:18,450 --> 00:15:20,350 >> Nu do kiel ni ripari tiun problemon? 247 00:15:20,350 --> 00:15:24,270 Se pli alta nivelo mi volas kompari la kordoj SALUTON kaj SALUTON - 248 00:15:24,270 --> 00:15:28,680 Mi ne zorgas pri la punteros - kiel mi iros sur respondi la demandon, 249 00:15:28,680 --> 00:15:31,980 ĉu la uzanto tajpas la saman aferon? Kio estas necesa ĉi tie? Yeah. 250 00:15:31,980 --> 00:15:35,200 [Studento] Uzu funkcio. >> Mi povas uzi funkcio ekster la skatolo. 251 00:15:35,200 --> 00:15:38,170 Mi povas uzi funkcio nomita strcmp, s-t-r-c-m-p, 252 00:15:38,170 --> 00:15:41,190 nur la mallongigita versio de diri string kompari. 253 00:15:41,190 --> 00:15:45,070 Kaj se ni iros en, ekzemple, komparu 2, kiu estas inter la hodiaŭa handouts, 254 00:15:45,070 --> 00:15:46,690 Mi faras ĝuste tion. 255 00:15:46,690 --> 00:15:51,750 Mi ĉion alie la sama de linio 1 en suben al 26 aŭ tiel, 256 00:15:51,750 --> 00:15:54,360 kaj nun rimarkis tiun parton ŝanĝis malmulta. 257 00:15:54,360 --> 00:15:57,690 Ni ignoru linio 28 dum momento kaj enfokusigi nur sur tiu ĉi. 258 00:15:57,690 --> 00:16:00,410 Kion ni diras lundo tiu str kompari faras? 259 00:16:00,410 --> 00:16:05,200 Ĝi manipulas la procezo de prenante 2 punteros, s kaj t en ĉi tiu kazo, 260 00:16:05,200 --> 00:16:08,480 ia virtuale metante lian fingron sur tiuj 2 literoj, 261 00:16:08,480 --> 00:16:11,530 kaj kion ŝi devas fari estas io kiel dum buklo aŭ por ciklo, 262 00:16:11,530 --> 00:16:16,050 kaj ĝi diras estas tiuj la sama? Se jes, ĝi moviĝas la fingroj aŭ la punteros antaŭen. 263 00:16:16,050 --> 00:16:17,970 Ĉu tiuj la sama, tiuj la sama, tiuj la sama, 264 00:16:17,970 --> 00:16:22,710 tiuj la sama, tiuj la sama? Kaj ooh, mi estas ĉe la fino de la ŝnuro ĉe ambaŭ s kaj t. 265 00:16:22,710 --> 00:16:26,780 Mi ne trovis ajnan kontraŭdiroj. Jes, tiuj kordoj estas la sama. 266 00:16:26,780 --> 00:16:31,940 Kaj kion tio str kompari reveno se 2 kordoj estas samaj, ŝajne? Nulo. 267 00:16:31,940 --> 00:16:35,900 Do 0 estas bona en tiu kazo ĉar se ĝi redonas -1 aŭ +1, 268 00:16:35,900 --> 00:16:40,560 tio signifas, ke estas nur okazas veni antaux t alfabete aŭ post t. 269 00:16:40,560 --> 00:16:43,760 Kaj kial tio estu utila havi funkcion kiu informas vin ke kordoj venas antaŭ 270 00:16:43,760 --> 00:16:46,720 aŭ post en vortaro? 271 00:16:46,720 --> 00:16:48,740 [Studento] Serĉado. >> Serĉado kaj ordigi. 272 00:16:48,740 --> 00:16:51,730 >> Do vi povas fari tion kiel duuma serĉo aŭ bobelo varo aŭ kunfandi speco 273 00:16:51,730 --> 00:16:53,230 kie vi devas kompari tion. 274 00:16:53,230 --> 00:16:56,420 Tiel malproksime ni ia tranĉi kelkajn angulojn kaj nur parolis pri ordigi 275 00:16:56,420 --> 00:16:59,430 en la kunteksto de nombroj ĉar ĝi estas agrabla kaj facila por paroli pri, 276 00:16:59,430 --> 00:17:02,430 sed vi certe povas kompari kordoj, pomo kaj banano, 277 00:17:02,430 --> 00:17:05,349 ĉar se pomo scias veni antaux banano, simile, 278 00:17:05,349 --> 00:17:09,319 vi povas movi kordoj ĉirkaŭ en memoro ĝuste kiel Rob faris kun merge varo en la video 279 00:17:09,319 --> 00:17:15,880 kaj ni faris ĉi tie sur la scenejo kun elekto varo, inserción varo, kaj bobelo varon. 280 00:17:15,880 --> 00:17:18,710 Do kie ajn ni povas utiligi ĉi tiun? Ni provu tion. 281 00:17:18,710 --> 00:17:23,980 Ni ia forgesas ke lecionon dum momento kaj provu nun kaj kopii 1.c fari la sekvajn. 282 00:17:23,980 --> 00:17:26,800 En linio 21 Mi diras print ion, 283 00:17:26,800 --> 00:17:28,520 tiam mi ricevas cxeno el la uzanto, 284 00:17:28,520 --> 00:17:30,690 tiam Mi kontrolanta ĉi. 285 00:17:30,690 --> 00:17:33,620 Ni ne vere alveninta en tiun kutimon ankoraŭ, sed ni nun faras tion. 286 00:17:33,620 --> 00:17:40,990 Ni efektive senŝeligi reen ĉi tavolo. Tiu estas vere char *. Tiu ulo estas vere char *. 287 00:17:40,990 --> 00:17:45,690 Do kion signifas esti kontrolanta se s == NULL? 288 00:17:45,690 --> 00:17:48,380 Rezultas, ke kiam vi nomas funkcio kiel GetString 289 00:17:48,380 --> 00:17:51,540 aŭ pli ĝenerale nur demandi komputilo por doni al vi iun memoron, 290 00:17:51,540 --> 00:17:53,030 io povus iri malbone. 291 00:17:53,030 --> 00:17:56,630 Vi povus esti freneza kaj peti la komputilon por terabajto de memoro 292 00:17:56,630 --> 00:18:01,780 per petante bilionoj da bajtoj da memoro, ke simple ne ekzistas en la komputilo, 293 00:18:01,780 --> 00:18:05,130 sed GetString kaj aliaj funkcioj bezonas iel de kriante pri vi 294 00:18:05,130 --> 00:18:06,820 se vi jam petis tro multe. 295 00:18:06,820 --> 00:18:10,450 Kaj la vojon GetString faras ĉi estas se vi petis por pli memoro 296 00:18:10,450 --> 00:18:14,250 ol estas havebla en la komputilo, eĉ se tio estas super, super malalta probablo 297 00:18:14,250 --> 00:18:17,730 ĉar neniu el ni tuj tajpi biliono karakteroj kaj tiam batis Enter, 298 00:18:17,730 --> 00:18:21,980 sed malalta probablo kvankam ĝi povas esti, mi ankoraŭ volas kontroli por ĝi ĉiaokaze, 299 00:18:21,980 --> 00:18:26,120 kaj la speciala valoro kiu GetString, respondo, kaj aliajn funkciojn revenas 300 00:18:26,120 --> 00:18:30,630 se iu iris malbone estas NULL en ĉiuj ĉapoj. 301 00:18:30,630 --> 00:18:36,520 >> Kaj kio estas NULL? NULL ĝuste tiel okazas por reprezenti puntero. Estas memoro adreso 0. 302 00:18:36,520 --> 00:18:40,800 La mondo decidis ke arbitre, se ĉi tiu estas mia komputilo memoro - vi scias kion? - 303 00:18:40,800 --> 00:18:46,260 ni iras ŝteli nur 1 bajto de ĉiu komputila memoro, kaj ĉi tiu estas loko 0. 304 00:18:46,260 --> 00:18:49,560 Ni tuj donos ĝin alnomo de NULL, kaj ni tuj promesi 305 00:18:49,560 --> 00:18:52,660 ke ni neniam vere metis realaj datumoj tie 306 00:18:52,660 --> 00:18:56,770 ĉar ni nur arbitre bezonas specialan valoron, 0, aka NULL, 307 00:18:56,770 --> 00:19:00,230 tiel ke ni povos krii ĉe la uzantoj se iu iras malbone. 308 00:19:00,230 --> 00:19:03,590 Alie vi eble ne scias tio signifas 0 metis ion ĉi tie 309 00:19:03,590 --> 00:19:05,490 aŭ ĝi signifas ion misokazis? 310 00:19:05,490 --> 00:19:09,190 Ni devas cxiuj konsentas ke NULL per nenio revenis, 311 00:19:09,190 --> 00:19:11,700 neniu reala adreso estis redonita. 312 00:19:11,700 --> 00:19:15,210 Nun, ĉi tie mi nur adoptante mia homa konvencio de mi revenos 1 de ĉefa 313 00:19:15,210 --> 00:19:17,040 se iu iras malbone. 314 00:19:17,040 --> 00:19:20,650 Tio estas ĉar ĉefan la reveno konvencio estas reveni 0 se bona, 315 00:19:20,650 --> 00:19:22,990 1 aŭ alian valoron se malbonaj. 316 00:19:22,990 --> 00:19:28,200 Sed GetString kaj ajna funkcio kiu traktas en memoro revenas NULL se io iras malbone. 317 00:19:28,200 --> 00:19:33,480 >> Okay. Do bedaŭrinde, linio 27, super simplan kvankam ĝi estas, tute maltrafas kopii la kordo. 318 00:19:33,480 --> 00:19:35,740 Kial? Ni povas vidi tion kiel sekvas. 319 00:19:35,740 --> 00:19:40,120 Mi asertas en linio 27 al esti farante kopion de s kaj nomante ĝin t. 320 00:19:40,120 --> 00:19:45,790 Do mi ne demandante la uzanton dum 2 kordoj nun; Mi nur diras la valoron en s 321 00:19:45,790 --> 00:19:47,870 devus esti metita en t tiel. 322 00:19:47,870 --> 00:19:52,890 Do nun nur por pruvi kiom rompita ĉi tio estas, en linio 29 antaŭen kion mi faras? 323 00:19:52,890 --> 00:19:56,980 Unue mi kontrolanta se la longo de t estas pli granda ol 0. 324 00:19:56,980 --> 00:19:59,330 Ekzistas iuj kordoj tie. La uzanto tajpita io in 325 00:19:59,330 --> 00:20:03,410 Kio estas linio 32 farante, ŝajne? 326 00:20:03,410 --> 00:20:08,910 [Inaudible studento respondon] >> Ĝuste. Vi povas ia konkludi ĝin el kion mi diris ĝi estas farante. 327 00:20:08,910 --> 00:20:13,200 Sed teknike, kio ĉi faras? t [0] reprezentas kio? 328 00:20:13,200 --> 00:20:15,140 [Studento] La nula karaktero. >> [Malan] La nula karaktero. 329 00:20:15,140 --> 00:20:19,620 Aŭ, pli homa-similaj, la unua gravulo en t, kion ajn tio estas, H eble en tiu kazo. 330 00:20:19,620 --> 00:20:24,990 Kaj toupper faras kion ĝi diras. Ĝi capitalizes la nula karaktero de t kaj ŝanĝas ĝin. 331 00:20:24,990 --> 00:20:28,430 Do tio signifas preni la nula karaktero de t, fari ĝin majuskle, 332 00:20:28,430 --> 00:20:30,320 kaj remetis ĝin en tiu sama loko. 333 00:20:30,320 --> 00:20:35,540 Do se mi tajpas saluton en minuskla, tiu devus ŝanĝi la minuskla h al ĉefurbo H. 334 00:20:35,540 --> 00:20:41,400 Sed la problemo estas ke en linioj 35 kaj 36 kio mi estas faronta estas presi por ni s kaj t. 335 00:20:41,400 --> 00:20:43,120 Kaj kio estas viaj corazonada? 336 00:20:43,120 --> 00:20:47,250 Kion mi vere tuj vidos se mi tajpis en saluton en ĉiuj minuskla? 337 00:20:47,250 --> 00:20:52,280 Kio okazas al get presita? >> [Inaudible studento respondon] >> Kio estas tio? 338 00:20:52,280 --> 00:20:58,360 [Studento] Big H kaj la resto malgranda. >> La granda H kaj la resto malgranda por kiu, s aŭ t? 339 00:20:58,360 --> 00:21:03,170 [Studento] Ambaŭ. >> Ambaŭ. Ekzakte. Do ni vidu kio okazas tie. 340 00:21:03,170 --> 00:21:08,380 >> Lasu min kaj kompili ĉi. Ĉi tiu estas copy1, do fari copy1. Bone. 341 00:21:08,380 --> 00:21:14,840 Zoom in Lasu min kaj kuras copy1, Enter, diru ion: saluton en minuskla. 342 00:21:14,840 --> 00:21:19,570 Ĝi majusklon la kopion, sed ĝi ŝajne majusklon la originala tiel, 343 00:21:19,570 --> 00:21:22,070 ĉar kio nun okazas en tiu rakonto? 344 00:21:22,070 --> 00:21:27,030 En linio 27 Mi ne vere ŝajnas esti kopii la kordo, 345 00:21:27,030 --> 00:21:30,450 sed kvankam vi povus esti intuicie esperis, ke esti la kazo, 346 00:21:30,450 --> 00:21:33,680 se vi pensas pri tiu bildo, kio vere mi faris? 347 00:21:33,680 --> 00:21:35,410 La duono de la bildo estas la sama. 348 00:21:35,410 --> 00:21:39,390 Do ni ruliĝi malantaŭen en la tempo tiel ke t ankoraŭ ne ekzistas en la rakonto. 349 00:21:39,390 --> 00:21:43,160 S povas ekzisti en la rakonto, sed estu la minuskla saluton ĉi tiu tempo. 350 00:21:43,160 --> 00:21:46,710 Do lasu min ripari kion mi fakte tajpis in 351 00:21:46,710 --> 00:21:51,280 En ĉi tiu kazo tie ni havas h-kaj-l-l-o. 352 00:21:51,280 --> 00:21:58,050 Ni desegni ĝin kiel vico de signoj, metis mian separador linioj tie kaj mia \ 0. 353 00:21:58,050 --> 00:22:05,980 Do tiu estas kie ni estas tiel frue kiel linio 1 ĝis 24-ish, donu aŭ preni, esti ekzekutita. 354 00:22:05,980 --> 00:22:07,800 Tiu estas la portreto de mia memoro. 355 00:22:07,800 --> 00:22:10,800 Kiam mi alvenas al linio 27, kio okazas? 356 00:22:10,800 --> 00:22:14,730 Ĝuste kiel antaŭe, mi ricevas puntero, kiu mi desegni kiel ĉi placo. 357 00:22:14,730 --> 00:22:19,740 Ĝi nomas t. Kaj kio estas ĝia valoro implicite? Kiu scias? Iuj rubo valoro. 358 00:22:19,740 --> 00:22:22,060 >> Do Mi instruos vin abstrakta ke for kiel demandosigno. 359 00:22:22,060 --> 00:22:27,670 Kaj tuj kiam la dekstra flanko de la linio 27 ekzekutas, kion mi meti ene de t? 360 00:22:27,670 --> 00:22:30,770 La sama afero, ke estas en s. 361 00:22:30,770 --> 00:22:34,120 Do, se ni por momento forigi ĉi abstraktado de la sago kaj ni diru, 362 00:22:34,120 --> 00:22:40,330 oh, tio estas memoro ŝarĝo adreso 123, kiam vi diras t gets s, punktokomo, 363 00:22:40,330 --> 00:22:42,700 vi laŭvorte metante 123 ĉi tie. 364 00:22:42,700 --> 00:22:45,200 Nun se ni ia simpligi nia mondo denove kun bildoj, 365 00:22:45,200 --> 00:22:48,750 kion vi vere faris estas simple aldonis alian sagon por via mondo 366 00:22:48,750 --> 00:22:52,910 ke tio montrante el t al la sama ĝusta linio. 367 00:22:52,910 --> 00:22:59,730 Do kiam en linio 31 kaj 32 Mi vere irad ŝanĝi t [0], 368 00:22:59,730 --> 00:23:05,580 kio estas t [0] ŝajne sinonimo de nun? s [0] 369 00:23:05,580 --> 00:23:07,030 Do jen ĉio tio okazas. 370 00:23:07,030 --> 00:23:09,900 Kaj eĉ se ĉi tiu speco de sentas iom malalta nivelo kaj arcano 371 00:23:09,900 --> 00:23:12,760 kaj ĉi speco de sentas eble intuicie ĉi devus esti ĝuste funkciis - 372 00:23:12,760 --> 00:23:15,410 Mi faris kopiojn de aĵoj antaŭ kaj ĝi apenaŭ funkciis - 373 00:23:15,410 --> 00:23:18,590 se vi vere pensas pri kio ĉenon vere estas, estas char *. 374 00:23:18,590 --> 00:23:21,700 Nu, kio estas tio? Ĝi estas la adreso de iu gravulo. 375 00:23:21,700 --> 00:23:24,930 Tiam eble faras pli senco ke kiam vi provas fari ion 376 00:23:24,930 --> 00:23:29,220 super ŝajne simpla kiel tiu, ĉiu vi faras estas kopiado de memoro adreso. 377 00:23:29,220 --> 00:23:32,530 Vi ne vere faras nenion kun la kordo mem. 378 00:23:32,530 --> 00:23:37,500 Do eĉ se vi ne havas ideon kiom vi solvus tiun problemon en kodo, 379 00:23:37,500 --> 00:23:45,080 alta nivelo, koncepte, kion ni devas fari por fari ta vera kopio de s, ŝajne? 380 00:23:46,670 --> 00:23:48,820 Yeah. >> [Studento] Donu ĝin al nova loko? >> Ekzakte. 381 00:23:48,820 --> 00:23:50,800 >> Ni devas doni t tute nova loko. 382 00:23:50,800 --> 00:23:55,230 Ni devas iel krei mondon en kiu ni atingos novan eron de memoro, 383 00:23:55,230 --> 00:24:00,090 kiu nur por klareco, kalkaj Mi desegni dekstra sub ĉi tiu, sed ĝi ne bezonas esti tie. 384 00:24:00,090 --> 00:24:04,880 Sed bezonas esti la sama amplekso, do mi desegni tiujn vertikalaj linioj en la sama loko. 385 00:24:04,880 --> 00:24:09,720 Ĝi estas bone se tio ne estas tuta rubo komence. Kiu scias, kio estas tie? 386 00:24:09,720 --> 00:24:13,850 Sed paŝo 1 tuj devas doni al mi tiel memoro kiel mi bezonas 387 00:24:13,850 --> 00:24:18,630 persvadi kopion de saluton, tiam manieron kopii la h tie, la TTT tie, 388 00:24:18,630 --> 00:24:20,390 la l tie kaj tiel plu. 389 00:24:20,390 --> 00:24:24,880 Sed ĉi tiu jam devas senti iom evidenta eĉ se kelkaj el la detaloj estas ankoraŭ abstrakta. 390 00:24:24,880 --> 00:24:28,690 Kopii ĉi ŝnuro en tiun, ĝi estas nur por buklo aŭ dum buklo 391 00:24:28,690 --> 00:24:31,580 aŭ iu kun kiu vi fariĝis des pli familiara. 392 00:24:31,580 --> 00:24:35,970 Do ni provu tion. Lasu min iri en copy2.c. 393 00:24:35,970 --> 00:24:43,270 En copy2.c ni havas preskaŭ la saman programon krom linio 27. 394 00:24:43,270 --> 00:24:47,260 Ĝi aspektas iom kompleksa, sed se ni dispecigas ĝin pecon post peco, 395 00:24:47,260 --> 00:24:48,950 la maldekstra flanko estas la sama. 396 00:24:48,950 --> 00:24:52,790 Char * t kreas tiun aferon en memoro, kvankam kun demandosigno 397 00:24:52,790 --> 00:24:54,680 ĉar ni ne havas ideon kio estas tie defaŭlte. 398 00:24:54,680 --> 00:24:57,920 Sur la dekstra flanko ni nun enkonduki novan funkcion, malloc, 399 00:24:57,920 --> 00:25:00,640 por memoro destini, donu al mi memoro, 400 00:25:00,640 --> 00:25:06,900 kaj ĝi ŝajne prenas kiom argumentoj, kiom da aferoj ene krampoj? 401 00:25:09,660 --> 00:25:12,130 Mi aŭdis murmuradon de 1 kaj 2, sed ĝi estas nur 1. 402 00:25:12,130 --> 00:25:15,320 Ne komo, kiu signifas ke estas nur 1 afero ene de la krampoj. 403 00:25:15,320 --> 00:25:17,720 Kvankam ekzistas aliaj krampoj, lasu min reliefigi 404 00:25:17,720 --> 00:25:21,460 kio estas ene de la ekstrema krampoj, kaj ĝi estas tiu esprimo: 405 00:25:21,460 --> 00:25:25,880 (Strlen (j) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Do, se ni vere kredas ke tiu tra, ĉi diras al mi la longo de s. 407 00:25:29,190 --> 00:25:34,440 Kial estas mi, kvankam, aldonante 1 sur la longo? >> [Inaudible studento respondon] 408 00:25:34,440 --> 00:25:40,200 Ekzakte. Ni bezonas spacon por tiu ulo ĉe la vosto, la sesa karaktero, kiu ne havas anglan signifon 409 00:25:40,200 --> 00:25:42,250 sed ne havas specialajn programita signifon. 410 00:25:42,250 --> 00:25:46,800 >> Do ni bezonas + 1 por ke ĉar strlen revenas la homa atendo de longa, 411 00:25:46,800 --> 00:25:50,890 saluton aŭ 5, ĝi ne donas al vi la aldonaj nula karaktero. 412 00:25:50,890 --> 00:25:52,980 Do mi permane aldoni tiun kun + 1. 413 00:25:52,980 --> 00:25:56,060 Kaj tiam tiu, * grandeco de (char), ni ne vidis ĉi tion antaŭe. 414 00:25:56,060 --> 00:25:57,480 Tio ne estas teknike funkcio. 415 00:25:57,480 --> 00:26:04,150 Ĝi estas speciala ŝlosilvorto ke nur diras al vi, kion la grandeco estas de iu datumtipo en komputilo 416 00:26:04,150 --> 00:26:06,980 ĉar fakte, iuj el ni havas 32-bitan komputiloj. 417 00:26:06,980 --> 00:26:10,900 Mi havas belan malnova komputilo hejme, kaj ĝi nur uzas 32 bitojn por reprezenti punteros. 418 00:26:10,900 --> 00:26:13,900 Kaj tial, se mi faris grandeco de datumtipo, ĝi povus esti 32 bitoj. 419 00:26:13,900 --> 00:26:18,300 Sed se mi per mia nova kaprico komputilo, mi povus reiri valoro de 64 bitoj 420 00:26:18,300 --> 00:26:20,510 por iu kiel adreson. 421 00:26:20,510 --> 00:26:25,400 Do ĉi-kaze, nur por esti super sekura, ni ne tuj forte kodo ion kiel - 422 00:26:25,400 --> 00:26:28,740 bone, kio estas la grandeco de char laŭ kion ni diris ĝis nun? 423 00:26:28,740 --> 00:26:34,450 Ni preskaux diris parole, ke ĝi estas 1 bajto, kaj tio estas preskaux vera trans la tabulo. 424 00:26:34,450 --> 00:26:37,000 Sed denove, supozoj inklinas esti malbona. 425 00:26:37,000 --> 00:26:40,850 Ili kondukas al kalesxo programaro se homoj uzas viajn programaro en manieroj vi ne intencas. 426 00:26:40,850 --> 00:26:44,750 Do estu la abstrakta ĉi for kaj nur pli genéricamente diri 427 00:26:44,750 --> 00:26:46,830 Mi bezonas tiun multaj pecoj de memoro 428 00:26:46,830 --> 00:26:50,210 kaj ĉiu eron de memoro devas esti ekvivalento al la grandeco de karaktero, 429 00:26:50,210 --> 00:26:54,870 kio estas fakte egala al 1 en ĉi tiu kazo, sed estas pli ĝenerala metodo por skribi ĝin. 430 00:26:54,870 --> 00:27:00,460 Do, se la vorto estas saluton, kiom da bitokoj ne malloc ŝajne destini por saluton? 431 00:27:00,460 --> 00:27:04,980 [Studento] Ses. >> Ses. Ĝuste tiom kiom ni havas demandon markojn sur la ekrano. 432 00:27:04,980 --> 00:27:07,800 Kaj poste preni supozas nun bazitaj sur via kompreno de GetString 433 00:27:07,800 --> 00:27:12,790 kion signifas malloc probable revenos? >> [Studento] An adreso. 434 00:27:12,790 --> 00:27:17,020 Adreson de kio? De la unua bloko de memoro. 435 00:27:17,020 --> 00:27:20,670 >> Ni ne havas ideon kio estas tie ĉar iuj aliaj funkcioj 436 00:27:20,670 --> 00:27:23,010 povus esti uzanta tiun memoron antaŭe. 437 00:27:23,010 --> 00:27:28,380 Sed malloc, kiel GetString, denove la adreson de la unua bitoko de memoro 438 00:27:28,380 --> 00:27:30,540 ke ĝi rezervis por vi. 439 00:27:30,540 --> 00:27:38,380 Tamen, kion ne faras, plenumi la malplenan kun backslash nula karaktero 440 00:27:38,380 --> 00:27:43,030 ĉar ĝi rezultas vi povas uzi malloc destini ion: ints, kordoj, tabeloj, 441 00:27:43,030 --> 00:27:45,700 flosas, studento strukturoj. 442 00:27:45,700 --> 00:27:47,750 Vi povas uzi malloc tute genéricamente. 443 00:27:47,750 --> 00:27:51,470 Ne gravas aux devas scii kion vi atribuante memoro por. 444 00:27:51,470 --> 00:27:55,810 Do estus orgojla por malloc meti \ 0 445 00:27:55,810 --> 00:27:58,340 fine de ĉiu bloko de memoro ĝi estas donas al vi 446 00:27:58,340 --> 00:28:02,620 ĉar ĉi \ 0 afero estas nur konvencio por kordoj. 447 00:28:02,620 --> 00:28:06,310 Oni ne uzas por ints, ĝi ne uzas por kaleŝegoj, ĝi ne uzas por studentoj. 448 00:28:06,310 --> 00:28:11,730 Kaj tial la gotcha kun malloc estas ke la ŝarĝo estas tute en vi la programisto 449 00:28:11,730 --> 00:28:16,790 memori, kiom da bitokoj vi destinis kaj ne cxiam uzas por buklo 450 00:28:16,790 --> 00:28:21,570 aŭ dum loop kaj iri preter la limo de la bloko de memoro vi donis. 451 00:28:21,570 --> 00:28:23,540 Meti alia vojo, kiam vi rezervi memoron, 452 00:28:23,540 --> 00:28:28,510 vi ne povas peti la mastruma sistemo, oh, por iu, kiom granda de eron de memoro estis tio? 453 00:28:28,510 --> 00:28:32,080 Estas tute ĝis vi memoras se vi bezonas tiun valoron. 454 00:28:32,080 --> 00:28:34,330 >> Do ni vidu kiel mi procedi por uzi ĉi tiun memoron. 455 00:28:34,330 --> 00:28:38,430 En linio 28 kaj 29 kial mi faras tion? 456 00:28:39,850 --> 00:28:42,260 Ĝuste tuta prudento ĉeko. 457 00:28:42,260 --> 00:28:45,110 Ĉiaokaze ion misokazis, mi petas iom freneza kvanto de memoro 458 00:28:45,110 --> 00:28:48,690 aŭ mi tiom da aferoj kurante en la komputilo kiu ne nur ne sufiĉas memoro, 459 00:28:48,690 --> 00:28:51,780 io simila, mi almenaŭ volas kontroli por nula. 460 00:28:51,780 --> 00:28:55,260 En realo, plej komputiloj donos al vi la iluzion, ke ĉiu programo 461 00:28:55,260 --> 00:28:57,080 povas uzi la tuteco de via memoro RAM, 462 00:28:57,080 --> 00:29:00,740 sed malgraŭ tio, se la uzanto tajpas en iu freneza longa ŝnuro eble ĉar ili estas malbonaj ulo 463 00:29:00,740 --> 00:29:03,440 kaj ili estas efektive provas frakasi vian programon aŭ hack en ĝin, 464 00:29:03,440 --> 00:29:07,300 vi volas almenaŭ kontrolu la reveno valoro de malloc kaj ĉu ĝi egalas nula. 465 00:29:07,300 --> 00:29:11,630 Kaj se ĝi faras, ni ĵus forlasis nun ĉar mi ne sciis, kion fari en tiu kazo. 466 00:29:11,630 --> 00:29:13,950 Kiel mi kopii la kordo? Estas kelkaj manieroj por fari tion. 467 00:29:13,950 --> 00:29:18,850 Esas str kopii funkcioj en C, sed estas super simpla por ni fari tion la antikva vojo. 468 00:29:18,850 --> 00:29:23,110 >> Unue lasu min elkompreni kiel la longo de s estas. 469 00:29:23,110 --> 00:29:26,930 Mi povus esti meti ĉi tion en la maŝo, sed anstataŭe mi nur metis ĝin tie por klareco. 470 00:29:26,930 --> 00:29:30,610 Do n nun stokas la longon de la originalaj ŝnuroj, kiuj estas ŝajne 5. 471 00:29:30,610 --> 00:29:35,290 Tiam en mia por buklo min ripetanta de 0 sur ĝis n, 472 00:29:35,290 --> 00:29:40,940 kaj sur ĉiu ripeto Mi metante s [i] ene de t [i]. 473 00:29:40,940 --> 00:29:45,060 Do jen kion mi implicis kun miaj 2 fingroj ĉe la kordoj antaŭe. 474 00:29:45,060 --> 00:29:49,260 Kiel ĉi por buklo iterates kiel ĉi tiu, mi tuj iros kopiado h en ĉi tie, 475 00:29:49,260 --> 00:29:52,890 TTT enen tie, l enen tie ĉar ĉi tiu estas s, ĉi tiu estas t. 476 00:29:52,890 --> 00:29:58,770 Kaj poste laste, en linio 35 kial mi faras tion? 477 00:29:58,770 --> 00:30:03,770 Mi bezonas certigi ke mi finas la kordo t. 478 00:30:03,770 --> 00:30:06,170 Kaj mi faris tion ĉi tiu maniero al esti super eksplicita. 479 00:30:06,170 --> 00:30:09,510 Sed proponas, ke iu, se vi povus, malsama maniero fari tion. 480 00:30:09,510 --> 00:30:13,930 Mi ne vere bezonas linion 35. Ekzistas alia maniero por fari tion. 481 00:30:13,930 --> 00:30:18,880 Yeah. >> [Inaudible studento respondon] >> Diru ĝin laŭte. 482 00:30:18,880 --> 00:30:20,960 [Studento] Malpli ol aŭ egala al. >> Ekzakte. 483 00:30:20,960 --> 00:30:24,450 Ni povus simple diri malpli ol aŭ egala al n, kiu ĝenerale estis malbona 484 00:30:24,450 --> 00:30:28,190 ĉar preskaŭ ĉiam kiam ni supreniras al egala al la afero ni rakonti 485 00:30:28,190 --> 00:30:30,000 ni iru 1 paŝo tro for. 486 00:30:30,000 --> 00:30:32,170 Sed memoru, kiom da bitokoj ni ne destini? 487 00:30:32,170 --> 00:30:37,210 Ni destinis strlen de s, do 5 + 1 por tuta de 6. 488 00:30:37,210 --> 00:30:39,980 Do en ĉi tiu kazo ni povus fari ion kiel tiu 489 00:30:39,980 --> 00:30:46,450 por ke ni kopiado ne nur la saluton sed ankaŭ la \ 0 je la fino. 490 00:30:46,450 --> 00:30:49,860 Alternative, ni povus uzi funkcio nomita str kopion, strcpy, 491 00:30:49,860 --> 00:30:51,700 sed kiu ne estus preskaŭ tiel amuza. 492 00:30:51,700 --> 00:30:54,000 Sed tio ĉio ĝi faras sub la kapuĉo. 493 00:30:54,000 --> 00:30:56,050 Tiam laste, ni faru tion saman kiel antaŭe. 494 00:30:56,050 --> 00:31:01,620 Mi profiti t kaj poste mi asertas ke la originala aspektas kiel ĉi tiu kaj la kopio aspektas tiel. 495 00:31:01,620 --> 00:31:08,570 Do ni provu tion. Lasu min iri en ĉi tie. Faru copy2. Ni zomi en kaj kuri copy2. 496 00:31:08,570 --> 00:31:13,840 Mi iros por tajpi en saluton en minuskla, kaj ja I get minuskla saluton kiel la originalo 497 00:31:13,840 --> 00:31:16,930 sed ĉefurbo Saluton por la kopio. 498 00:31:16,930 --> 00:31:20,300 Sed mi ne faris nur ankoraŭ. Mi bezonas fari 1 lasta afero ĉi tie. 499 00:31:20,300 --> 00:31:28,000 46 kaj 47 estas klare liberigi memoron, sed kion tio ke en la praktiko signifas? 500 00:31:28,000 --> 00:31:33,250 Kion mi faras, vi opinias, nomante linio 46 kaj linio 47? 501 00:31:33,250 --> 00:31:38,900 Kio efekto ĉu tio havas? Yeah. 502 00:31:38,900 --> 00:31:43,140 [Inaudible studento respondon] >> Ekzakte. 503 00:31:43,140 --> 00:31:46,380 >> Vi nur diras la mastruma sistemo, hey, dankon pro tiu memoro. 504 00:31:46,380 --> 00:31:48,320 Vi povas nun uzi ĝin por iu alia. 505 00:31:48,320 --> 00:31:50,790 Kaj jen perfekta ekzemplo de rubo valoroj. 506 00:31:50,790 --> 00:31:55,430 Mi ĵus uzis tiun memoron noti la vorton saluton en 2 lokoj, 507 00:31:55,430 --> 00:31:57,490 ĉi tie, tie, tie kaj tie. 508 00:31:57,490 --> 00:32:00,910 Do tiu estas h-kaj-l-l-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Sed tiam mi vokas linio 46 kaj linio 47, kaj vi scias kio okazas tie en terminoj de la foto? 510 00:32:06,960 --> 00:32:10,010 Fakte, atendu, ĉi bildo estas la malnova. 511 00:32:10,010 --> 00:32:12,550 Iam ni fari la kopion, tiu ulo estas vere montrante tie, 512 00:32:12,550 --> 00:32:16,110 do ni forigu la nombroj kaj nur abstrakta for kiel nia sagojn denove. 513 00:32:16,110 --> 00:32:19,370 Kio okazas en tiu ĉi bildo, kiam mi vokas libera? 514 00:32:19,370 --> 00:32:22,750 [Inaudible studento respondon] >> Ne vespero. 515 00:32:22,750 --> 00:32:29,510 Se mi nomas libera sur s kaj t - speco de lertaĵo demando - tiu bildo ne ŝanĝas tute 516 00:32:29,510 --> 00:32:33,880 ĉar nomi s kaj nomante t simple rakontas la mastruma sistemo, 517 00:32:33,880 --> 00:32:39,010 hey, vi povas uzi tiun memoro denove, sed ne ŝanĝas tion al nula 518 00:32:39,010 --> 00:32:41,840 aŭ iu speciala karaktero, ĝi ne ŝanĝas tion, 519 00:32:41,840 --> 00:32:47,350 ĝi ne ŝanĝas la h aŭ la TTT aux la l aŭ la l aŭ la o en ĉu loko por io alia. 520 00:32:47,350 --> 00:32:51,610 En terminoj de la bildo, tuj kiam vi nomas libera, nenion ŝanĝas. 521 00:32:51,610 --> 00:32:56,570 Kaj en gxi kusxas la origino de rubo valoroj ĉar se mi tiam poste en tiu programo 522 00:32:56,570 --> 00:33:01,010 demandu la mastruma sistemo por pli memoro kun GetString aŭ malloc aŭ io simila 523 00:33:01,010 --> 00:33:04,900 kaj la mastruma sistemo diras, certa, mi havas 12 bajtoj de memoro ĝuste liberigita supren, 524 00:33:04,900 --> 00:33:08,080 uzi tiujn, kion vi tuj estos transdonita? 525 00:33:08,080 --> 00:33:10,830 Vi tuj estos transdonita eron de memoro, ke ni devus tipe desegni 526 00:33:10,830 --> 00:33:13,700 kun demando markoj, sed kion estas tiuj demando kadroj? 527 00:33:13,700 --> 00:33:17,000 Ili hazarde estas h-kaj-l-l-o, h-kaj-l-l-o. 528 00:33:17,000 --> 00:33:20,940 Tio estas nia nova rubo valoroj tiel frue kiel vi liberigi ke memoro. 529 00:33:20,940 --> 00:33:22,750 >> Jen reala mondo implikacio tie ankaŭ. 530 00:33:22,750 --> 00:33:24,720 Ĉi tio okazas al fari kun RAM, sed via komputiloj 531 00:33:24,720 --> 00:33:26,720 fakte faras la samon per disko. 532 00:33:26,720 --> 00:33:30,620 Ni parolos pri tio en aparta kun futura problemo aro kiu centras en forensics. 533 00:33:30,620 --> 00:33:36,170 Sed kio efektive okazas se vi havas iujn sentema financa dosiero sur via labortablo 534 00:33:36,170 --> 00:33:39,600 aŭ iu Sketchy JPEG kaj vi treni ĝin en vian rubon, 535 00:33:39,600 --> 00:33:44,390 kio okazas dum movado gxin en la rubo aŭ la recicla bin? 536 00:33:44,390 --> 00:33:47,240 Vi sciis, kion mi parolas. [Ridado] 537 00:33:47,240 --> 00:33:52,370 Kio okazas kiam vi trenis ke provoj en viajn recicla bin aŭ rubo povas? 538 00:33:52,370 --> 00:33:55,920 [Inaudible studento respondon] 539 00:33:55,920 --> 00:33:58,000 Nu, tiel zorgema. Kio okazas kiam vi faros tion? 540 00:33:58,000 --> 00:34:01,030 La mallonga respondo estas nenio, ĉu ne? 541 00:34:01,030 --> 00:34:04,790 Sketchy aŭ sentema dosiero estas ankoraŭ nur sidas tie ie en via malmola disko. 542 00:34:04,790 --> 00:34:07,940 La plejmulto el ni almenaŭ jam lernis la malmola vojo, kiun vi bezonas por malplenigi vian rubo 543 00:34:07,940 --> 00:34:10,429 aŭ via recicla bin al reale forviŝi dosierojn. 544 00:34:10,429 --> 00:34:13,440 Kaj efektive, kiam vi rajtas klaki aŭ Kontrolo klako en via rubo povas 545 00:34:13,440 --> 00:34:15,580 aŭ elektu File, Malplena Trash aŭ kion ajn 546 00:34:15,580 --> 00:34:21,420 kaj vi vere malplenigi la rubujon povas aŭ recicla bin, kio efektive okazas tiam al ĉi foto? 547 00:34:22,810 --> 00:34:25,969 Pli nenion. Do nenio vere okazas en disko. 548 00:34:25,969 --> 00:34:30,880 >> Kaj se ni nur portempe digress kaj skribi - I'll just use la dorso de ĉi. 549 00:34:30,880 --> 00:34:34,639 Do nun la historio ŝanĝiĝas de RAM, kio estas kie programoj ekzistas 550 00:34:34,639 --> 00:34:39,250 dum vi kuras ili, al disko, kiu estas kie estas stokita longtempe 551 00:34:39,250 --> 00:34:42,920 eĉ kiam la potenco eliras, nuntempe - kaj ni revenos al tio en la estonteco - 552 00:34:42,920 --> 00:34:46,380 ni nur ŝajnigi ke ĉi reprezentas la malmola disko interne de via komputilo 553 00:34:46,380 --> 00:34:50,110 ĉar tie en la tago ili kutimis esti cirkuli diskoj, multe kiel disketoj. 554 00:34:50,110 --> 00:34:55,130 Do se vi ja havas kelkajn sentema Excel-dosiero, ĝi povus preni tiun eron de memoro 555 00:34:55,130 --> 00:34:59,770 en via komputilo disko, kaj mi simple desegni sama arbitraj 1s kaj _0s_. 556 00:34:59,770 --> 00:35:03,970 Kiam vi treni la dosieron kiel tiu al via rubo povas aŭ reuzi bin, 557 00:35:03,970 --> 00:35:07,750 laŭvorte nenio okazas ĉar Apple kaj Microsoft ĵus decidis 558 00:35:07,750 --> 00:35:10,450 la rubo povas kaj recicla bin estas vere nur portempa lokokupilo. 559 00:35:10,450 --> 00:35:14,710 Eble eventuale la VIN estos malplenigi gxin por vi, sed tipe, ne faras nenion, 560 00:35:14,710 --> 00:35:17,090 almenaŭ ĝis vi estas vere malalte sur la spaco. 561 00:35:17,090 --> 00:35:20,870 >> Tamen, kiam vi iras al malplena rubo aŭ malplena recicla bin, 562 00:35:20,870 --> 00:35:23,460 simile, nenio okazas al tiu bildo. 563 00:35:23,460 --> 00:35:28,590 Ĉio, kion okazas estas aliloke en via komputilo, estas ia tablo. 564 00:35:28,590 --> 00:35:35,400 Estas iel kiel eta cheat folio kiu diras ke, diru, resume.doc, 565 00:35:35,400 --> 00:35:40,920 tiel viaj currículum en Microsoft Word dosieron kutimis vivi en situo 123 en via malmola disko, 566 00:35:40,920 --> 00:35:43,710 ne en memoro kaj ne en RAM sed sur via fiksita disko, 567 00:35:43,710 --> 00:35:49,050 kaj via Sketchy JPEG vivoj en 456, kaj via Excel dosieron vivas 789 aŭ kie ajn. 568 00:35:49,050 --> 00:35:53,640 Kiam vi forigi dosierojn per efektive malplenigante la rubo aŭ la recicla bin, 569 00:35:53,640 --> 00:35:59,530 tiu bildo ne ŝanĝas. La _0s_ kaj _1s_ sur via malmola disko ne iras nenie. 570 00:35:59,530 --> 00:36:03,930 Sed ĉi tablo, tiu malgranda datumbazo de varoj, faras ŝanĝon. 571 00:36:03,930 --> 00:36:08,750 Kiam vi forviŝi vian currículum, estas kvazaŭ la dosiero estas forviŝita iusence, 572 00:36:08,750 --> 00:36:12,790 sed ĉiuj la komputilo ne estas forgesi kie tiu afero vivas sur via fiksita disko. 573 00:36:12,790 --> 00:36:17,870 La _0s_ kaj _1s_ kiuj formas viajn currículum aŭ iu el ĉi tiuj aliaj dosieroj estas ankoraŭ nerompita. 574 00:36:17,870 --> 00:36:21,960 >> Do se vi faris tion akcidente, estas ankoraŭ ne-nula probablo 575 00:36:21,960 --> 00:36:25,800 ke vi povas reakiri viajn datumojn uzante Norton Utilities aŭ iu komerca programaro 576 00:36:25,800 --> 00:36:29,810 kies celo en la vivo estas trovi _0s_ kaj _1s_ kiuj ia estis orfo, 577 00:36:29,810 --> 00:36:33,300 forgesis tie sed lasis tie, tiel ke vi povas akiri datumoj dorso. 578 00:36:33,300 --> 00:36:38,410 Aŭ jura investigadores kun la polico aŭ FBI estus reale preni malmolan diskon 579 00:36:38,410 --> 00:36:42,550 kaj fakte serĉas ŝablonoj de _0s_ kaj 1s ne aspektas kiel JPEG-oj, ĝi aspektas kiel Excel-dosieroj, 580 00:36:42,550 --> 00:36:46,400 kaj forprenis ilin tiel, eĉ se la komputilo forgesis ilin tie. 581 00:36:46,400 --> 00:36:49,820 Do la sola maniero vere forigi datumojn, kiel ni diskutos en la estonteco, 582 00:36:49,820 --> 00:36:54,190 estas matoralo aŭ forviŝi la dosieron aŭ malmola disko de - 583 00:36:54,190 --> 00:36:56,540 Vi ne povas vere forigi la _0s_ kaj _1s_ 584 00:36:56,540 --> 00:36:59,440 ĉar alie vi volas komenci per gigabajto malmola disko 585 00:36:59,440 --> 00:37:02,380 kaj vi volas fini kun megabajto malmola disko se vi senĉese viŝante, 586 00:37:02,380 --> 00:37:04,380 laŭvorte, _0s_ kaj _1s_. 587 00:37:04,380 --> 00:37:06,310 Do kion vi farus se vi vere volis kovri vian temoj 588 00:37:06,310 --> 00:37:10,510 kaj la fundamenta problemo estas, ke ekzistas ankoraŭ _0s_ kaj _1s_ en la disko? 589 00:37:10,510 --> 00:37:14,930 Mi vidas iun gestante ke vi fizike rompi la artefakto. Kiu funkcios. 590 00:37:14,930 --> 00:37:19,600 [Ridado] Sed se tio estas speco de multekosta solvo, kio estus pli racia? 591 00:37:19,600 --> 00:37:23,270 Yeah. >> [Studento] Anstataŭigi ilin. >> Anstataŭigi ilin per kio? >> [Studento] Aliaj datumoj. 592 00:37:23,270 --> 00:37:29,070 Aliaj datumoj. Vi povas simple anstataŭigi vian disko kun _0s_ aŭ 1s aŭ ĉiuj _0s_, ĉiuj 1s. 593 00:37:29,070 --> 00:37:31,230 >> Kaj tio estas ja kion iuj de la programaro havas. 594 00:37:31,230 --> 00:37:33,570 Vi povas aĉeti programaro aŭ eĉ akiri liberan programaron, 595 00:37:33,570 --> 00:37:36,610 kaj eĉ konstruis por Mac OS tiuj tagoj, malpli tiel en Windows, 596 00:37:36,610 --> 00:37:38,660 estas la kapablo sekure viŝi. 597 00:37:38,660 --> 00:37:41,960 Fakte, se vi volas al la tuta sinsekvo hejmen hodiaŭ se vi havas Mac kaj fari tion, 598 00:37:41,960 --> 00:37:45,740 se vi havas iujn aĵojn en via rubo povas, vi povas fari Secure Malplena Trash, 599 00:37:45,740 --> 00:37:47,610 kiu faras ĝuste tion. 600 00:37:47,610 --> 00:37:53,350 Anstataŭ nur viŝi dosierojn tie, ĝi ne viŝi la _0s_ kaj _1s_ tie, 601 00:37:53,350 --> 00:38:01,240 iom, ĝi nur ŝanĝas ĉiujn, ekzemple, al _0s_ kaj pentras, pentras, punkto. 602 00:38:01,240 --> 00:38:05,330 Do unu el viaj estontaj psets fakte estos por intence reakiri datumoj - 603 00:38:05,330 --> 00:38:08,430 fotoj ke ni prenis de homoj, lokoj, kaj sur la kampuso 604 00:38:08,430 --> 00:38:12,810 por kiu ni faros jura bildo de cifereca fotilo memoro karto, 605 00:38:12,810 --> 00:38:17,120 kiu estas la ĝusta sama ideo - kaj vi devos esti defiis al reale trovi 606 00:38:17,120 --> 00:38:20,160 la mastroj kiuj reprezentas JPEG-oj en via malmola disko, 607 00:38:20,160 --> 00:38:23,610 multe kiel tiu iama studento kies retpoŝto mi legis kelkajn semajnojn faris 608 00:38:23,610 --> 00:38:25,860 rekuperi sia fratino fotoj. 609 00:38:25,860 --> 00:38:30,300 Kial ni ne prenos de 5-minuta paŭzo tie, kaj ni reagruparse kun pli en memoro. 610 00:38:33,030 --> 00:38:38,610 Do jen kie aĵoj iom menso-fleksio, sed tio estas tre potenca paŝo 611 00:38:38,610 --> 00:38:40,480 al kompreni tiun tutan pli. 612 00:38:40,480 --> 00:38:42,900 Jen estas programo nomata pointers.c. 613 00:38:42,900 --> 00:38:45,430 Ĝi estas inter la hodiaŭa specimeno kodo. 614 00:38:45,430 --> 00:38:51,280 Rimarku ke en la unuaj kelkaj linioj, 19 tra 22, ĉiuj ni faras estas io kiel GetString 615 00:38:51,280 --> 00:38:54,460 kaj revenante adreson, stokante ĝin en s. 616 00:38:54,460 --> 00:38:58,380 Nun por pset eĉ 3 se vi volas sed pset 4 kaj sur 617 00:38:58,380 --> 00:39:01,030 kie vi povas komenci preni tiujn trejnado radoj sur vin, 618 00:39:01,030 --> 00:39:04,030 ne estas kialo por ŝajnigi ke kordoj plu ekzistas. 619 00:39:04,030 --> 00:39:07,030 Estas certe bone al komencu diri char *. 620 00:39:07,030 --> 00:39:12,610 >> Kiel flanken, en linio referencoj kaj en libroj vi ofte vidas la stelon apud la variablo. 621 00:39:12,610 --> 00:39:15,600 Vi povus ecx vidi spacoj ĉirkaŭ ambaŭ flankoj. 622 00:39:15,600 --> 00:39:17,680 Ĉiuj el tiuj estas funkcie ĝusta. 623 00:39:17,680 --> 00:39:21,180 Nuntempe, tamen, ni normigi sur ĉi alproksimiĝo por fari super klara 624 00:39:21,180 --> 00:39:24,000 ke char * estas kiel diri karaktero puntero. 625 00:39:24,000 --> 00:39:25,680 Tio estas la datumtipo. 626 00:39:25,680 --> 00:39:28,730 Kaj tiam la nomo de la variablo estas s en tiu kazo. 627 00:39:28,730 --> 00:39:31,180 Do ni alvenas ĉenon kaj ni nomas ĝin s. 628 00:39:31,180 --> 00:39:35,180 Kaj poste malsupren tie rimarkos ke mi faras vere iom da trompo. 629 00:39:35,180 --> 00:39:39,080 Ĉi tio estas nomita puntero aritmetiko, kiu estas speco de super simpla. 630 00:39:39,080 --> 00:39:41,790 Ĝi simple signifas adicii kaj subtrahi nombroj al punteros. 631 00:39:41,790 --> 00:39:43,660 Sed ĉi efektive funkcias. 632 00:39:43,660 --> 00:39:49,170 Ĉi tiu programo ŝajne presas la kordo s 1 karaktero por linio tia ke la fina rezulto - 633 00:39:49,170 --> 00:39:54,920 Ĝuste tiel ni povas militakiro kie ĉi tiu tuj, fari punteros, kuri punteros, lasu min zoom in 634 00:39:54,920 --> 00:39:58,940 Nun mi tipo en iu kiel SALUTON kaj tipon Entajpu 635 00:39:58,940 --> 00:40:01,080 kaj presas 1 karaktero por linio. 636 00:40:01,080 --> 00:40:04,730 Ĝis la dua monato, ni estus farinta tion kun kvadrata krampo skribmaniero. 637 00:40:04,730 --> 00:40:09,760 Ni havus por buklo kaj ni farus printf de s [i] kaj ni volas fari tion denove kaj denove kaj denove 638 00:40:09,760 --> 00:40:11,950 kun backslash n je la fino de ĉiu linio. 639 00:40:11,950 --> 00:40:16,800 Sed tiu programo estas malsama. Ĉi tiu programo estas uzanta, laŭvorte, aritmetiko. 640 00:40:16,800 --> 00:40:18,860 Do kio okazas ĉi tie? 641 00:40:18,860 --> 00:40:24,720 Unue, antaŭ ĉi buklo eĉ ekzekutas, kion, nur por esti klara, estas s reale? 642 00:40:24,720 --> 00:40:27,270 S estas? >> [Studento] An adreso. >> An adreso. 643 00:40:27,270 --> 00:40:32,980 >> Kaj estas la adreso de, en la kazo de saluton, la unua gravulo en tiu vorto, kiu estas h. 644 00:40:32,980 --> 00:40:37,370 Do s estas, en ĉi tiu aparta ekzemplo, la adreso de h. 645 00:40:37,370 --> 00:40:41,850 Do kion tio signifas por fari s + i? 646 00:40:41,850 --> 00:40:46,280 Nu, mi komencas al 0 en ĉi por buklo. Ni faris tion multfoje. 647 00:40:46,280 --> 00:40:49,760 Mi tuj iros al la longo de la kordo, ŝajne. 648 00:40:49,760 --> 00:40:53,950 Do en la unua ripeto de ĉi ciklo, mi estas evidente 0. 649 00:40:53,950 --> 00:41:01,740 Do tiu esprimo dirante s + i - pli ĝuste, s +0--tio estas evidente nur s. 650 00:41:01,740 --> 00:41:04,320 Do kio estas * s here? 651 00:41:04,320 --> 00:41:08,530 Nun ni uzas la stelon en iomete malsama maniero. 652 00:41:08,530 --> 00:41:13,080 Lasu min kaj liveri de t ĉar ni faris parolas t kaj kopioj de s. 653 00:41:13,080 --> 00:41:15,540 Nun ni volas nur rakonti historio engaĝante s. 654 00:41:15,540 --> 00:41:20,090 Kaj tial en ĉi tiu momento, post havi tipon kordoj, nia mondo aspektas sufiĉe ŝatas ĝin faris antaŭ 655 00:41:20,090 --> 00:41:26,630 kun nur s stoki la adreson de h kaj pli ĝenerale montrante la kordo saluton. 656 00:41:26,630 --> 00:41:33,170 Se mi nun faras linion kiel * (s + i), ni provos tiun eksteren. 657 00:41:33,170 --> 00:41:40,140 Do * (j + mi). Lasu min simpligi ĉi tion ĉar ĉi estas 0, do ĉi tiu estas * (j +0). 658 00:41:40,140 --> 00:41:43,790 Nu, atendu momenton. Simpligi plu. Tio estas * (j). 659 00:41:43,790 --> 00:41:47,020 Nu, nun la krampoj estas speco de stulta, do nun ni nur faru * s. 660 00:41:47,020 --> 00:41:50,540 Do en la unua ripeto de ĉi ciklo, tiun linion ke tio reliefigis, 26, 661 00:41:50,540 --> 00:41:53,650 estas preskaux ekvivalenta al presi ĉi. 662 00:41:53,650 --> 00:41:56,040 Kio estas la datumtipo de * s? 663 00:41:56,040 --> 00:42:00,770 En ĉi tiu kunteksto, ĉar la stelo pasas esti apud la s sin, 664 00:42:00,770 --> 00:42:04,930 sed pli specife, ĉar ni ne plu deklarante s, 665 00:42:04,930 --> 00:42:09,730 ni ne kreante variablo plu, ne estas mencio de char * en linio 26, 666 00:42:09,730 --> 00:42:14,280 ne estas mencio de la ŝlosilvorto kordoj, ni simple uzas variablon nomita s, 667 00:42:14,280 --> 00:42:19,650 ĝi rezultas nun la stelo havas iomete malsama kaj, Certe, konfuzante signifon. 668 00:42:19,650 --> 00:42:26,590 * S tie signifas iri al la adreso en s kaj presita ajn estas tie. 669 00:42:26,590 --> 00:42:33,750 Do s estas tie, * s - ia kiel Chutes kaj Ladders, sekvu la sagon - ĉi tie. 670 00:42:33,750 --> 00:42:35,850 Do tiu estas * s. 671 00:42:35,850 --> 00:42:39,060 >> Do kio gets presita sur la unua ripeto de tiu ciklo en linio 26? 672 00:42:39,060 --> 00:42:42,170 Mi presi% c, kiu estas la lokokupilo di karaktero, 673 00:42:42,170 --> 00:42:48,520 tiam al \ n por nova linio. * (S + mi) kie mi estas 0 estas ĝuste ĉi tiu. 674 00:42:48,520 --> 00:42:53,670 Do kio char mi meti en por% c? H. 675 00:42:53,670 --> 00:42:56,900 En la sekvanta ripeto de la ciklo - povas probable vidos kie ĉi tiu tuj - 676 00:42:56,900 --> 00:43:01,350 la venonta ripeto i estas evidente 1, do tio signifas j +1, 677 00:43:01,350 --> 00:43:05,580 kaj poste nun mi bezonas la krampoj ĉar nun la stelo bezonas diri 678 00:43:05,580 --> 00:43:08,620 iri al la memoro adreso j +1. 679 00:43:08,620 --> 00:43:14,170 Kio estas s? Ni ruliĝi malantaŭen en la tempo, kaj diru ĉi sago nun ne vere faras ni neniu favoroj. 680 00:43:14,170 --> 00:43:18,450 Lasu estas pli specife diras ke ĉi tiu estas stoki la nombro 123 681 00:43:18,450 --> 00:43:25,110 ĉar la komenco de ĉi tiu linio saluton, jen adreso 123, ĉi tiu estas 124, kaj tiel plu. 682 00:43:25,110 --> 00:43:30,550 Do je la dua iteracio kiam mi diris s +1, jen kiel diri 123 +1, 683 00:43:30,550 --> 00:43:35,340 alie sciata kiel 124, do kio char gets presita sur la dua iteracio? 684 00:43:35,340 --> 00:43:37,850 E en memoro adreso 124. 685 00:43:37,850 --> 00:43:44,440 Tiam + denove, 125, 126, 127, kaj ĉi buklo dankeme por antaŭ ni preni tie 686 00:43:44,440 --> 00:43:49,040 ĉar Mi uzas strlen certigi ke i ne rakontas tro alta. 687 00:43:49,040 --> 00:43:50,810 Por ke tro estas. 688 00:43:50,810 --> 00:43:55,000 Denove, tio estas nur kvazaŭ ni faris antaŭ unu semajno. 689 00:43:55,000 --> 00:43:59,200 Lasu min skribi ĝin sur la linio sub kvankam ni ne volas fari ambaŭ. 690 00:43:59,200 --> 00:44:02,500 Ĉi tiu estas identaj estas tiu. 691 00:44:02,500 --> 00:44:08,310 >> Do eĉ se s estas ĉeno, kiel ni estis nomante ĝin dum semajnoj, s estas vere char *. 692 00:44:08,310 --> 00:44:13,270 Do, se ni volas esti super anal, estas vere taŭga por skribi la specifa karaktero 693 00:44:13,270 --> 00:44:17,490 ĉe la th,-a loko uzante tiujn nombraj adresoj kaj ĉi tiu stelo operatoro, 694 00:44:17,490 --> 00:44:20,470 sed sincere, ĉi tiu estas nur tiom da pura. Do tiu estas ne malbona. 695 00:44:20,470 --> 00:44:26,720 Neniu kialo por ĉesi fari linion 27 ĉi tie, sed 26 estas funkcie la samaj, 696 00:44:26,720 --> 00:44:31,570 kaj estas funkcie la samaj por ĝuste la kialoj kiujn ni estis diskuti tiel for. 697 00:44:31,570 --> 00:44:33,650 Kaj laste, 29 estas nur bona praktiko. 698 00:44:33,650 --> 00:44:38,420 Nomante libera de s signifas ke nun vi redonante la memoro kiun GetString donis al vi 699 00:44:38,420 --> 00:44:41,630 ĉar denove, kiel mi menciis lundo, GetString dum semajnoj 700 00:44:41,630 --> 00:44:44,180 estis enkonduki cimon en vian kodon. 701 00:44:44,180 --> 00:44:46,490 Via kodo por semajnoj havis memoron fugoj 702 00:44:46,490 --> 00:44:49,970 per vi estis petante GetString por memoro sed vi neniam estis donante ĝin. 703 00:44:49,970 --> 00:44:53,410 Kaj kiu estis intence elektitaj de ni pedagogie 704 00:44:53,410 --> 00:44:55,880 ĉar ĝi estas simple tro multe pensi pri frue. 705 00:44:55,880 --> 00:44:57,710 Sed nun ni bezonas pli simetria. 706 00:44:57,710 --> 00:45:00,830 Se vi demandas la komputilo por memoro, kiel estas la kazo por GetString, 707 00:45:00,830 --> 00:45:02,820 kiel estas la kazo ŝajne por malloc, 708 00:45:02,820 --> 00:45:07,970 vi devas nun por pset 4 antaŭen ankaŭ libera tian memoron. 709 00:45:07,970 --> 00:45:11,650 Rimarku ĉi estas malsama dirante int n. 710 00:45:11,650 --> 00:45:15,040 Vi ne bezonas por liberigi tiun ĉar vi ne nomis GetString 711 00:45:15,040 --> 00:45:16,890 kaj vi ne nomis malloc. 712 00:45:16,890 --> 00:45:20,610 >> Kaj eĉ se vi nomas GetInt kiel ni eventuale vidi, 713 00:45:20,610 --> 00:45:25,520 GetInt ne rezervi memoron por vi, ĉar vi povas reale pasi ĉirkaŭ entjeroj 714 00:45:25,520 --> 00:45:29,430 kaj floto kaj signoj nur la vojo ni estis farante dum semajnoj. 715 00:45:29,430 --> 00:45:33,960 Kordoj, tamen, estas speciala ĉar vere ili estas la kunmeto de multnombraj signoj. 716 00:45:33,960 --> 00:45:37,450 Do ili estas ĝuste malsama signoj kaj floto kaj ints kaj similaj. 717 00:45:37,450 --> 00:45:39,980 Sed ni revenos al tiu post nelonge. 718 00:45:39,980 --> 00:45:44,920 Demandojn tiam ĉi komenco de punteros? Yeah. 719 00:45:44,920 --> 00:45:49,690 [Inaudible studento demando] 720 00:45:49,690 --> 00:45:51,440 Ah, tre bona demando. 721 00:45:51,440 --> 00:45:55,790 Unu el la malmultaj aĵoj C efektive faras por vi, kio estas konvena, 722 00:45:55,790 --> 00:46:00,110 ĉu ciferojn por vi kion la grandeco estas la datumtipo 723 00:46:00,110 --> 00:46:03,060 kaj tiam faras tian multipliko por vi. 724 00:46:03,060 --> 00:46:06,610 Tiu estas pala en la kazo de signoj ĉar preskaŭ ĉiam char estas 1 bajto, 725 00:46:06,610 --> 00:46:08,150 tial ĉi nur funkcias. 726 00:46:08,150 --> 00:46:11,220 Sed pro diskuto, se vi vere presi entjeroj 727 00:46:11,220 --> 00:46:15,500 kaj vi volis presi iun valoron s kiu montrante entjero, 728 00:46:15,500 --> 00:46:20,720 vi simile ne bezonas fari + 4 * i nur ĉar int estas 4 bitokoj. 729 00:46:20,720 --> 00:46:25,780 Pointer aritmetiko signifas ke C kaj la tradukilo faros cxion, kion math por vi. 730 00:46:25,780 --> 00:46:29,190 Vi nur zorgas pri estas la kalkula en varo de la homa sento. Yeah. 731 00:46:29,190 --> 00:46:35,200 [Studento] Se vi deklaras ĉenon ene por ciklo, vi devas liberigi ĝin poste? 732 00:46:35,200 --> 00:46:36,760 Bona demando. 733 00:46:36,760 --> 00:46:41,390 >> Se vi deklaras ĉenon ene de la por buklo, ĉu vi bezonas por liberigi ĝin poste? 734 00:46:41,390 --> 00:46:47,520 Vi nur devas libera memoro, ke vi rezervu kun GetString aŭ kun malloc. 735 00:46:47,520 --> 00:46:53,110 Do, se vi simple diru ion kiel - mi metis frizita krampoj nun tiel la tuta kodo estas rilatigitaj. 736 00:46:53,110 --> 00:46:58,580 Se vi faris iun, kvankam buggily, kiel ĉi tiu, char * t = s, 737 00:46:58,580 --> 00:47:03,450 vi ne bezonas liberan t ĉar t ne implikis ajna mencio de malloc aŭ GetString. 738 00:47:03,450 --> 00:47:08,960 Se kontraste vi faris tion, GetString, tiam jes, vi bezonus libera t. 739 00:47:08,960 --> 00:47:14,350 Kaj fakte, via nura ŝanco fari tion nun estas ene ĉi tiu ciklo, por la sama temo de medio 740 00:47:14,350 --> 00:47:16,060 ke ni diskutis en la estinteco. 741 00:47:16,060 --> 00:47:18,830 Alie vi volas esti atribuo memoro, atribuante memoro, atribuante memoro, 742 00:47:18,830 --> 00:47:21,230 kaj je la fino de la programo, ĉar vi estas ekstere de tiu ciklo, 743 00:47:21,230 --> 00:47:24,240 t ne ekzistas, sed vi neniam rakontis al la mastruma sistemo 744 00:47:24,240 --> 00:47:26,750 ke vi ne bezonas, ke memoro plu. 745 00:47:26,750 --> 00:47:30,430 Kaj antaŭ longe, ĉar pset 4 aŭ 5 ni ekipi vin per programo nomata Valgrind, 746 00:47:30,430 --> 00:47:34,160 kiu estas simila en spirito GDB en tiu ĝi estas atingis iom de arcano interfaco, 747 00:47:34,160 --> 00:47:35,750 sed lia celo en la vivo estas por helpi vin. 748 00:47:35,750 --> 00:47:39,380 Kaj Valgrind estas programo kiu estos en la estonteco serĉi vian programoj 749 00:47:39,380 --> 00:47:42,550 serĉas memoro fugoj, ĉu el GetString aŭ malloc, 750 00:47:42,550 --> 00:47:47,800 kiuj ni ekuzi des pli kiam ni ĉesi uzi la CS50 biblioteko tiel. 751 00:47:47,800 --> 00:47:53,030 Ni fine nun havas varon de la vortaro kaj la speco de mensa modelo en teorio 752 00:47:53,030 --> 00:47:55,170 kun kiu solvi ĉi rompita programo. 753 00:47:55,170 --> 00:47:59,410 >> Do en ĉi rompita programo, interŝanĝa funkcias ene de interŝanĝa, 754 00:47:59,410 --> 00:48:05,280 sed neniam reale laboris en ĉefaj ĉar ĉefa pasis en x kaj y, revokon, 755 00:48:05,280 --> 00:48:07,260 kaj tiuj estis pasis tra valoroj, por tiel diri. 756 00:48:07,260 --> 00:48:09,330 Kopioj de ili estis donita por interŝanĝi. 757 00:48:09,330 --> 00:48:12,520 Por la fino de interŝanĝa, a kaj b estis ja estinta interŝanĝitaj, 758 00:48:12,520 --> 00:48:16,120 sed kompreneble x kaj y, kiel ni diskutis lunde, ne estis. 759 00:48:16,120 --> 00:48:19,940 Do mi proponas en verdo tie ke ĉi tio estas vere la solvo ĉi tie. 760 00:48:19,940 --> 00:48:22,640 Kaj fakte, lasu min movi mian steloj nur por esti konsekvenca 761 00:48:22,640 --> 00:48:24,440 kvankam, denove, funkcie ĉi tio ne gravas. 762 00:48:24,440 --> 00:48:28,730 En la estonteco semajnoj ni klarigi kiam kaj kial tio gravas. 763 00:48:28,730 --> 00:48:30,600 Do en verdo nun estas solvaĵo. 764 00:48:30,600 --> 00:48:33,700 Sincere, ĝi aspektas tuta multe Messier ĉar mi havas ĉiujn tiujn stelojn. 765 00:48:33,700 --> 00:48:35,380 Lasu min montri unu afero. 766 00:48:35,380 --> 00:48:40,040 La supro linio tie kie diras int * a kaj int * b 767 00:48:40,040 --> 00:48:42,820 estas fundamente fari la samon kiel ĝi ĉiam havas. 768 00:48:42,820 --> 00:48:47,070 Estas deklarante 2 argumentojn aŭ parametroj por interŝanĝi, 769 00:48:47,070 --> 00:48:49,940 la unua el kiuj estas int puntero nomata, 770 00:48:49,940 --> 00:48:53,100 la dua el kiuj estas int puntero nomis b. 771 00:48:53,100 --> 00:48:55,770 La sola afero, kiu estas nova en ĉi tiu punkto estas la fakto ke estas stelo tie. 772 00:48:55,770 --> 00:48:59,340 >> Kion tio signifas? A ne estas int, b estas ne int. 773 00:48:59,340 --> 00:49:04,100 A estas la adreso de int kaj b estas la adreso de malsama int. 774 00:49:04,100 --> 00:49:06,980 Cxi tie, ĉi tiu estas kie mi agnoskas C ricevas konfuza. 775 00:49:06,980 --> 00:49:09,790 Nun ni uzas stelon, sed ĝi havas malsaman signifon en tiu kunteksto. 776 00:49:09,790 --> 00:49:13,150 Ĉar ni ne deklari punteros kiel ni estas ĉi tie, 777 00:49:13,150 --> 00:49:15,500 jen ni estas dereferencing aĵoj. 778 00:49:15,500 --> 00:49:21,520 Do teknike, la stelo en tiu kunteksto de la unua, dua, kaj tria linio ene de interŝanĝa 779 00:49:21,520 --> 00:49:24,560 estas la dereference operatoro, kiu ĵus signifas iri tien. 780 00:49:24,560 --> 00:49:27,400 Do same kiel mia fingro sekvis la sago al h, 781 00:49:27,400 --> 00:49:31,100 * Rimedon iri al tiu adreso kaj trovu mi la int jen tie. 782 00:49:31,100 --> 00:49:34,250 * B signifas iri al la adreso kaj pasi min kio estas tie. 783 00:49:34,250 --> 00:49:40,730 Do ni redibujar la bildo de lundo nun uzante pilo de kadroj, 784 00:49:40,730 --> 00:49:43,130 la fundo de kiuj tuj estos ĉefaj, 785 00:49:43,130 --> 00:49:47,600 la supra unu el kiuj tuj estos interŝanĝa, 786 00:49:47,600 --> 00:49:50,880 por ke nia mondo aspektas, kiel lundo, kiel ĉi tiu. 787 00:49:50,880 --> 00:49:53,620 Jen eron de memoro kiu ĉefa tuj uzi. 788 00:49:53,620 --> 00:49:56,520 >> Memori de lundo, ke la programo nur havis 2 variabloj, 789 00:49:56,520 --> 00:50:01,930 unu nomita x kaj unu nomita y, kaj Mi metis la numeroj 1 kaj 2 tie. 790 00:50:01,930 --> 00:50:06,580 Nun, kiam mi vokas interŝanĝi kiel mi faris lunde, 791 00:50:06,580 --> 00:50:11,000 antaŭe, kiam mi uzis la ruĝa versio de tiu programo, kiu aspektas kiel ĉi tiu, 792 00:50:11,000 --> 00:50:17,470 Mi akiris 2 parametrojn, a kaj b, kaj kion ni skribas ĉi tie kaj ĉi tie? 793 00:50:17,470 --> 00:50:21,160 Nur 1 kaj 2, laŭvorte kopias de x kaj y. 794 00:50:21,160 --> 00:50:23,070 Hodiaŭ ni ŝanĝu tion. 795 00:50:23,070 --> 00:50:28,510 Hodiaŭ anstataŭ pasante en ints a kaj b nin tuj pasos en 2 adresoj. 796 00:50:28,510 --> 00:50:34,290 Tiuj adresoj okazi al punkto al ints, sed tiuj adresoj ne ints sin. 797 00:50:34,290 --> 00:50:37,330 Ili estas adresoj. Estas kiel poŝtan adreson anstataŭe. 798 00:50:37,330 --> 00:50:40,580 Do nun ni bezonas nur doni al mi iom pli detale en la ekrano. 799 00:50:40,580 --> 00:50:43,250 Ĉi tio estas mia komputilo memoro kiel jam pasis tuta tago. 800 00:50:43,250 --> 00:50:45,120 Nun ni bezonas iujn arbitraj kalkulado skemon. 801 00:50:45,120 --> 00:50:50,580 Do ni nur diros, nur por hazardo, ke ĉi tio estas memoro adreso 123, 124. 802 00:50:50,580 --> 00:50:55,660 Ni nur diras estas 125, tiu estas 126, kaj tiel plu, sed tio estas tute arbitra. 803 00:50:55,660 --> 00:50:58,590 Ni nur bezonas iom numerante skemon en mia memoro. 804 00:50:58,590 --> 00:51:04,030 Do nun, kiam mi efektive pasas en x kaj y, mi ne tuj pasos en x kaj y; 805 00:51:04,030 --> 00:51:08,400 Mi tuj pasos en la poŝta adreso, por tiel diri, de x kaj de y 806 00:51:08,400 --> 00:51:11,870 por ke kion gets stokita tie kaj ĉi tie ne estas 1 kaj 2, 807 00:51:11,870 --> 00:51:16,030 sed se vi povas vidi mian malgrandan tekston, kion gets pasis en ĉi tie kaj ĉi tie? 808 00:51:16,030 --> 00:51:23,340 [Inaudible studento respondon] >> Ekzakte. 123 gets metis tien kaj 124 gets metis tie. 809 00:51:23,340 --> 00:51:28,910 >> Nun, ĉar mi uzis la stelo en la nuna unua linio supren tie al supro, 810 00:51:28,910 --> 00:51:34,340 mia programo nur scias ke 123 kaj 124, kvankam ili estas evidente entjeroj 811 00:51:34,340 --> 00:51:40,160 ke iu homo povis rimarki, ili devus esti interpretita kiel adresojn, nombraj adresoj. 812 00:51:40,160 --> 00:51:43,250 Ili ne estas en kaj pri si ints, ili estas adresojn, 813 00:51:43,250 --> 00:51:46,120 kaj tio estas ĉar mi eksplicite metis la steloj tie. 814 00:51:46,120 --> 00:51:51,360 Do nun en mia unua, dua, kaj tria linio de reala kodo kio okazas ĉi tie? 815 00:51:51,360 --> 00:51:53,380 Ni desegni la resto de la pentraĵo. 816 00:51:53,380 --> 00:51:56,980 Tmp estas kiel ĝi estis lundo. Nenio speciala pri tmp. 817 00:51:56,980 --> 00:52:03,060 Ĝi estas nur loka 32 bitoj variablo, kaj ene de kiu mi estas ŝajne stoki la valoro de * a. 818 00:52:03,060 --> 00:52:08,580 Nun, se mi nur diris tmp = al, kion mi metis ĉi tien? >> [Studento] 123. 819 00:52:08,580 --> 00:52:10,370 123. Sed tio ne estas kion mi faras. 820 00:52:10,370 --> 00:52:13,670 Mi dirante tmp = * al. Stelo per iri tien. 821 00:52:13,670 --> 00:52:19,370 Do jen, 123. Kiel mi iras tien? Ŝajnigi kiel ekzistas sago. 822 00:52:19,370 --> 00:52:24,460 Nu, tie estas, 1. Do kio gets stokitaj en tmp, ŝajne? Nur 1. 823 00:52:24,460 --> 00:52:29,620 Do alivorte, tmp estas * a, * rimedon iri al la adreso kiu estas aktuale en, 824 00:52:29,620 --> 00:52:31,320 kiu estas ŝajne 123. 825 00:52:31,320 --> 00:52:33,910 >> Konsentite, jen ni estas en loko 123, mi vidas la numero 1, 826 00:52:33,910 --> 00:52:35,670 do mi tuj metis la numero 1 tie. 827 00:52:35,670 --> 00:52:39,020 Nun kion mi faras en linio 2, * al = * b? 828 00:52:39,020 --> 00:52:44,570 Ĉi tiu estas iom pli implikitaj ĉar nun kio estas? Estas 123. 829 00:52:44,570 --> 00:52:50,220 Do * a estas kie? Ĝuste kie mi estis antaŭe. Do iru tien. Okay. 830 00:52:50,220 --> 00:52:53,420 Nun, laste, kaj tiam fine ĉi komencos sencon, mi esperas, 831 00:52:53,420 --> 00:53:00,280 * B signifas kio estas en b? 124. Do mi bezonas iri tien, kiu estas 2. 832 00:53:00,280 --> 00:53:03,430 Do kion mi metis kie? 833 00:53:03,430 --> 00:53:10,100 2 eniras en ĉi tie, ĉar * b iras en * a. Do mi devos fari tion. 834 00:53:10,100 --> 00:53:13,120 Kaj vi povas jam vidi, eble, ke ni estas tiom proksima 835 00:53:13,120 --> 00:53:17,710 al solvi ĉi tiu stulta, simpla problemo ĝuste por la unua fojo 836 00:53:17,710 --> 00:53:20,920 ĉar nun ni ankoraŭ havas rememoro pri tio, kion x estis, 837 00:53:20,920 --> 00:53:23,230 ni havas 2 kopioj, Certe, de y, 838 00:53:23,230 --> 00:53:25,850 sed la linio 3 nun diras * b. 839 00:53:25,850 --> 00:53:31,080 Do jen b. * B signifas iri tien. Do kie estas loko 124? 840 00:53:31,080 --> 00:53:35,560 Estas ŝajne tie. Do kion mi metis ĉi tien? Evidente, tmp. 841 00:53:35,560 --> 00:53:39,600 Do nun mi tion faras. Do mi havas 1 tie kaj 2 ĉi tie. 842 00:53:39,600 --> 00:53:43,560 Kaj nun kio pri ĉio ĉi, la 123, la 124, kaj la 1? 843 00:53:43,560 --> 00:53:47,910 Apenaŭ interŝanĝa revenas, ĉi tiu memoro estas tiel bona kiel perdita 844 00:53:47,910 --> 00:53:51,070 ĉar tiel frue kiel interŝanĝa revenas, la mastruma sistemo 845 00:53:51,070 --> 00:53:54,190 estas libera por uzi tiu memoro denove en la estonteco. 846 00:53:54,190 --> 00:53:58,870 Nur ĉefa memoro ĉe la malsupro de tiu tn pilo batas ĉirkaŭe. 847 00:53:58,870 --> 00:54:01,470 >> Kaj tial ni fine havas nun funkciantan version. 848 00:54:01,470 --> 00:54:06,310 Lasu min iri en swap.c, kaj rimarkis la sekvan. 849 00:54:06,310 --> 00:54:11,280 Sur la supro de la programo mi ŝanĝis mian prototipo esti int * a kaj int * b. 850 00:54:11,280 --> 00:54:15,000 Do la sola afero mi ŝanĝis al iri de ruĝa, kio estis malbona, al verdo, kiu estas bona, 851 00:54:15,000 --> 00:54:17,350 estas mi aldonis tiujn stelojn hodiaŭ. 852 00:54:17,350 --> 00:54:21,520 Sed tiam cxi tie en interŝanĝi mem mi devis kopii, alglui kio estis ĝuste sur la glito. 853 00:54:21,520 --> 00:54:24,140 Mi havas stelon tie, stelo tie - tio egalas la prototipo - 854 00:54:24,140 --> 00:54:27,930 kaj tiam ĉiuj tiuj aferoj nun havas stelojn krom tmp 855 00:54:27,930 --> 00:54:30,680 ĉar la uzo de provizora variablo, ekzistas nenio nova tie. 856 00:54:30,680 --> 00:54:33,040 Mi nur bezonas temporal stokado por int. 857 00:54:33,040 --> 00:54:34,820 Do ni ne bezonas stelon tie. 858 00:54:34,820 --> 00:54:39,310 Ni nur bezonas la stelo por ke ni povas transiri tiun specon de arbitra limo 859 00:54:39,310 --> 00:54:42,900 inter tiuj 2 kadroj en mia komputilo memoro. 860 00:54:42,900 --> 00:54:45,630 Sed unu lasta afero devas ŝanĝi, kaj vi povus esti duonvidis ĝin jam. 861 00:54:45,630 --> 00:54:48,810 Kio alia linio estas evidente malsama nun? >> [Studento] & x. 862 00:54:48,810 --> 00:54:53,270 >> Yeah, do 25 estas la lasta linio de kodo mi bezonas ŝanĝi por ĉi labori. 863 00:54:53,270 --> 00:54:58,360 Semajno antaŭe kaj eĉ lundon linio 25 aspektis kiel ĉi tiu, interŝanĝi x kaj y, 864 00:54:58,360 --> 00:55:02,020 kaj ĉi tiu estis nur rompita ĉar se vi diras swap (x, y) 865 00:55:02,020 --> 00:55:05,660 vi donas kopiojn de x kaj y por interŝanĝi, tiam ĝi estas farante lia afero, 866 00:55:05,660 --> 00:55:09,080 sed vi neniam vere ŝanĝas x kaj y sin. 867 00:55:09,080 --> 00:55:12,880 Do eĉ se vi neniam vidis tiun karakteron antaŭe kun la signo en kodo, 868 00:55:12,880 --> 00:55:15,860 nur preni diveni. Kion faras la signon fari, ŝajne? 869 00:55:15,860 --> 00:55:17,890 [Studento] Takes la adreso. >> Takes la adreso. 870 00:55:17,890 --> 00:55:21,160 Do la signo dirante al mi la adreson de x. 871 00:55:21,160 --> 00:55:25,590 Kiu scias kie estas? Ĝi okazas esti 123. Mi ne zorgas. Nur donu al mi la adreson de x. 872 00:55:25,590 --> 00:55:28,340 & Y signifas doni al mi la adreson de y. 873 00:55:28,340 --> 00:55:34,450 Kaj je tiu punkto la historio estas perfekte kohera kun la bildo ni tiris antaŭ momento. 874 00:55:34,450 --> 00:55:38,310 >> Do mi devos konfesi punteros, certe por mi, kiam mi unue eklernis tion, 875 00:55:38,310 --> 00:55:40,570 estis definitive unu el la plej malfacilaj aferoj por kovri mian menson ĉirkaŭe. 876 00:55:40,570 --> 00:55:43,760 Sed realigi, speciale kiel ni observu ludante kun tiuj specoj de aferoj, 877 00:55:43,760 --> 00:55:48,030 se vi rompas gxin al tiuj super simpla speco de intelekte seninteresa problemoj 878 00:55:48,030 --> 00:55:52,270 de nur movanta nombroj ĉirkaŭe, la respondo al multan konfuzon kun indikoj 879 00:55:52,270 --> 00:55:56,590 vere povas esti derivita de tiuj tre baza mekaniko. 880 00:55:56,590 --> 00:55:59,070 Jen adreso. Iri tien kun la stelo. 881 00:55:59,070 --> 00:56:03,830 Aŭ male, jen kaj-simbolo. Elkompreni kiel la adreso fakte estas. 882 00:56:03,830 --> 00:56:06,270 Bone. 883 00:56:06,270 --> 00:56:09,000 Do kie estas ĉio ĉi memoro devenante? 884 00:56:09,000 --> 00:56:12,360 Ni nomis tiun foton kelkajn fojojn, kaj mi gardas promesplena ni revenos al ĝi, 885 00:56:12,360 --> 00:56:14,920 sed jen estas la reprezento de via komputilo la memoro 886 00:56:14,920 --> 00:56:17,420 ke estas iom pli markitaj ol nia chalkboard tie estas. 887 00:56:17,420 --> 00:56:21,590 La teksto segmento je supro reprezentas kio rilate al via programo? 888 00:56:21,590 --> 00:56:26,090 [Inaudible studento respondon] >> Pardonu? Diru denove. 889 00:56:26,090 --> 00:56:28,660 [Studento] La reala programo. >> La efektiva programo. 890 00:56:28,660 --> 00:56:32,430 >> Do la _0s_ kaj _1s_ ke vi kompilis post skribi C-kodo kaj poste kurante Clang 891 00:56:32,430 --> 00:56:35,910 kaj generante _0s_ kaj _1s_ finas getting tucked tie en memoro 892 00:56:35,910 --> 00:56:38,570 ĉar kiam vi duoble musklaku ikono en via Mac aŭ PC 893 00:56:38,570 --> 00:56:43,010 aŭ kuri komandon kiel mario ĉe via prompto, via _0s_ kaj _1s_ de disko 894 00:56:43,010 --> 00:56:45,700 get ŝarĝas en memoro por ke la komputilo povas manipuli ilin 895 00:56:45,700 --> 00:56:47,540 kaj ekzekuti ilin pli rapide. 896 00:56:47,540 --> 00:56:50,880 Do inicializado datumoj kaj uninitialized datumoj, ni ne multe parolos pri tiuj, 897 00:56:50,880 --> 00:56:52,420 sed tiuj estas nur tutmonda variabloj. 898 00:56:52,420 --> 00:56:54,710 Inicializado signifas tutmonda variabloj kiujn vi donis valorojn al; 899 00:56:54,710 --> 00:56:59,300 uninitialized signifas tutmonda variabloj kiujn vi ankoraux ne donas valorojn al. 900 00:56:59,300 --> 00:57:01,900 Tiam ekzistas tiuj mediovariabloj kiuj mi tute skuos mian manon je, 901 00:57:01,900 --> 00:57:04,860 sed ili estas tie kaj kiu tendencas aĵojn kiel vian uzantnomon 902 00:57:04,860 --> 00:57:08,090 kaj aliaj speco de pli malalta nivelo detaloj. 903 00:57:08,090 --> 00:57:12,880 Sed la juiciest pecoj de via memoro la aranĝo estas tiu afero nomata la pilo kaj la amaso. 904 00:57:12,880 --> 00:57:17,470 La pilo denove, esti klara, estas la memoro kiun estas uzata kiam funkcioj estas nomata, 905 00:57:17,470 --> 00:57:19,710 kiam ajn estas lokaj variabloj 906 00:57:19,710 --> 00:57:22,120 kaj ĉiufoje kiam estas parametroj aprobotaj ĉirkaŭe. 907 00:57:22,120 --> 00:57:24,490 Ĉiuj kiuj okazas en la stako. 908 00:57:24,490 --> 00:57:29,570 La amaso ni ne raportis, sed preni guess kiu uzas la amaso. 909 00:57:31,120 --> 00:57:32,690 Nur malsama eron de memoro. 910 00:57:32,690 --> 00:57:36,620 Ĝi okazas esti desegnita tie supre, sed estas arbitra pictórico konvencio. 911 00:57:36,620 --> 00:57:41,670 Kiu ŝajne estis uzante memoro de la amaso dum semajnoj? 912 00:57:41,670 --> 00:57:44,830 Estas teknike vi sed nerekte. >> [Studento] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString kaj malloc. Do jen la fundamenta diferenco. 914 00:57:47,950 --> 00:57:51,300 >> Vi scias la lastaj semajnoj, ke se vi bezonos memoro, simple deklaras variablon. 915 00:57:51,300 --> 00:57:54,560 Se vi bezonas multan memoron, deklari tabelo tute interne de via funkcio. 916 00:57:54,560 --> 00:57:59,620 Sed la problemo ni tenis alfrontas estas se vi rakontos variabloj loke ene de funkcioj, 917 00:57:59,620 --> 00:58:05,340 tuj kiam la funkcio revenas, kio okazas al la memoro kaj tiuj variabloj? 918 00:58:05,340 --> 00:58:09,620 Nur ia ĝi ne plu apartenas al vi, ĉu ne? Ĝi simple malaperas ia koncepte. 919 00:58:09,620 --> 00:58:13,950 Estas ankoraŭ fizike tie, evidente, sed ĝi ne plu vian rajton uzi. 920 00:58:13,950 --> 00:58:17,160 Tio estas evidente problema se vi volas skribi funkciojn en la vivo 921 00:58:17,160 --> 00:58:20,440 ke efektive rezervi memoron kaj ne donas ĝin tuj. 922 00:58:20,440 --> 00:58:24,180 Kazo en punkto: GetString la celo en la vivo estas havi nenian ideon anticipe 923 00:58:24,180 --> 00:58:26,390 kiom granda de kordo mi iros por tajpi en la klavaro, 924 00:58:26,390 --> 00:58:30,390 sed ĝi alvenis al povos rezervi memoron por teni Davido aŭ saluton 925 00:58:30,390 --> 00:58:32,860 aŭ tuta eseo ke la uzanto eble tajpis in 926 00:58:32,860 --> 00:58:35,280 Do GetString estis uzante malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc tial devas uzi ne la pilo; 928 00:58:38,910 --> 00:58:40,770 anstataŭ ĝi estas uzanta tion nomis la amaso. 929 00:58:40,770 --> 00:58:44,430 Nenio malsama pri la memoro. Ne pli rapida aŭ malrapida aŭ io kiel tio. 930 00:58:44,430 --> 00:58:46,570 Estas nur fizike en malsama loko. 931 00:58:46,570 --> 00:58:50,120 >> Sed la regulo estas, ke la memoro ke tio asignitaj sur la havaĵon 932 00:58:50,120 --> 00:58:56,180 neniam estos prenita for de vi, gxis vi nomas - preni guess - libera. 933 00:58:56,180 --> 00:59:00,510 Kontraŭe, ĉiu memoro vi petas en la stako de nur deklarante tabelo 934 00:59:00,510 --> 00:59:03,320 aŭ deklari variablon kiel ni estis farante dum semajnoj, 935 00:59:03,320 --> 00:59:05,640 ke defaŭlte finas sur la stako. 936 00:59:05,640 --> 00:59:09,550 Kaj tio funkcias granda 90% de la tempo, sed en tiuj maloftaj okazoj 937 00:59:09,550 --> 00:59:12,470 kie vi volas rezervi memoron kaj konservi ĝin ĉirkaŭe, 938 00:59:12,470 --> 00:59:14,730 tiam vi devas uzi funkcio kiel malloc. 939 00:59:14,730 --> 00:59:19,370 Aŭ ni uzis funkcio kiel GetString, kiu siavice uzas malloc. 940 00:59:19,370 --> 00:59:23,300 Ni vidu kie ĉi povus rompi kaj poste preni travidi en Binky. 941 00:59:23,300 --> 00:59:25,820 Ni revenos al tiu en la estonteco. 942 00:59:25,820 --> 00:59:29,270 Jen super simpla programo kiu en la unuaj 2 linioj faras kio? 943 00:59:29,270 --> 00:59:33,460 En la angla, kion ĉi tiuj unuaj 2 linioj de kodo fari ene de ĉefa? 944 00:59:33,460 --> 00:59:35,600 [Inaudible studento respondon] 945 00:59:35,600 --> 00:59:37,880 Zorga. Ne donu al mi la adreson de x aŭ y. 946 00:59:37,880 --> 00:59:41,840 [Studento] Donas punteros al ints. >> Bona. Donu al mi 2 punteros al entjeroj. 947 00:59:41,840 --> 00:59:45,130 En aliaj vortoj, donu al mi 2 pecoj de memoro, ke mi observu desegno hodiaŭ, 948 00:59:45,130 --> 00:59:46,950 kvankam mi viŝis ĝin nun, kiel kvadratoj. 949 00:59:46,950 --> 00:59:50,000 Donu al mi 2 pecoj de memoro, unu nomita x, unu nomita y - 950 00:59:50,000 --> 00:59:54,320 antaŭe mi nomis ilin s kaj t - kaj kio estas la tipo de tiu bloko de memoro? 951 00:59:54,320 --> 00:59:57,160 Ĝi okazas stoki adreson. 952 00:59:57,160 --> 00:59:59,110 Estas de tipo int *. 953 00:59:59,110 --> 01:00:01,630 >> Do la adreso de int eventuale loĝas en x, 954 01:00:01,630 --> 01:00:03,860 la adreso de int eventuale loĝas en y, 955 01:00:03,860 --> 01:00:08,460 sed komence, kio estas interne de x kaj y? Kiu scias? Garbage valoroj. 956 01:00:08,460 --> 01:00:10,180 Ĝi havas nenion komunan kun indikoj. 957 01:00:10,180 --> 01:00:12,720 Se ni ne metus ion tie, kiu scias kio estas reale ekzistas? 958 01:00:12,720 --> 01:00:18,950 Nun, x. Kio okazas ĉi tie? Ĉi tiu estas legit nun ĉar x estas puntero. Ĝi estas int *. 959 01:00:18,950 --> 01:00:21,870 Do tio signifas mi povas meti en x la adreso de iu bloko de memoro. 960 01:00:21,870 --> 01:00:25,120 Kion malloc reveni? Perfekta, ĝi revenas adresojn, 961 01:00:25,120 --> 01:00:28,510 la adreso de la unua bajto en tuta bloko de memoro. 962 01:00:28,510 --> 01:00:31,140 Kiom da bajtoj estas ĉi ŝajne atribuo, ekzemple, en la aparaton? 963 01:00:31,140 --> 01:00:33,510 Kio estas la grandeco de int? 4. 964 01:00:33,510 --> 01:00:36,600 Se vi pensas reen al semajno 1, ne super grave ĉiam memoru, ke, 965 01:00:36,600 --> 01:00:38,870 sed en ĉi tiu kazo ĝi estas utila por scii, 4 bitokoj. 966 01:00:38,870 --> 01:00:41,770 Do tiu estas atribuo sur la havaĵon 4 bitokoj 967 01:00:41,770 --> 01:00:46,110 kaj ĝin redoni la adreson de la unua al mi arbitre. 968 01:00:46,110 --> 01:00:47,700 Nun, kio x faras? 969 01:00:47,700 --> 01:00:52,200 A * x = 42 faras kio? 970 01:00:52,200 --> 01:00:57,150 Se je ĉi tiu punkto en la historio ni havas x, kiu aspektas kiel tiu kun iu rubo valoro, 971 01:00:57,150 --> 01:01:04,120 ĉi tiu estas nun y kun iuj rubo valoron, nun en linio 3 Mi destinis 4 bitokoj. 972 01:01:04,120 --> 01:01:06,950 Ĉi tiu pentraĵo esence similas ĉi. 973 01:01:06,950 --> 01:01:12,010 Aŭ pli konkrete, se ĉi tiu estas ajna adreso 123, tio estas, kion nia rakonto nun aspektas. 974 01:01:12,010 --> 01:01:23,940 * X = 42 nun signifas kion? Tio signifas iri al la adreso 123 kaj metis la numero 42 tie. 975 01:01:23,940 --> 01:01:26,220 Mi ne bezonas por desegni tiujn liniojn ĉar ni ne faras kordojn. 976 01:01:26,220 --> 01:01:29,480 >> Mi devus esti ĵus skribis ĝin kiel tiun, kaj nur por pruvo de sake, 977 01:01:29,480 --> 01:01:33,240 42 kiel int ia okupas multe da spaco, 4 bitokoj. 978 01:01:33,240 --> 01:01:35,960 Do jen kio okazis tie, sed tie estas problemo nun. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Kio okazos tie? 980 01:01:40,580 --> 01:01:46,470 La problemo estas * y en nia simpligita mondo nur signifas iri al la adreso en y. 981 01:01:46,470 --> 01:01:48,590 Kio estas en y? Estas iuj rubo valoro. 982 01:01:48,590 --> 01:01:53,150 Do ni supozu, ke tiu rubo valoro estas 5551212, iu freneza tiel. 983 01:01:53,150 --> 01:01:56,750 * Y signifas iri trakti 5551212. 984 01:01:56,750 --> 01:02:00,450 Tio like super tie. Ĝi ne ekzistas, ekzemple. 985 01:02:00,450 --> 01:02:05,310 Do * y ricevas 13 rimedoj Mi provas ĉerpi 13 ĉi tie. Ĝi ne ekzistas. 986 01:02:05,310 --> 01:02:08,790 Mi superis la segmento de la tabulo. Kiel mi estas rekompenciĝita? 987 01:02:08,790 --> 01:02:14,930 Ke críptico mesaĝon segmentación kulpo ĉar mi klopodis meti en memoron 988 01:02:14,930 --> 01:02:19,470 valoro kiel 13, je loko kiu ne ekzistas. 989 01:02:19,470 --> 01:02:23,900 La resto de la programo povus labori bone, sed ĝis tiu punkto ne. 990 01:02:23,900 --> 01:02:25,350 Do ni provu diri ĉi tiu historio. 991 01:02:25,350 --> 01:02:27,830 Ni revenos al tiu fojo ni jam parolis pri deksesumajn. 992 01:02:27,830 --> 01:02:30,290 Ni reiru al oriento kaj konkludi kun tiu afero nomata Binky, 993 01:02:30,290 --> 01:02:33,710 kiu revokon estas Stanford instruisto sidas hejme ludante kun Claymation, 994 01:02:33,710 --> 01:02:36,380 rakonti la historion de ĝuste tiu sama programo. 995 01:02:36,380 --> 01:02:40,580 Estas nur ĉirkaŭ 3 minutoj. Jen ni havas Binky. 996 01:02:40,580 --> 01:02:45,030 [Masklo parolanto en video] Hey Binky, veki. Estas tempo por puntero amuzo. 997 01:02:45,030 --> 01:02:50,080 [Binky] Kio estas tio? Lernu pri punteros? Ho, Goody! 998 01:02:50,080 --> 01:02:53,700 [Masklo parolanto] Nu, por komenci, mi supozas ke ni tuj bezonas paron punteros. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Okay. Tiu kodo allocates 2 punteros kiu povas marki entjeroj. 1000 01:02:57,890 --> 01:03:02,220 [Masklo parolanto] Okay. Nu, mi vidas la 2 punteros, sed ne ŝajnas esti indikante nenion. 1001 01:03:02,220 --> 01:03:05,550 [Binky] Tio estas prava. Komence, punteros ne indikas ion ajn. 1002 01:03:05,550 --> 01:03:09,270 La aferoj oni indikas nomas pointees, kaj fiksante ilin estas aparta paŝo. 1003 01:03:09,270 --> 01:03:12,330 [Masklo parolanto] Ho, dekstra, rajto. Mi sciis tion. La pointees estas apartaj. 1004 01:03:12,330 --> 01:03:15,630 Er, do kiel vi rezervu pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Okay. Tiu kodo allocates nova entjero pointee, kaj ĉi tiu parto aroj x atentigi al tio. 1006 01:03:21,510 --> 01:03:23,500 [Masklo parolanto] Hey, kiu serĉas pli bone. 1007 01:03:23,500 --> 01:03:26,030 Do fari ion. >> [Binky] Okay. 1008 01:03:26,030 --> 01:03:30,300 Mi instruos vin dereference la puntero x por stoki la numero 42 en ĝian pointee. 1009 01:03:30,300 --> 01:03:34,410 Por ĉi tiu lertaĵo Mi bezonas mian magian bastonon de dereferencing. 1010 01:03:34,410 --> 01:03:38,610 [Masklo parolanto] Via magio sceptron de dereferencing? Tio estas granda. 1011 01:03:38,610 --> 01:03:44,230 [Binky] Ĉi tio estas kion la kodo aspektas. Mi ĵus instalis la nombro kaj ... [Krevi sono] 1012 01:03:44,230 --> 01:03:46,100 [Masklo parolanto] Hey rigardi, ĝi iras. 1013 01:03:46,100 --> 01:03:50,990 Tion farante oni dereference sur x sekvas la sago por aliri lia pointee, 1014 01:03:50,990 --> 01:03:53,230 en ĉi tiu kazo por stoki 42 en tie. 1015 01:03:53,230 --> 01:03:57,630 Hej, provu uzi ĝin stoki la numero 13 tra la alia puntero, y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Okay. Mi simple iri tien al y kaj akiri la numero 13 starigis 1017 01:04:03,250 --> 01:04:08,360 kaj tiam preni la sceptron de dereferencing kaj simple ... [Bruado sono] Halt! 1018 01:04:08,360 --> 01:04:10,980 [Masklo parolanto] Oh hey, ke ne funkciis. 1019 01:04:10,980 --> 01:04:14,870 >> Diru Binky, mi ne kredas dereferencing y estas bona ideo 1020 01:04:14,870 --> 01:04:17,880 ĉar starigadon de la pointee estas aparta paŝo 1021 01:04:17,880 --> 01:04:19,850 kaj mi ne kredas ke ni iam faris. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, bona punkto. 1023 01:04:21,770 --> 01:04:26,640 [Masklo parolanto] Yeah. Ni destinis la puntero y sed ni neniam starigis ĝin al punkto al pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, tre religiema. 1025 01:04:28,780 --> 01:04:30,690 [Masklo parolanto] Hey, kiun vi sercxas bonan tie, Binky. 1026 01:04:30,690 --> 01:04:34,160 Ĉu vi povas ripari ĝin tiel ke y punktoj al la sama pointee kiel x? >> [Binky] Certe. 1027 01:04:34,160 --> 01:04:37,100 Mi uzas mian magian bastonon de puntero farita. 1028 01:04:37,100 --> 01:04:39,070 [Masklo parolanto] Ĉu tiu tuj estos problemo kiel antaŭe? 1029 01:04:39,070 --> 01:04:40,840 [Binky] Ne, ĉi tio ne tuŝas la pointees. 1030 01:04:40,840 --> 01:04:44,780 Ĝi simple ŝanĝas unu puntero atentigi al la sama afero kiel la alia. [Krevi sono] 1031 01:04:44,780 --> 01:04:48,570 [Masklo parolanto] Ho, mi vidas. Nun y punktoj al la sama loko kiel x. 1032 01:04:48,570 --> 01:04:51,140 Do atendu. Nun y estas fiksita. Ĝi havas pointee. 1033 01:04:51,140 --> 01:04:54,520 Do vi povas provi la sceptron de dereferencing denove sendi la 13 pli. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Uh, okay. Jen iras. [Krevi sono] 1035 01:04:58,130 --> 01:05:01,250 [Masklo parolanto] Hey, rigardu tion. Nun dereferencing laboroj sur y. 1036 01:05:01,250 --> 01:05:05,200 Kaj ĉar la punteros dividas tiun pointee, ili ambaŭ vidas la 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Yeah, dividi. Kion ajn. 1038 01:05:06,910 --> 01:05:08,880 >> Do ni tuj ŝanĝos lokoj nun? 1039 01:05:08,880 --> 01:05:11,420 [Masklo parolanto] Ho rigardu, ni estas el la tempo. >> [Binky] Sed - 1040 01:05:11,420 --> 01:05:13,880 [Masklo parolanto] nur memoras la 3 puntero reguloj. 1041 01:05:13,880 --> 01:05:18,630 Nombro 1, la baza strukturo estas ke vi havas puntero kaj notas super al pointee. 1042 01:05:18,630 --> 01:05:23,120 Sed la montrilo kaj pointee estas apartaj, kaj la komuna eraro estas starigi puntero 1043 01:05:23,120 --> 01:05:25,680 sed forgesi doni al ĝi pointee. 1044 01:05:25,680 --> 01:05:29,580 Numero 2, pointer dereferencing komenciĝas ĉe la montrilo kaj sekvas lian sagon super 1045 01:05:29,580 --> 01:05:31,060 aliri lia pointee. 1046 01:05:31,060 --> 01:05:34,340 Kiel ni ĉiuj scias, tiu nur funkcias se estas pointee, 1047 01:05:34,340 --> 01:05:36,460 kio tia ricevas reen por regi numero 1. 1048 01:05:36,460 --> 01:05:39,870 Numero 3, pointer asigno prenas unu puntero kaj ŝanĝas ĝin 1049 01:05:39,870 --> 01:05:42,390 atentigi al la sama pointee kiel alia puntero. 1050 01:05:42,390 --> 01:05:45,890 Do post la farita, la 2 punteros notos la saman pointee. 1051 01:05:45,890 --> 01:05:47,800 Kelkfoje tiu nomas dividi. 1052 01:05:47,800 --> 01:05:50,910 >> Kaj jen ĉio estas al ĝi vere. Bye-bye nun. 1053 01:05:50,910 --> 01:05:55,840 Ĉi tiu estas Binky. Ĉi tiu estas CS50. Ni vidos vin proksima semajno. [Aplaŭdo] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]