1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID MALAN: Okay, velkommen tilbage. 3 00:00:12,580 --> 00:00:13,290 Dette er CS50. 4 00:00:13,290 --> 00:00:15,130 Dette er starten på uge syv. 5 00:00:15,130 --> 00:00:18,890 Så det har været et stykke tid, så jeg troede, vi ville tage en hurtig rundvisning, hvor vi 6 00:00:18,890 --> 00:00:20,760 slap, og hvor vi er nu i gang. 7 00:00:20,760 --> 00:00:23,310 >> Så dette ting her kunne have forårsaget en vis angst i første omgang. 8 00:00:23,310 --> 00:00:27,680 Men forhåbentlig er du begyndt at akklimatisere sig til, hvad det betegner her - 9 00:00:27,680 --> 00:00:32,670 stjerne repræsenterer en pointer, som er netop, hvad der i mere lægmandssprog? 10 00:00:32,670 --> 00:00:33,400 Så det er en adresse. 11 00:00:33,400 --> 00:00:35,490 >> Så det er adressen på noget i hukommelsen. 12 00:00:35,490 --> 00:00:38,260 Og vi begyndte at skrælle lagene for et par uger siden, ting som 13 00:00:38,260 --> 00:00:41,800 GetString og andre sådanne funktioner al denne tid har vender tilbage 14 00:00:41,800 --> 00:00:46,010 adresser på ting i hukommelsen, ligesom adresse for det første tegn i 15 00:00:46,010 --> 00:00:46,990 nogle sekvens. 16 00:00:46,990 --> 00:00:50,360 >> Så vi også indført Valgrind, som vil du begynde at bruge til dette problem 17 00:00:50,360 --> 00:00:53,380 indstille, især for den næste Problemet sæt samt. 18 00:00:53,380 --> 00:00:54,980 Og Valgrind gør hvad for os? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Den kontrollerer for memory leaks, og det kontrollerer også, om misbrug af hukommelse. 21 00:01:01,020 --> 00:01:05,890 >> Det kan med en vis sandsynlighed, opdage, hvis din kode der vil berøre hukommelse 22 00:01:05,890 --> 00:01:07,100 at det simpelthen ikke bør. 23 00:01:07,100 --> 00:01:10,410 Så ikke nødvendigvis en lækage, men hvis du går ud over grænserne for nogle 24 00:01:10,410 --> 00:01:14,730 array, og du faktisk køre valgrind og fremkalde denne adfærd, mens 25 00:01:14,730 --> 00:01:17,870 Valgrind kører i dit program er kører inde i det, får du 26 00:01:17,870 --> 00:01:21,460 meddelelser som denne - "ugyldig skrive om str. 4 ", som, husker et par 27 00:01:21,460 --> 00:01:25,880 uger siden betød, at jeg havde et uheld gerne på en int for langt 28 00:01:25,880 --> 00:01:27,250 ud over grænserne for et array. 29 00:01:27,250 --> 00:01:30,790 Og så str. 4 betyder her størrelse af denne særlige int. 30 00:01:30,790 --> 00:01:35,260 >> Så tag tryghed i, at Valgrind udgang, formatet på det, 31 00:01:35,260 --> 00:01:36,170 er blot grusomme. 32 00:01:36,170 --> 00:01:40,180 Det er virkelig svært at se igennem det rod for interessante oplysninger. 33 00:01:40,180 --> 00:01:42,910 Så hvad vi har gjort her er bare uddrag nogle af de par mere 34 00:01:42,910 --> 00:01:43,850 interessante linjer. 35 00:01:43,850 --> 00:01:46,760 Men indser, at 80% af Valgrind s output vil være lidt af en 36 00:01:46,760 --> 00:01:47,650 distraktion. 37 00:01:47,650 --> 00:01:52,820 >> Bare se efter mønstre som disse - ugyldig højre, ugyldig læse, 40 bytes 38 00:01:52,820 --> 00:01:56,690 og nogle antallet af blokke er absolut tabt, søgeord som. 39 00:01:56,690 --> 00:02:01,920 Og hvad du vil forhåbentlig se en vis slags spor af hvilken funktion 40 00:02:01,920 --> 00:02:03,340 fejl er faktisk i. 41 00:02:03,340 --> 00:02:07,195 I dette tilfælde her, i hvilken linje min kode var fejlen tilsyneladende? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 i en fil kaldet memory.c, hvilket var det eksempel, vi legede med 44 00:02:14,130 --> 00:02:14,890 på det tidspunkt. 45 00:02:14,890 --> 00:02:16,460 Så det er formentlig ikke i malloc. 46 00:02:16,460 --> 00:02:18,630 Det var sandsynligvis i min kode i stedet. 47 00:02:18,630 --> 00:02:20,910 Så vi vil se det igen og igen inden længe. 48 00:02:20,910 --> 00:02:24,080 >> Så scanf kom dette op i en par formularer hidtil. 49 00:02:24,080 --> 00:02:26,410 Vi så sscanf kortvarigt. 50 00:02:26,410 --> 00:02:28,330 Det var noget en række du dykkede ind i din 51 00:02:28,330 --> 00:02:29,535 forberedelserne til quizzen. 52 00:02:29,535 --> 00:02:33,130 Og scanf er faktisk, hvad det CS50 Biblioteket har brugt under 53 00:02:33,130 --> 00:02:36,560 hætte i temmelig lang tid for at få input fra brugeren. 54 00:02:36,560 --> 00:02:40,420 >> For eksempel I, hvis flytte over til CS50 Apparatet her, lad mig åbne en 55 00:02:40,420 --> 00:02:45,315 eksempel i dag, hedder scanf-0.c Og det er super simpelt. 56 00:02:45,315 --> 00:02:46,590 Det er bare et par linjer kode. 57 00:02:46,590 --> 00:02:50,880 Men det viser virkelig, hvor getInt har arbejdet hele denne gang. 58 00:02:50,880 --> 00:02:54,710 >> I dette program her, i linie 16 , Meddelelse om, at jeg erklærer en int. 59 00:02:54,710 --> 00:02:57,270 Altså ingen pejlemærker, intet magisk der, blot en int. 60 00:02:57,270 --> 00:03:00,330 Derefter i linie 17, beder jeg brugeren for en række, tak. 61 00:03:00,330 --> 00:03:02,930 Så i slutningen af ​​18, bruger jeg scanf her. 62 00:03:02,930 --> 00:03:06,910 Og jeg angivet, lidt ligesom printf, at jeg forventer citat 63 00:03:06,910 --> 00:03:08,110 citat slut procent i. 64 00:03:08,110 --> 00:03:10,920 >> Så procent i, selvfølgelig betegner en int. 65 00:03:10,920 --> 00:03:14,580 Men bemærk, hvad den anden argument for scanf er. 66 00:03:14,580 --> 00:03:17,350 Hvordan vil du beskrive den anden argument efter kommaet? 67 00:03:17,350 --> 00:03:19,450 Hvad er det? 68 00:03:19,450 --> 00:03:20,670 >> Det er adressen på x. 69 00:03:20,670 --> 00:03:25,490 Så dette er nyttigt, fordi ved at give scanf med adressen på x, hvad betyder 70 00:03:25,490 --> 00:03:29,560 som sætter denne funktion til at gøre? 71 00:03:29,560 --> 00:03:33,010 Ikke bare gå der, men også gøre hvad? 72 00:03:33,010 --> 00:03:34,060 >> Foretag en ændring til det. 73 00:03:34,060 --> 00:03:38,080 Fordi du kan gå der, det er en slags som et kort til en placering i hukommelsen. 74 00:03:38,080 --> 00:03:41,900 Og så længe du giver scanf eller enhver funktion med sådan et kort, der 75 00:03:41,900 --> 00:03:45,840 Funktionen kan gå der, og ikke kun se på værdien, men det kan også 76 00:03:45,840 --> 00:03:49,670 ændre denne værdi, som er nyttigt, hvis formålet med livet i scanf er at 77 00:03:49,670 --> 00:03:53,060 scanne input fra brugeren, specielt fra tastaturet. 78 00:03:53,060 --> 00:03:57,830 Og f betegner formateret, ligesom printf, f betegner en formateret 79 00:03:57,830 --> 00:03:58,930 streng, du vil udskrive. 80 00:03:58,930 --> 00:04:04,430 >> Så kort sagt, denne linje 18 siger simpelthen, forsøge at læse en int fra brugerens 81 00:04:04,430 --> 00:04:10,420 tastatur og gemme det inde i x, på uanset hvad adressen x sker for at leve på. 82 00:04:10,420 --> 00:04:14,860 Og så endelig, linje 19 bare siger, tak for int, i dette tilfælde. 83 00:04:14,860 --> 00:04:15,940 >> Så lad mig gå videre og gøre det. 84 00:04:15,940 --> 00:04:18,570 Så gør scanf 0. 85 00:04:18,570 --> 00:04:20,130 Lad mig gå videre og zoome ind 86 00:04:20,130 --> 00:04:22,960 Jeg vil gå og køre dette med prikker slash scanf 0. 87 00:04:22,960 --> 00:04:24,020 Number, please? 88 00:04:24,020 --> 00:04:24,720 50.. 89 00:04:24,720 --> 00:04:25,730 Tak for de 50. 90 00:04:25,730 --> 00:04:27,270 Så det er ganske simpelt. 91 00:04:27,270 --> 00:04:28,160 >> Hvad er det nu ikke gør? 92 00:04:28,160 --> 00:04:29,940 Det er ikke at gøre en hel masse af fejlkontrol. 93 00:04:29,940 --> 00:04:33,000 For eksempel, hvis jeg ikke samarbejder og jeg kan ikke skrive i et nummer, men 94 00:04:33,000 --> 00:04:37,860 i stedet jeg skriver noget lignende "hej," det er bare lidt besynderligt. 95 00:04:37,860 --> 00:04:41,130 Og så en af ​​de ting, CS50 Biblioteket har gjort for os for nogle 96 00:04:41,130 --> 00:04:43,440 tid er at reprompting og reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Den retry sætning tilbagekaldelse var i cs50.c, og det er grunden til, at getInt i 98 00:04:49,320 --> 00:04:51,670 Den CS50 biblioteket er faktisk en hel bundt af linjer lang, fordi vi er 99 00:04:51,670 --> 00:04:53,190 kontrol for dumme ting som dette. 100 00:04:53,190 --> 00:04:55,730 Har brugeren ikke give os i virkeligheden? en int 101 00:04:55,730 --> 00:04:57,910 Har han eller hun give os noget som en alfabetisk brev? 102 00:04:57,910 --> 00:05:01,410 Hvis ja, vil vi opdage det, og råber på dem. 103 00:05:01,410 --> 00:05:03,915 >> Men tingene bliver mere interessant i dette næste eksempel. 104 00:05:03,915 --> 00:05:09,840 Hvis jeg går til scanf-1.c, hvad er den ene ting, der er fundamentalt ændret i 105 00:05:09,840 --> 00:05:11,135 denne næste eksempel? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Jeg bruger char *, selvfølgelig, i stedet for int. 108 00:05:16,010 --> 00:05:19,210 >> Så dette er interessant, fordi char *, husker, er egentlig bare den 109 00:05:19,210 --> 00:05:20,190 samme ting som streng. 110 00:05:20,190 --> 00:05:23,840 Så det føles som måske er dette en super simpel implementering af getString. 111 00:05:23,840 --> 00:05:26,010 Men jeg har skrællet tilbage laget af CS50-biblioteket, så jeg er 112 00:05:26,010 --> 00:05:27,550 kalde dette char * nu. 113 00:05:27,550 --> 00:05:30,070 Så lad os se, hvor, hvis det overalt, vi går galt. 114 00:05:30,070 --> 00:05:30,840 >> Linje 17 - 115 00:05:30,840 --> 00:05:33,950 Jeg atter sige, bedes du give mig noget, i dette tilfælde. en streng 116 00:05:33,950 --> 00:05:37,940 Og derefter i den næste linje, kalder jeg scanf, igen, giver det et format kode, 117 00:05:37,940 --> 00:05:39,310 men denne gang procent sek. 118 00:05:39,310 --> 00:05:41,900 Og så denne gang, jeg er giver det puffer. 119 00:05:41,900 --> 00:05:43,550 >> Læg nu mærke til, jeg ikke bruger -tegnet. 120 00:05:43,550 --> 00:05:47,120 Men hvorfor er det sandsynligvis OK her? 121 00:05:47,120 --> 00:05:49,760 For hvad er buffer allerede? 122 00:05:49,760 --> 00:05:50,770 Det er allerede en pointer. 123 00:05:50,770 --> 00:05:51,650 Det er allerede en adresse. 124 00:05:51,650 --> 00:05:54,510 >> Og lad os dette ord "forvirre," lad mig bare kalde det s, for eksempel til 125 00:05:54,510 --> 00:05:55,050 enkelhed. 126 00:05:55,050 --> 00:05:58,250 Men jeg har kaldt det buffer fordi generelt i programmering, hvis du har en 127 00:05:58,250 --> 00:06:02,130 luns af hukommelse, som en streng virkelig bare, du måske kalde det en buffer. 128 00:06:02,130 --> 00:06:04,460 Det er et sted at opbevare oplysningerne. 129 00:06:04,460 --> 00:06:07,400 >> Svarende til ting som YouTube, når de er buffering, så at sige, at 130 00:06:07,400 --> 00:06:10,270 bare betyder, at det henter bits fra internettet og gemme dem i et 131 00:06:10,270 --> 00:06:14,160 lokal array, en lokal klump hukommelse så at du kan se det senere uden 132 00:06:14,160 --> 00:06:16,830 det springer eller hængende på du under afspilning. 133 00:06:16,830 --> 00:06:20,930 >> Så der er et problem her selv, fordi jeg fortæller scanf, forventer en 134 00:06:20,930 --> 00:06:22,320 streng fra brugeren. 135 00:06:22,320 --> 00:06:24,410 Her er adressen på en luns af hukommelse. 136 00:06:24,410 --> 00:06:26,180 Put denne streng der. 137 00:06:26,180 --> 00:06:31,230 Hvorfor er der bundet giver os problemer, selvom? 138 00:06:31,230 --> 00:06:33,490 >> Hvad er det? 139 00:06:33,490 --> 00:06:35,510 Må jeg få adgang til at en del af hukommelsen? 140 00:06:35,510 --> 00:06:36,250 Du ved, jeg ikke kender. 141 00:06:36,250 --> 00:06:39,210 Fordi der er buffer blevet initialiseret til noget? 142 00:06:39,210 --> 00:06:39,820 Ikke rigtig. 143 00:06:39,820 --> 00:06:43,090 Og så det er hvad vi har ringet en skraldespand værdi, hvilket 144 00:06:43,090 --> 00:06:44,040 er ikke en formel ord. 145 00:06:44,040 --> 00:06:49,200 Det betyder blot, vi har ingen idé om hvad bits er indersiden af ​​fire byte, 146 00:06:49,200 --> 00:06:51,240 Jeg har fordelt som buffer. 147 00:06:51,240 --> 00:06:52,450 >> Jeg har ikke kaldt malloc. 148 00:06:52,450 --> 00:06:53,940 Jeg har absolut ikke kaldes getString. 149 00:06:53,940 --> 00:06:56,380 Så hvem ved hvad der rent faktisk indersiden af ​​buffer? 150 00:06:56,380 --> 00:07:00,550 Og alligevel fortæller scanf blindt, gå der og sætte hvad brugeren har indtastet. 151 00:07:00,550 --> 00:07:04,460 >> Så hvad er tilbøjelige til at forårsage i vores kode, hvis vi kører det? 152 00:07:04,460 --> 00:07:05,700 Formentlig en segfault. 153 00:07:05,700 --> 00:07:07,970 Måske ikke, men sandsynligvis en segfault. 154 00:07:07,970 --> 00:07:10,620 Og jeg siger måske ikke, fordi nogle gange du gør, nogle gange 155 00:07:10,620 --> 00:07:11,380 du ikke får en segfault. 156 00:07:11,380 --> 00:07:14,280 Nogle gange er du bare heldig, men det alligevel kommer til at være 157 00:07:14,280 --> 00:07:15,340 en fejl i vores program. 158 00:07:15,340 --> 00:07:17,060 >> Så lad mig gå videre og kompilere dette. 159 00:07:17,060 --> 00:07:18,280 Jeg har tænkt mig at gøre det på den gamle skole måde. 160 00:07:18,280 --> 00:07:23,825 Så klang dash 0, scanf-1, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Ups, for gammel skole. 162 00:07:24,720 --> 00:07:26,550 Lad os se. 163 00:07:26,550 --> 00:07:28,440 Hvor har jeg hen? 164 00:07:28,440 --> 00:07:29,700 Åh, char * buffer. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Åh, tak - 167 00:07:35,130 --> 00:07:36,930 Gem, OK - 168 00:07:36,930 --> 00:07:37,690 meget gamle skole. 169 00:07:37,690 --> 00:07:38,900 Okay, det har været et stykke tid. 170 00:07:38,900 --> 00:07:41,720 >> Så jeg har lige gemt filen efter gør, at midlertidig 171 00:07:41,720 --> 00:07:42,700 ændre et øjeblik siden. 172 00:07:42,700 --> 00:07:46,090 Og nu har jeg samlet det manuelt med Clang. 173 00:07:46,090 --> 00:07:49,500 Og nu vil jeg gå videre og køre scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 String venligst. 175 00:07:50,290 --> 00:07:51,600 Jeg skrive i "hej." 176 00:07:51,600 --> 00:07:54,070 >> Og nu, her er hvor helt ærligt, printf kan er lidt irriterende. 177 00:07:54,070 --> 00:07:56,020 Det er faktisk ikke kommer til at segfault i dette tilfælde. 178 00:07:56,020 --> 00:07:59,860 Printf er lidt speciel, fordi det er så super almindeligt anvendt, at 179 00:07:59,860 --> 00:08:03,570 væsentlige printf gør os en tjeneste og realisere, 180 00:08:03,570 --> 00:08:04,830 det er ikke et gyldigt pointer. 181 00:08:04,830 --> 00:08:09,080 Lad mig tage det på mig selv bare at udskrive i parentes null, selv 182 00:08:09,080 --> 00:08:13,340 selvom det ikke er nødvendigvis, hvad vi selv havde forventet. 183 00:08:13,340 --> 00:08:16,940 >> Så vi kan ikke rigtig nemt fremkalde en segfault med dette, men det er klart det 184 00:08:16,940 --> 00:08:18,600 er ikke den opførsel, jeg ønskede. 185 00:08:18,600 --> 00:08:19,800 Så hvad er den simple løsning? 186 00:08:19,800 --> 00:08:25,650 Tja, i scanf-2, så lad mig foreslå, at i stedet for faktisk bare afsætte en 187 00:08:25,650 --> 00:08:30,100 char *, lad mig være lidt klogere dette, og lad mig allokere buffer 188 00:08:30,100 --> 00:08:32,940 som en sekvens af 16 tegn. 189 00:08:32,940 --> 00:08:34,200 >> Så jeg kan gøre dette i et par måder. 190 00:08:34,200 --> 00:08:35,610 Jeg kunne absolut bruge malloc. 191 00:08:35,610 --> 00:08:38,980 Men jeg kan gå tilbage til uge to, når Jeg har lige brug for en hel masse 192 00:08:38,980 --> 00:08:39,620 tegn. 193 00:08:39,620 --> 00:08:40,860 Det er bare et array. 194 00:08:40,860 --> 00:08:44,870 Så lad mig i stedet omdefinere buffer at være et array af 16 tegn. 195 00:08:44,870 --> 00:08:47,340 >> Og nu, når jeg passerer buffer i - 196 00:08:47,340 --> 00:08:49,940 og det er noget, vi ikke tale om i uge to - 197 00:08:49,940 --> 00:08:53,730 men du kan behandle en array som selvom det er en adresse. 198 00:08:53,730 --> 00:08:56,390 Teknisk set som vi har set, de er en lille smule anderledes. 199 00:08:56,390 --> 00:09:01,290 Men scanf vil ikke noget imod, hvis du passerer det navnet på et array, fordi det 200 00:09:01,290 --> 00:09:05,030 Klang vil gøre for os, er hovedsagelig behandle navnet på denne matrix som 201 00:09:05,030 --> 00:09:08,280 adresse luns af 16 bytes. 202 00:09:08,280 --> 00:09:09,550 >> Så dette er bedre. 203 00:09:09,550 --> 00:09:12,110 Det betyder nu, at jeg kan forhåbentlig du gøre følgende. 204 00:09:12,110 --> 00:09:16,800 Lad mig zoome ud et øjeblik og gør scanf-2, kompileret OK. 205 00:09:16,800 --> 00:09:19,390 Lad mig gøre fik slash scanf-2. 206 00:09:19,390 --> 00:09:22,430 String venligst. "Hello". Og det syntes at arbejde denne gang. 207 00:09:22,430 --> 00:09:26,020 >> Men kan nogen foreslå et scenarie hvor det måske ikke stadig arbejde? 208 00:09:26,020 --> 00:09:28,550 Ja? 209 00:09:28,550 --> 00:09:30,640 Noget længere end 16 tegn. 210 00:09:30,640 --> 00:09:32,020 Og faktisk kan vi være lidt mere præcis. 211 00:09:32,020 --> 00:09:36,540 Noget længere end 15 tegn, fordi vi virkelig har brug for at huske på 212 00:09:36,540 --> 00:09:39,920 at vi har brug at backslash nul implicit ved slutningen af ​​strengen, 213 00:09:39,920 --> 00:09:42,950 der er en mands scanf vil typisk tage sig af os. 214 00:09:42,950 --> 00:09:46,210 >> Så lad mig gøre noget lignende - 215 00:09:46,210 --> 00:09:48,040 Nogle gange kan vi bare overlade det sådan. 216 00:09:48,040 --> 00:09:50,630 OK, så vi har nu fremkaldt vores segmentering skyld. 217 00:09:50,630 --> 00:09:51,000 Hvorfor? 218 00:09:51,000 --> 00:09:54,940 Fordi jeg har skrevet til mere end 15 figurer, og så vi har faktisk 219 00:09:54,940 --> 00:09:58,280 rørt hukommelse, at jeg faktisk ikke burde have. 220 00:09:58,280 --> 00:10:00,180 >> Så hvad der virkelig løsningen her? 221 00:10:00,180 --> 00:10:02,210 Nå, hvad nu hvis vi har brug for en længere snor? 222 00:10:02,210 --> 00:10:03,960 Nå, vi måske gøre det 32 ​​byte. 223 00:10:03,960 --> 00:10:05,160 Nå, hvad nu hvis det ikke er længe nok? 224 00:10:05,160 --> 00:10:06,040 Hvordan omkring 64 bytes? 225 00:10:06,040 --> 00:10:07,080 Hvad hvis det ikke er længe nok? 226 00:10:07,080 --> 00:10:09,640 Hvordan omkring 128 eller 200 bytes? 227 00:10:09,640 --> 00:10:12,660 Hvad der virkelig er løsningen her i generelle tilfælde, hvis vi ikke kender i 228 00:10:12,660 --> 00:10:14,460 forhånd, hvad brugeren kommer til at skrive? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Det er bare sådan en stor smerte i røven, for at være ærlig, hvilket er grunden til, 231 00:10:23,050 --> 00:10:29,050 CS50 bibliotek har et par dusin linjer kode, der kollektivt gennemføre 232 00:10:29,050 --> 00:10:32,390 GetString snor på en måde, at vi ikke nødt til at vide på forhånd, hvad 233 00:10:32,390 --> 00:10:33,430 brugeren kommer til at skrive. 234 00:10:33,430 --> 00:10:37,370 Især, hvis du ser tilbage på cs50.c fra to uger siden, vil du se 235 00:10:37,370 --> 00:10:40,480 at getString faktisk gør ikke bruge scanf på denne måde. 236 00:10:40,480 --> 00:10:43,720 Snarere det lyder ét tegn på et tidspunkt. 237 00:10:43,720 --> 00:10:46,010 >> Fordi én god ting ved læse en karakter er, vi kan 238 00:10:46,010 --> 00:10:48,490 garantere os til altid have mindst én char. 239 00:10:48,490 --> 00:10:51,740 Jeg kan bare erklære en char, og derefter tage disse virkelig baby skridt til bare 240 00:10:51,740 --> 00:10:54,380 læse en character ind på en tid fra tastaturet. 241 00:10:54,380 --> 00:10:58,240 Og så, hvad du vil se getString gør, er hver gang den løber tør for, 242 00:10:58,240 --> 00:11:02,280 siger 16 bytes af hukommelse, det bruger malloc eller en fætter deraf, 243 00:11:02,280 --> 00:11:06,810 allokere mere hukommelse, kopierer det gamle hukommelse i den nye, og så kravler 244 00:11:06,810 --> 00:11:09,900 sammen, at få et tegn ad gangen, og når det løber ud af det 245 00:11:09,900 --> 00:11:13,370 luns af hukommelse, kaster det væk, gribere en større bid af hukommelse, kopierer gamle 246 00:11:13,370 --> 00:11:14,750 i nye og gentagelser. 247 00:11:14,750 --> 00:11:18,480 Og det er virkelig en smerte til rent faktisk at gennemføre noget så simpelt som 248 00:11:18,480 --> 00:11:19,710 få input fra en bruger. 249 00:11:19,710 --> 00:11:21,090 >> Så du kan bruge scanf. 250 00:11:21,090 --> 00:11:22,430 Du kan bruge andre lignende funktioner. 251 00:11:22,430 --> 00:11:25,420 Og en masse lærebøger og online eksempler gør, men de er alle 252 00:11:25,420 --> 00:11:27,210 sårbare over for problemer som dette. 253 00:11:27,210 --> 00:11:29,550 Og i sidste ende, at få en segfault er slags irriterende. 254 00:11:29,550 --> 00:11:30,680 Det er ikke godt for brugeren. 255 00:11:30,680 --> 00:11:33,560 >> Men i værste fald gør hvad det fundamentalt sætte din 256 00:11:33,560 --> 00:11:37,160 kode med risiko for? 257 00:11:37,160 --> 00:11:39,250 En slags angreb, potentielt. 258 00:11:39,250 --> 00:11:41,680 Vi talte om en sådan angreb - overfyldte stakken. 259 00:11:41,680 --> 00:11:44,660 Men generelt, hvis du får lov til at overflow en buffer, ligesom vi gjorde en 260 00:11:44,660 --> 00:11:48,070 par uger siden, med blot at skrive mere end "hej" på stakken, du 261 00:11:48,070 --> 00:11:52,330 kan faktisk tage over et potentielt computer, eller i det mindste komme på data, 262 00:11:52,330 --> 00:11:53,510 ikke tilhører dig. 263 00:11:53,510 --> 00:11:55,970 >> Så kort, er det derfor, vi har disse støttehjul. 264 00:11:55,970 --> 00:11:59,090 Men nu begynder vi at tage dem af, som vores programmer ikke længere har brug for, 265 00:11:59,090 --> 00:12:00,610 nødvendigvis, input fra brugeren. 266 00:12:00,610 --> 00:12:03,960 Men i tilfælde af problemet sæt seks, dit input kommer fra en enorm 267 00:12:03,960 --> 00:12:07,520 ordbog fil med 150 nogle ulige tusind ord. 268 00:12:07,520 --> 00:12:10,330 >> Så du behøver ikke at bekymre sig om brugerens vilkårlige input. 269 00:12:10,330 --> 00:12:13,720 Vi vil give dig nogle antagelser om den pågældende fil. 270 00:12:13,720 --> 00:12:20,340 Eventuelle spørgsmål vedrørende pointers eller scanf eller input fra brugeren i almindelighed? 271 00:12:20,340 --> 00:12:24,450 >> Okay, så et hurtigt kig derefter på en efterstillede emne fra to uger siden. 272 00:12:24,450 --> 00:12:28,590 Og det var denne forestilling om en struct. 273 00:12:28,590 --> 00:12:34,180 Ikke at - det begrebet struct, hvilket var, hvad? 274 00:12:34,180 --> 00:12:35,430 Hvad gjorde struct gøre for os? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Definer - 277 00:12:39,860 --> 00:12:41,710 ked af det? 278 00:12:41,710 --> 00:12:42,820 Definer en variabel type. 279 00:12:42,820 --> 00:12:44,410 Så sortere i. 280 00:12:44,410 --> 00:12:46,180 Vi er faktisk kombinere to emner. 281 00:12:46,180 --> 00:12:49,510 Så med typedef, minde om, at vi kan erklære en type af vores egne, ligesom en 282 00:12:49,510 --> 00:12:51,500 synonym ligesom streng for char *. 283 00:12:51,500 --> 00:12:56,200 Men ved hjælp af typedef og struct, kan vi skabe virkelig vores egne datastrukturer. 284 00:12:56,200 --> 00:12:59,600 >> For eksempel ind, hvis jeg gå tilbage gedit her for blot et øjeblik, og jeg går videre 285 00:12:59,600 --> 00:13:08,230 og gøre noget lignende, så lad mig spare dette som, lad os sige, structs.c 286 00:13:08,230 --> 00:13:10,840 midlertidigt, jeg bare at gå videre og medtage 287 00:13:10,840 --> 00:13:14,360 standardio.h, int main tomrum. 288 00:13:14,360 --> 00:13:18,960 Og så her antage, at jeg vil at skrive et program, der gemmer 289 00:13:18,960 --> 00:13:21,840 flere studerende fra flere huse, f.eks. 290 00:13:21,840 --> 00:13:24,430 Så det er ligesom en registrarial database af en slags. 291 00:13:24,430 --> 00:13:29,550 >> Så hvis jeg har brug for navnet én studerende, jeg kunne gøre noget lignende char * navn, 292 00:13:29,550 --> 00:13:31,570 og jeg vil gøre noget lignende - 293 00:13:31,570 --> 00:13:34,410 faktisk, lad os bruge CS50 biblioteket for bare et øjeblik at gøre dette til en 294 00:13:34,410 --> 00:13:38,380 lidt enklere, så vi kan låne dem dusinvis af linjer kode. 295 00:13:38,380 --> 00:13:39,340 Og lad os bare holde det simpelt. 296 00:13:39,340 --> 00:13:42,610 Vi vil holde det streng, og nu getString. 297 00:13:42,610 --> 00:13:47,420 >> Så jeg hævder nu, at jeg har gemt navnet for nogle studerende, og huset af 298 00:13:47,420 --> 00:13:50,240 nogle studerende, blot at bruge variabler ligesom vi gjorde og i uge et. 299 00:13:50,240 --> 00:13:52,370 Men formoder jeg nu ønsker at understøtte flere studerende. 300 00:13:52,370 --> 00:13:58,460 Okay, så mine instinkter er at gøre string name2, får getString, string 301 00:13:58,460 --> 00:14:01,370 house2 får getString. 302 00:14:01,370 --> 00:14:05,850 Og så vores tredje elev, lad os gøre NAME3 getString. 303 00:14:05,850 --> 00:14:09,170 >> Okay, så det er forhåbentlig slående dig som en slags dum, 304 00:14:09,170 --> 00:14:11,580 fordi denne proces virkelig aldrig er kommer til at ende, og det er bare at 305 00:14:11,580 --> 00:14:13,130 gøre min kode se værre og værre og værre. 306 00:14:13,130 --> 00:14:14,810 Men vi løst dette også i uge to. 307 00:14:14,810 --> 00:14:19,450 Hvad var vores relativt rene løsning når vi havde flere variabler i 308 00:14:19,450 --> 00:14:23,580 samme datatype, der alle er relateret, men vi ikke ønsker, at denne grusomme rod 309 00:14:23,580 --> 00:14:26,870 af tilsvarende navngivne variabler? 310 00:14:26,870 --> 00:14:30,060 Hvad gjorde vi i stedet? 311 00:14:30,060 --> 00:14:31,260 >> Så jeg tror jeg hørte et par steder. 312 00:14:31,260 --> 00:14:32,590 Vi havde en matrix. 313 00:14:32,590 --> 00:14:37,110 Hvis du vil have flere forekomster af noget, hvorfor vi ikke rense det hele 314 00:14:37,110 --> 00:14:39,540 op og bare sige, giv mig vifte kaldet navne? 315 00:14:39,540 --> 00:14:41,640 >> Og for nu, lad os hårdt kode 3.. 316 00:14:41,640 --> 00:14:44,450 Og derefter give mig en anden matrix kaldet huse, og lad mig for 317 00:14:44,450 --> 00:14:45,800 nu hårdt kode 3.. 318 00:14:45,800 --> 00:14:49,220 Og jeg har massivt ryddet op i rod, at jeg lige har oprettet. 319 00:14:49,220 --> 00:14:52,400 Nu har jeg stadig svært kodet 3, men selv 3 kunne dynamisk komme fra 320 00:14:52,400 --> 00:14:54,350 bruger, eller argv eller lignende. 321 00:14:54,350 --> 00:14:55,720 Så dette er allerede renere. 322 00:14:55,720 --> 00:15:00,100 >> Men hvad er irriterende ved dette er, at nu, selv om et navn eller anden måde 323 00:15:00,100 --> 00:15:02,280 fundamentalt knyttet til en studerendes hus - 324 00:15:02,280 --> 00:15:04,720 Det er en studerende, som jeg virkelig ønsker at repræsentere - 325 00:15:04,720 --> 00:15:08,080 Jeg har nu to arrays, der er parallelle i den forstand at de er de 326 00:15:08,080 --> 00:15:13,930 samme størrelse og navne beslag 0 formentlig kort til huse beslag 0, 327 00:15:13,930 --> 00:15:16,600 og navne Bracket 1 maps til huse beslag 1. 328 00:15:16,600 --> 00:15:19,280 Med andre ord, liv, studerende i det hus, og at anden elev 329 00:15:19,280 --> 00:15:20,530 bor i det andet hus. 330 00:15:20,530 --> 00:15:23,720 Men sikkert det kunne være gøres endnu mere rent. 331 00:15:23,720 --> 00:15:24,990 >> Tja, det kan, i virkeligheden. 332 00:15:24,990 --> 00:15:28,730 Og lad mig gå videre og åbne up structs.h, og du vil 333 00:15:28,730 --> 00:15:31,130 se denne idé her. 334 00:15:31,130 --> 00:15:34,905 Bemærk, at jeg har brugt typedef, som du hentydede til for et øjeblik siden at erklære vores 335 00:15:34,905 --> 00:15:35,570 egen datatype. 336 00:15:35,570 --> 00:15:39,660 Men jeg bruger også dette andet søgeord kaldet struct som giver mig en ny 337 00:15:39,660 --> 00:15:40,790 datastruktur. 338 00:15:40,790 --> 00:15:43,980 >> Og dette datastruktur Jeg hævder går at have to ting indersiden af 339 00:15:43,980 --> 00:15:47,060 det - en streng kaldet navn, og en streng kaldet hus. 340 00:15:47,060 --> 00:15:49,820 Og det navn, jeg har tænkt mig at give til dette datastruktur går 341 00:15:49,820 --> 00:15:51,005 at blive kaldt elev. 342 00:15:51,005 --> 00:15:54,030 Jeg kunne kalde det noget, jeg vil, men dette semantisk gøre 343 00:15:54,030 --> 00:15:55,810 mening for mig i mit sind. 344 00:15:55,810 --> 00:15:59,160 >> Så nu, hvis jeg åbner en bedre version af det program, jeg begyndte at skrive 345 00:15:59,160 --> 00:16:00,390 der, lad mig rulle til toppen. 346 00:16:00,390 --> 00:16:03,190 Og der er nogle flere linjer kode her, men lad mig fokusere for 347 00:16:03,190 --> 00:16:04,160 øjeblikket på én. 348 00:16:04,160 --> 00:16:07,790 Jeg har erklæret en konstant kaldet studerende og hårdt kodet 3 for nu. 349 00:16:07,790 --> 00:16:11,110 Men nu mærke til, hvordan ren min kode begynder at få. 350 00:16:11,110 --> 00:16:15,030 >> På linje 22, erklærer jeg vifte af studerende. 351 00:16:15,030 --> 00:16:18,760 Og læg mærke til, at studerende er tilsyneladende nu er en datatype. 352 00:16:18,760 --> 00:16:23,360 Fordi i toppen af ​​denne fil, mærke Jeg har medtaget denne header fil 353 00:16:23,360 --> 00:16:24,820 at jeg trak op bare for et øjeblik siden. 354 00:16:24,820 --> 00:16:28,820 Og det header fil simpelthen havde denne definition af en studerende. 355 00:16:28,820 --> 00:16:32,470 >> Så nu har jeg oprettet mine egne brugerdefinerede data typen, at forfatterne af C-år 356 00:16:32,470 --> 00:16:33,890 siden ikke tænke på i forvejen. 357 00:16:33,890 --> 00:16:34,570 Men ikke noget problem. 358 00:16:34,570 --> 00:16:35,870 Jeg kan gøre det selv. 359 00:16:35,870 --> 00:16:39,050 Så dette er en matrix kaldes studerende hver af hvis medlemmer 360 00:16:39,050 --> 00:16:41,100 er studerende struktur. 361 00:16:41,100 --> 00:16:44,270 Og jeg vil have tre af disse i array. 362 00:16:44,270 --> 00:16:46,030 >> Og nu, hvad gør resten af dette program gøre? 363 00:16:46,030 --> 00:16:47,550 Jeg havde brug for noget lidt vilkårlig. 364 00:16:47,550 --> 00:16:51,450 Så fra online 24 og fremefter, Jeg gentage fra 0 til 3. 365 00:16:51,450 --> 00:16:54,000 Jeg derefter bede brugeren om elevens navn. 366 00:16:54,000 --> 00:16:56,110 Og så har jeg bruger getString som før. 367 00:16:56,110 --> 00:16:59,410 Så jeg beder om den studerendes hus, og jeg bruger getString som før. 368 00:16:59,410 --> 00:17:01,780 >> Men varsel - lidt nyt stykke syntaks - 369 00:17:01,780 --> 00:17:07,010 Jeg kan stadig indeks til i'te student, men hvordan får jeg på specifikke data 370 00:17:07,010 --> 00:17:08,354 felt inde i struct? 371 00:17:08,354 --> 00:17:11,770 Jamen, hvad er tilsyneladende nyt stykke syntaks? 372 00:17:11,770 --> 00:17:13,339 Det er bare dot operatør. 373 00:17:13,339 --> 00:17:14,510 >> Vi har ikke rigtig set det før. 374 00:17:14,510 --> 00:17:17,819 Du har set det i Pset fem, hvis du har investerer allerede med bitmap-filer. 375 00:17:17,819 --> 00:17:22,372 Men prik betyder bare på indersiden af ​​dette struct eller flere felter, giver dot 376 00:17:22,372 --> 00:17:24,510 navn, eller give mig dot hus. 377 00:17:24,510 --> 00:17:28,690 Det betyder gå inde i struct og få disse særlige områder. 378 00:17:28,690 --> 00:17:30,200 >> Hvad resten af ​​dette program gøre? 379 00:17:30,200 --> 00:17:31,190 Det er ikke alle, der sexet. 380 00:17:31,190 --> 00:17:34,640 Bemærk, at jeg gentage fra 0 til 3 igen, og jeg blot oprette en engelsk 381 00:17:34,640 --> 00:17:40,500 sætning som så og så er i en sådan, og et sådant hus, der passerer i dot navn fra 382 00:17:40,500 --> 00:17:43,320 det i'te studerende og deres huset så godt. 383 00:17:43,320 --> 00:17:47,560 >> Og så endelig, nu skal vi begynde at få anal om dette, nu hvor vi er 384 00:17:47,560 --> 00:17:49,580 fortrolig med, hvad malloc og andre funktioner har været 385 00:17:49,580 --> 00:17:50,570 gør alt dette tidspunkt. 386 00:17:50,570 --> 00:17:54,220 Hvorfor skal jeg nødt til at frigøre både navn og hus, selvom jeg 387 00:17:54,220 --> 00:17:56,960 ikke kalde malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString gjorde. 389 00:17:58,020 --> 00:18:00,930 Og det var beskidte lille hemmelighed for flere uger, men getString har 390 00:18:00,930 --> 00:18:03,530 været utætte hukommelse hele placere alle semester hidtil. 391 00:18:03,530 --> 00:18:05,990 Og Valgrand vil endelig afsløre dette til os. 392 00:18:05,990 --> 00:18:10,730 >> Men det er ikke en big deal, fordi jeg kender at jeg simpelthen kan frigøre navnet 393 00:18:10,730 --> 00:18:15,750 og huset, men teknisk, være super, super sikker, bør jeg være 394 00:18:15,750 --> 00:18:17,890 laver nogle fejlkontrol her. 395 00:18:17,890 --> 00:18:19,040 Hvad er dine instinkter fortæller dig? 396 00:18:19,040 --> 00:18:22,480 Hvad skal jeg være kontrol for før jeg frigøre hvad er en 397 00:18:22,480 --> 00:18:25,470 string, alias som en char *? 398 00:18:25,470 --> 00:18:33,460 >> Jeg skal virkelig være kontrol, hvis de studerende beslag i dot navn ikke 399 00:18:33,460 --> 00:18:34,840 lige null. 400 00:18:34,840 --> 00:18:40,400 Så det vil være OK at gå videre og fri denne pegepind, og samme eller anden 401 00:18:40,400 --> 00:18:41,160 en så godt. 402 00:18:41,160 --> 00:18:46,860 Hvis eleverne beslag jeg dot hus ikke er svarende til null, det nu vil beskytte 403 00:18:46,860 --> 00:18:52,520 mod hjørnet tilfælde, hvor GetString returnerer noget som null. 404 00:18:52,520 --> 00:18:57,310 Og vi så et øjeblik siden, printf vil beskytte os op her ved blot at sige 405 00:18:57,310 --> 00:18:58,990 null, som er kommer til at se underligt. 406 00:18:58,990 --> 00:19:02,340 Men i det mindste vil det ikke segfault, som vi har set. 407 00:19:02,340 --> 00:19:05,990 >> Nå, lad mig gøre en anden ting her. structs-0 er lidt af en dum program 408 00:19:05,990 --> 00:19:09,700 fordi jeg indtaste alle disse data, og derefter det er tabt, når programmet slutter. 409 00:19:09,700 --> 00:19:10,940 Men lad mig gå videre og gøre det. 410 00:19:10,940 --> 00:19:12,830 Lad mig gøre terminalen Vinduet lidt større. 411 00:19:12,830 --> 00:19:17,000 Lad mig gøre structs-1, som er en ny version af denne. 412 00:19:17,000 --> 00:19:18,520 >> Jeg zoome ind en lille smule. 413 00:19:18,520 --> 00:19:21,620 Og lad mig nu køre dot slash structs -1. 414 00:19:21,620 --> 00:19:22,590 Studerendes navn - 415 00:19:22,590 --> 00:19:31,500 David Mather, lad os gøre Rob Kirkland, lad os gøre Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Det interessante er nu varsel - 417 00:19:33,650 --> 00:19:35,540 og jeg kender kun dette, fordi Jeg skrev programmet - 418 00:19:35,540 --> 00:19:38,930 der er en fil nu på min nuværende mappe kaldet students.csv. 419 00:19:38,930 --> 00:19:40,420 Nogle af jer har måske set disse i den virkelige verden. 420 00:19:40,420 --> 00:19:42,980 >> Hvad er en CSV-fil? 421 00:19:42,980 --> 00:19:44,170 Kommasepareret værdier. 422 00:19:44,170 --> 00:19:46,670 Det er lidt ligesom en fattig mands version af en Excel-fil. 423 00:19:46,670 --> 00:19:50,580 Det er en tabel over rækker og kolonner, du kan åbne i et program som Excel, 424 00:19:50,580 --> 00:19:51,800 eller tal på en Mac. 425 00:19:51,800 --> 00:19:55,180 >> Og hvis jeg åbner denne fil her på gedit, varsel - og tallene er der ikke. 426 00:19:55,180 --> 00:19:57,360 Det er bare gedit fortælle mig linjenumre. 427 00:19:57,360 --> 00:19:59,740 Meddelelse om den første linje i denne fil er David og Mather. 428 00:19:59,740 --> 00:20:01,450 Den næste linie er Rob komma Kirkland. 429 00:20:01,450 --> 00:20:04,170 Og den tredje linje er Lauren komma Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Så hvad har jeg lavet? 431 00:20:05,480 --> 00:20:09,580 Jeg har nu skrevet et C-program, der effektivt kan generere regneark 432 00:20:09,580 --> 00:20:11,840 der kan åbnes i en program som Excel. 433 00:20:11,840 --> 00:20:15,520 Ikke alt, overbevisende et datasæt, men hvis du har meget større bidder af 434 00:20:15,520 --> 00:20:18,440 data, som du rent faktisk ønsker at manipulere og gøre grafer i og 435 00:20:18,440 --> 00:20:21,260 gerne, det er måske en måde at skabe disse data. 436 00:20:21,260 --> 00:20:25,370 Desuden CSVs er faktisk super fælles bare til opbevaring simple data - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, for eksempel, hvis du får aktiekurser via deres såkaldte 438 00:20:28,940 --> 00:20:33,180 API, den gratis service, der lader dig få strøm up-to-the-date lager 439 00:20:33,180 --> 00:20:35,650 citater for virksomhederne, at de giver dataene tilbage i 440 00:20:35,650 --> 00:20:37,800 super enkel CSV-format. 441 00:20:37,800 --> 00:20:39,380 >> Så hvordan har vi det? 442 00:20:39,380 --> 00:20:42,530 Nå mærke, de fleste af programmets næsten den samme. 443 00:20:42,530 --> 00:20:46,870 Men bemærk hernede, snarere end print de studerende ud, på linie 35 444 00:20:46,870 --> 00:20:51,040 fremefter, jeg hævder, at jeg gemmer studerende til disk, så gemmer en fil. 445 00:20:51,040 --> 00:20:53,630 >> Så opdager jeg erklære en fil * - 446 00:20:53,630 --> 00:20:57,260 nu det er lidt af en anomali i C. Uanset årsagen, er FIL alle caps, 447 00:20:57,260 --> 00:21:00,690 som ikke er som de fleste andre datatyper i C. Men det er en indbygget 448 00:21:00,690 --> 00:21:02,320 datatype, FILE *. 449 00:21:02,320 --> 00:21:05,900 Og jeg erklære en pointer til en fil, er, hvordan du kan tænke på det. 450 00:21:05,900 --> 00:21:08,070 >> fopen betyder åben fil. 451 00:21:08,070 --> 00:21:09,470 Hvilken fil du ønsker at åbne? 452 00:21:09,470 --> 00:21:12,620 Jeg ønsker at åbne en fil, som jeg vil vilkårligt kalder students.csv. 453 00:21:12,620 --> 00:21:14,480 Jeg kunne kalde det hvad jeg vil. 454 00:21:14,480 --> 00:21:15,200 >> Og derefter tage et gæt. 455 00:21:15,200 --> 00:21:18,960 Hvad det andet argument til fopen formentlig betyde? 456 00:21:18,960 --> 00:21:21,480 Right, w for write, kunne være r for læsning. 457 00:21:21,480 --> 00:21:24,120 Der er en for append hvis du ønsker at tilføje rækker og ikke 458 00:21:24,120 --> 00:21:25,200 overskrive det hele. 459 00:21:25,200 --> 00:21:28,005 >> Men jeg ønsker blot at oprette denne fil én gang, så jeg vil bruge citat citat slut w. 460 00:21:28,005 --> 00:21:31,880 Og jeg ved, at kun fra at have læst dokumentationen eller manden siden. 461 00:21:31,880 --> 00:21:35,100 Hvis filen ikke er nul - med andre ord, Hvis intet gik galt - 462 00:21:35,100 --> 00:21:37,820 lad mig gentage over for studerende fra 0 til 3. 463 00:21:37,820 --> 00:21:40,410 >> Og nu mærke til at der er noget nogensinde så lidt anderledes 464 00:21:40,410 --> 00:21:42,110 om linje 41 her. 465 00:21:42,110 --> 00:21:42,960 Det er ikke printf. 466 00:21:42,960 --> 00:21:46,530 Det er fprintf til fil-printf. 467 00:21:46,530 --> 00:21:47,790 Så det kommer til at skrive til filen. 468 00:21:47,790 --> 00:21:48,860 Hvilken fil? 469 00:21:48,860 --> 00:21:53,630 Den ene, hvis pointer du angiver som det første argument. 470 00:21:53,630 --> 00:21:55,940 >> Så kan vi angive et format streng. 471 00:21:55,940 --> 00:21:59,660 Så kan vi angive, hvilken snor, vi ønsker at plug in for første procent s, og 472 00:21:59,660 --> 00:22:04,320 derefter en anden variabel eller den anden procent sek. 473 00:22:04,320 --> 00:22:06,760 Så vi lukker filen med fclose. 474 00:22:06,760 --> 00:22:09,380 End jeg frigøre hukommelse som før, selv om Jeg skulle gå tilbage og tilføje 475 00:22:09,380 --> 00:22:10,540 nogle kontroller for null. 476 00:22:10,540 --> 00:22:12,090 >> Og det er det. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose giver mig evne til at skabe tekstfiler. 478 00:22:16,960 --> 00:22:19,640 Nu vil du se i opgavesæt fem, som involverer billeder, du skal bruge 479 00:22:19,640 --> 00:22:20,990 binære filer i stedet. 480 00:22:20,990 --> 00:22:24,200 Men fundamentalt, ideen er den samme, selvom de funktioner, du 481 00:22:24,200 --> 00:22:28,710 se er en lille smule anderledes. 482 00:22:28,710 --> 00:22:32,580 >> Så hvirvelvind tur, men du vil få alt for bekendt med filen I/O-- 483 00:22:32,580 --> 00:22:34,960 indgang og udgang - med Pset fem. 484 00:22:34,960 --> 00:22:38,607 Og eventuelle spørgsmål om indledende grundlæggende her? 485 00:22:38,607 --> 00:22:39,857 Ja? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Hvad hvis du forsøger at frigøre en null værdi? 488 00:22:43,710 --> 00:22:48,880 Jeg tror, ​​med mindre fri har fået et lidt mere brugervenlig, kan du 489 00:22:48,880 --> 00:22:49,890 potentielt segfault. 490 00:22:49,890 --> 00:22:54,160 Passing det null er dårligt, fordi jeg ikke gør tror fri generer at tjekke for dig, 491 00:22:54,160 --> 00:22:57,330 fordi det potentielt ville være et spild af tid for det at gøre sig selv til 492 00:22:57,330 --> 00:22:59,022 alle i verden. 493 00:22:59,022 --> 00:23:00,590 Godt spørgsmål, selv om. 494 00:23:00,590 --> 00:23:04,300 >> Okay, så denne form for får os til et interessant emne. 495 00:23:04,300 --> 00:23:07,010 Temaet for problemet sæt fem er retsvidenskab. 496 00:23:07,010 --> 00:23:08,420 Mindst det er en del af problemet sættet. 497 00:23:08,420 --> 00:23:12,030 Retsvidenskab generelt refererer til inddrivelse af oplysninger, der kan eller 498 00:23:12,030 --> 00:23:14,110 måske ikke er blevet slettet bevidst. 499 00:23:14,110 --> 00:23:18,680 Og så tænkte jeg ville give dig en hurtig forsmag på, hvad der virkelig foregår hele 500 00:23:18,680 --> 00:23:21,230 denne gang under kølerhjelmen af ​​din computer. 501 00:23:21,230 --> 00:23:23,960 >> For eksempel af, hvis du har inde i din bærbare eller din stationære computer en 502 00:23:23,960 --> 00:23:28,040 harddisk, er det enten en mekanisk enhed, der faktisk spins - 503 00:23:28,040 --> 00:23:31,650 der er cirkulære ting kaldet fade der ser helt lide, hvad jeg 504 00:23:31,650 --> 00:23:34,540 lige haft op på skærmen her, selvom det i stigende grad gamle skole. 505 00:23:34,540 --> 00:23:37,370 Dette er en tre-og-en-halv-tomme harddisk. 506 00:23:37,370 --> 00:23:40,070 Og tre og en halv inches refererer til med den ting, når du installerer det 507 00:23:40,070 --> 00:23:40,890 i en computer. 508 00:23:40,890 --> 00:23:44,890 >> Mange af jer fyre i din bærbare nu har solid state-drev, eller SSD'er, 509 00:23:44,890 --> 00:23:46,260 som ikke har nogen bevægelige dele. 510 00:23:46,260 --> 00:23:49,170 De er mere som RAM og mindre som disse mekaniske anordninger. 511 00:23:49,170 --> 00:23:51,450 Men ideerne er stadig de samme, sikkert, som de vedrører 512 00:23:51,450 --> 00:23:52,790 til problemet sæt fem. 513 00:23:52,790 --> 00:23:57,400 >> Og hvis du tænker over nu en harddisk repræsenterer være en cirkel, som 514 00:23:57,400 --> 00:23:58,930 Jeg vil tegne som dette her. 515 00:23:58,930 --> 00:24:02,290 Når du opretter en fil på din computer, om det er en SSD, eller 516 00:24:02,290 --> 00:24:06,610 dette tilfælde en ældre skole harddisk, filen indeholder flere bits. 517 00:24:06,610 --> 00:24:10,510 Lad os sige, at det er denne 0 og 1, en hel masse 0'er og 1-taller. 518 00:24:10,510 --> 00:24:11,660 Så dette er mit hele harddisken. 519 00:24:11,660 --> 00:24:13,225 Det er tilsyneladende en temmelig stor fil. 520 00:24:13,225 --> 00:24:18,080 Og det er ved hjælp op 0'er og 1-taller på det del af den fysiske plade. 521 00:24:18,080 --> 00:24:19,750 >> Nå, hvad er det fysiske del? 522 00:24:19,750 --> 00:24:25,310 Tja, det viser sig, at på en harddisk, mindst af denne type, er der 523 00:24:25,310 --> 00:24:27,340 disse bittesmå magnetiske partikler. 524 00:24:27,340 --> 00:24:32,630 Og de har i det væsentlige mod nord og sydpoler til dem, så at hvis du 525 00:24:32,630 --> 00:24:35,710 vende en af ​​disse magnetiske partikler denne måde, kan man sige, at det er 526 00:24:35,710 --> 00:24:36,720 repræsenterer en 1. 527 00:24:36,720 --> 00:24:39,340 Og hvis det er hovedet syd til nord, kan man sige, at det er 528 00:24:39,340 --> 00:24:40,390 repræsenterer et 0. 529 00:24:40,390 --> 00:24:43,660 >> Så i den virkelige fysiske verden, er der hvordan du kan repræsentere noget i 530 00:24:43,660 --> 00:24:45,670 binær tilstand 0 og 1. 531 00:24:45,670 --> 00:24:46,720 Så det hele er en fil er. 532 00:24:46,720 --> 00:24:49,300 Der er en hel flok af magnetisk partikler, som er deres denne måde eller 533 00:24:49,300 --> 00:24:51,920 På denne måde skaber mønstre af 0'er og 1-taller. 534 00:24:51,920 --> 00:24:56,760 >> Men det viser sig, når du gemmer en fil, nogle oplysninger gemmes separat. 535 00:24:56,760 --> 00:25:00,000 Så dette er en lille tabel, en mappe, så at sige. 536 00:25:00,000 --> 00:25:05,810 Og jeg vil kalde denne kolonne navn, og Jeg ringer denne kolonne placering. 537 00:25:05,810 --> 00:25:08,850 >> Og jeg har tænkt mig at sige, formoder dette er mit CV. 538 00:25:08,850 --> 00:25:14,050 Min resume.doc opbevares ved placering, lad os sige 123. 539 00:25:14,050 --> 00:25:15,390 Jeg går altid efter det nummer. 540 00:25:15,390 --> 00:25:18,810 Men er det tilstrækkeligt at sige, at ligesom i RAM, kan du tage en harddisk 541 00:25:18,810 --> 00:25:22,350 Det er en gigabyte eller 200 gigabyte eller en terabyte, og du kan 542 00:25:22,350 --> 00:25:23,750 antal alle bytes. 543 00:25:23,750 --> 00:25:26,480 Du kan tælle alle bidder af 8 bit. 544 00:25:26,480 --> 00:25:29,030 >> Så vi vil sige, at dette er placering 123.. 545 00:25:29,030 --> 00:25:32,070 Så denne mappe inde i mit operativsystem Systemet husker, at min 546 00:25:32,070 --> 00:25:34,250 cv er på location 123. 547 00:25:34,250 --> 00:25:36,850 Men det bliver interessant, når du sletter en fil. 548 00:25:36,850 --> 00:25:37,820 >> Så for eksempel - 549 00:25:37,820 --> 00:25:40,790 og heldigvis, det meste af verden har fanget på det - hvad der sker, når 550 00:25:40,790 --> 00:25:45,040 du trækker en fil til din Mac OS Trash eller din Windows-papirkurven? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Hvad er formålet med at gøre det? 553 00:25:50,510 --> 00:25:53,860 Det er selvfølgelig for at slippe af filen, men hvad betyder den handling at trække og 554 00:25:53,860 --> 00:25:57,550 slippe ind i din papirkurv eller din Papirkurven gøre på en computer? 555 00:25:57,550 --> 00:25:59,230 >> Absolut intet, virkelig. 556 00:25:59,230 --> 00:26:00,320 Det er ligesom en mappe. 557 00:26:00,320 --> 00:26:01,800 Det er en særlig mappe, for at være sikker. 558 00:26:01,800 --> 00:26:04,460 Men betyder det egentlig slette filen? 559 00:26:04,460 --> 00:26:06,780 >> Nå, nej, fordi nogle af jer sikkert have været ligesom, oh damn, du gjorde ikke 560 00:26:06,780 --> 00:26:07,420 betyder at gøre det. 561 00:26:07,420 --> 00:26:09,130 Så du dobbeltklikke på Papirkurv eller papirkurven. 562 00:26:09,130 --> 00:26:11,630 Du har prikkede rundt og du har genvundet filen ved blot at trække det 563 00:26:11,630 --> 00:26:12,110 ud derfra. 564 00:26:12,110 --> 00:26:14,420 Så klart, det er ikke nødvendigvis at slette det. 565 00:26:14,420 --> 00:26:15,990 >> OK, du er klogere end som så. 566 00:26:15,990 --> 00:26:18,860 Du ved, at bare trække det ind i Papirkurv eller papirkurven betyder ikke 567 00:26:18,860 --> 00:26:19,930 du tømme papirkurven. 568 00:26:19,930 --> 00:26:24,110 Så du gå op til menuen, og du siger Tøm papirkurv eller Tøm papirkurv. 569 00:26:24,110 --> 00:26:25,360 Så hvad sker der? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Yeah, så det er slettet mere så. 572 00:26:32,530 --> 00:26:37,660 Men alt det der sker, er dette. 573 00:26:37,660 --> 00:26:45,350 Computeren glemmer hvor resume.doc var. 574 00:26:45,350 --> 00:26:47,400 >> Men hvad har ikke ændret sig tilsyneladende i billedet? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 De bits, den 0'er og 1-taller, som jeg hævder er på stedet for nogle fysiske aspekt af 577 00:26:55,570 --> 00:26:56,280 hardware. 578 00:26:56,280 --> 00:26:57,110 De er der stadig. 579 00:26:57,110 --> 00:26:58,930 Det er bare at computeren har glemt, hvad de er. 580 00:26:58,930 --> 00:27:03,160 >> Så det er hovedsageligt befriet filens bits, således at de kan genbruges. 581 00:27:03,160 --> 00:27:06,940 Men ikke før du oprette flere filer, og flere filer, og flere filer 582 00:27:06,940 --> 00:27:12,150 probabilistisk dem, 0'er og 1-taller, disse magnetiske partikler, bliver genbrugt, 583 00:27:12,150 --> 00:27:16,220 upside eller højre side op, for andre filer, 0'er og 1'ere. 584 00:27:16,220 --> 00:27:17,980 >> Så du har dette vindue af tid. 585 00:27:17,980 --> 00:27:19,860 Og det er ikke forudsigelig længde, rigtig. 586 00:27:19,860 --> 00:27:22,240 Det afhænger af størrelsen på din harddisk drev og hvor mange filer du har, og 587 00:27:22,240 --> 00:27:23,490 hvor hurtigt du gøre nye. 588 00:27:23,490 --> 00:27:27,050 Men der er dette vindue af tid i løbet af som denne fil er stadig helt 589 00:27:27,050 --> 00:27:27,770 erstattes. 590 00:27:27,770 --> 00:27:31,050 >> Så hvis du nogensinde bruge programmer som McAfee eller Norton for at forsøge at inddrive 591 00:27:31,050 --> 00:27:35,680 data, er alt de laver forsøger at genvinde denne såkaldte mappe til 592 00:27:35,680 --> 00:27:37,340 regne ud, hvor din fil var. 593 00:27:37,340 --> 00:27:40,605 Og nogle gange Norton og vil sige, fil er 93% erstattes. 594 00:27:40,605 --> 00:27:42,020 Nå, hvad betyder det? 595 00:27:42,020 --> 00:27:45,690 Det betyder blot, at en anden fil tilfældigvis endte med at bruge, siger, 596 00:27:45,690 --> 00:27:48,920 disse bits ud af din oprindelige fil. 597 00:27:48,920 --> 00:27:51,950 >> Så hvad der rent faktisk er involveret i at inddrive data? 598 00:27:51,950 --> 00:27:55,720 Tja, hvis du ikke har noget som Norton pre-installeret på din computer, 599 00:27:55,720 --> 00:27:59,510 det bedste du kan sommetider gøre er at kigge på hele harddisken søger 600 00:27:59,510 --> 00:28:00,510 bitmønstre. 601 00:28:00,510 --> 00:28:05,350 Og en af ​​de temaer, opgavesæt fem er, at du vil søge på 602 00:28:05,350 --> 00:28:09,570 svarer til en harddisk, en retsmedicinsk billede af en compact flash kort fra en 603 00:28:09,570 --> 00:28:13,660 digitalt kamera, søger efter den 0'er og 1s der typisk med høj 604 00:28:13,660 --> 00:28:16,720 sandsynlighed, repræsenterer starten af ​​et JPEG-billede. 605 00:28:16,720 --> 00:28:21,120 >> Og du fyre kan genvinde disse billeder ved antager, hvis jeg ser dette mønster af 606 00:28:21,120 --> 00:28:24,380 bits på retsmedicinske billede, med høj sandsynlighed, der markerer 607 00:28:24,380 --> 00:28:25,650 starten på en JPEG. 608 00:28:25,650 --> 00:28:29,520 Og hvis jeg ser det samme mønster igen, som formentlig markerer starten på 609 00:28:29,520 --> 00:28:32,440 anden JPEG og anden JPEG og anden JPEG. 610 00:28:32,440 --> 00:28:34,970 Og det er typisk, hvordan data recovery vil arbejde. 611 00:28:34,970 --> 00:28:37,870 Hvad er rart om JPEG er, selvom filformat selv er noget 612 00:28:37,870 --> 00:28:44,400 komplekse, i begyndelsen af ​​hvert sådant fil er faktisk temmelig identificerbare 613 00:28:44,400 --> 00:28:47,370 og enkle, som du vil se, hvis du ikke allerede har. 614 00:28:47,370 --> 00:28:50,270 >> Så lad os tage et nærmere kig nedenunder hætten, præcis hvad der har været 615 00:28:50,270 --> 00:28:53,360 foregår, og hvad disse 0'er og 1-taller er, for at give dig en smule mere af en 616 00:28:53,360 --> 00:28:55,330 Baggrunden for denne særlige udfordring. 617 00:28:55,330 --> 00:28:55,510 >> [VIDEO AFSPIL] 618 00:28:55,510 --> 00:28:58,700 >> -Hvor din pc gemmer de fleste af dens permanente data. 619 00:28:58,700 --> 00:29:03,390 At gøre det, at dataene rejser fra RAM sammen med software-signaler, der fortæller 620 00:29:03,390 --> 00:29:06,110 harddisken, hvordan man opbevarer disse data. 621 00:29:06,110 --> 00:29:09,410 Harddisken kredsløb oversætte disse signaler til spænding 622 00:29:09,410 --> 00:29:10,870 udsving. 623 00:29:10,870 --> 00:29:14,970 Disse, til gengæld, styre harddiskens bevægelige dele, nogle af de få 624 00:29:14,970 --> 00:29:17,910 bevægelige dele tilbage i moderne computer. 625 00:29:17,910 --> 00:29:22,130 >> Nogle af signaler til styring af en motor der spinder metal-belagte plader. 626 00:29:22,130 --> 00:29:25,470 Dine data er faktisk gemt på disse plader. 627 00:29:25,470 --> 00:29:28,610 Andre signaler flytte læse / skrive hoveder til at læse eller 628 00:29:28,610 --> 00:29:30,710 skrive data på pladerne. 629 00:29:30,710 --> 00:29:35,450 Denne maskine så præcise, at et menneske hår kunne ikke engang passere mellem 630 00:29:35,450 --> 00:29:37,280 hoveder og spinning fade. 631 00:29:37,280 --> 00:29:40,316 Men det hele virker på forrygende hastigheder. 632 00:29:40,316 --> 00:29:40,660 >> [END VIDEOAFSPILNING] 633 00:29:40,660 --> 00:29:42,190 >> DAVID MALAN: Zoom i en lille dybere nu på, hvad der er 634 00:29:42,190 --> 00:29:44,360 faktisk på disse fade. 635 00:29:44,360 --> 00:29:44,720 >> [VIDEO AFSPIL] 636 00:29:44,720 --> 00:29:47,660 >> -Lad os se på, hvad vi lige så i slowmotion. 637 00:29:47,660 --> 00:29:51,710 Når en kort puls af elektricitet er sendt til læse / skrive hovedet, hvis flips 638 00:29:51,710 --> 00:29:54,650 på en lille elektromagnetisk til en brøkdel af et sekund. 639 00:29:54,650 --> 00:29:58,970 Magneten skaber et område, som ændrer polaritet en lille, lille 640 00:29:58,970 --> 00:30:02,850 del af metalpartikler, der coat hver fad overflade. 641 00:30:02,850 --> 00:30:05,940 >> Et mønster serie af disse små, opladet bebyggelse på disken 642 00:30:05,940 --> 00:30:08,470 repræsenterer en enkelt bit af data i det binære tal 643 00:30:08,470 --> 00:30:10,530 system, der anvendes af computere. 644 00:30:10,530 --> 00:30:13,775 Nu, hvis strøm sendes én måde gennem læse / skrive hoved, området 645 00:30:13,775 --> 00:30:15,970 er polariseret i én retning. 646 00:30:15,970 --> 00:30:17,950 Hvis strøm sendes i modsatte retning, den 647 00:30:17,950 --> 00:30:19,930 polarisering vendes. 648 00:30:19,930 --> 00:30:22,370 >> Hvordan du får data fra harddisken? 649 00:30:22,370 --> 00:30:24,090 Bare vende processen. 650 00:30:24,090 --> 00:30:26,550 Så det er partiklerne på disken der får strømmen i 651 00:30:26,550 --> 00:30:27,960 læse / skrive hovedet bevæger sig. 652 00:30:27,960 --> 00:30:30,700 Sammensæt millioner af disse magnetiseret segmenter, og 653 00:30:30,700 --> 00:30:32,160 du har fået en fil. 654 00:30:32,160 --> 00:30:36,060 >> Nu er de stykker af en enkelt fil kan være spredt over en drevets 655 00:30:36,060 --> 00:30:39,970 fade, lidt ligesom det rod af papirer på dit skrivebord. 656 00:30:39,970 --> 00:30:43,500 Så en ekstra fil registrer hvor alt er. 657 00:30:43,500 --> 00:30:45,985 Må ikke du ønsker du havde sådan noget? 658 00:30:45,985 --> 00:30:46,470 >> [END VIDEOAFSPILNING] 659 00:30:46,470 --> 00:30:47,820 >> DAVID MALAN: OK, sandsynligvis ikke. 660 00:30:47,820 --> 00:30:52,070 Så hvor mange af jer voksede op med disse? 661 00:30:52,070 --> 00:30:53,970 OK, så det er færre og færre hænder hvert år. 662 00:30:53,970 --> 00:30:56,550 Men jeg er glad for du er det mindste kender med dem, fordi dette og vores egne 663 00:30:56,550 --> 00:31:00,520 bog demo desværre er ved at dø en meget langsom død her af fortrolighed. 664 00:31:00,520 --> 00:31:04,010 >> Men dette er hvad jeg i det mindste tilbage i high school, brugte brug for backup. 665 00:31:04,010 --> 00:31:08,110 Og det var fantastisk, fordi du kunne gemme 1.4 megabyte på 666 00:31:08,110 --> 00:31:08,930 denne bestemte disk. 667 00:31:08,930 --> 00:31:12,260 Og dette var den høje tæthed versionen, som angivet af HD, der har 668 00:31:12,260 --> 00:31:14,240 betyder før dagens HD-videoer. 669 00:31:14,240 --> 00:31:16,400 >> Standard tæthed var 800 kilobyte. 670 00:31:16,400 --> 00:31:18,640 Og før det var der 400 kilobyte diske. 671 00:31:18,640 --> 00:31:23,120 Og før det var der 5 og 1/4 tommer diske, som var virkelig diskette, 672 00:31:23,120 --> 00:31:25,680 og lidt bredere og højere end disse ting her. 673 00:31:25,680 --> 00:31:29,150 Men du kan faktisk se den såkaldte floppy aspekt af disse diske. 674 00:31:29,150 --> 00:31:32,630 >> Og funktionelt, de er faktisk temmelig ligner harddiske på 675 00:31:32,630 --> 00:31:33,570 mindst denne type. 676 00:31:33,570 --> 00:31:37,270 Igen, SSD'er i nyere computere arbejde lidt anderledes. 677 00:31:37,270 --> 00:31:41,530 Men hvis du flytter den lille metal fanen kan du faktisk se en lille cookie, 678 00:31:41,530 --> 00:31:42,560 eller fad. 679 00:31:42,560 --> 00:31:43,830 >> Det er ikke metal som denne. 680 00:31:43,830 --> 00:31:46,000 Denne ene er faktisk nogle billigere plastmateriale. 681 00:31:46,000 --> 00:31:46,750 Og du kan slags vrikke det. 682 00:31:46,750 --> 00:31:50,310 Og du har trully lige tørres nogle antallet af bits eller magnetiske partikler 683 00:31:50,310 --> 00:31:51,220 fra denne disk. 684 00:31:51,220 --> 00:31:52,710 >> Så heldigvis, der er intet på det. 685 00:31:52,710 --> 00:31:55,790 Hvis den ting der er i vejen - og dække dine øjne og jeres nabo - 686 00:31:55,790 --> 00:31:58,865 kan du bare slags trække dette Hele kappe off sådan. 687 00:31:58,865 --> 00:32:01,900 Men der er en lille fjeder, så vær opmærksom på, at med dine øjne. 688 00:32:01,900 --> 00:32:03,620 Så nu har du virkelig en diskette. 689 00:32:03,620 --> 00:32:07,090 >> Og hvad er bemærkelsesværdigt ved denne er, at i så meget som dette er et 690 00:32:07,090 --> 00:32:10,830 mindre repræsentation af et større harddisk, disse ting er super, 691 00:32:10,830 --> 00:32:11,590 super enkel. 692 00:32:11,590 --> 00:32:15,170 Hvis du knibe bunden af ​​det nu, at metal ting er slukket, og skræl 693 00:32:15,170 --> 00:32:20,990 dem åbne, alle der er, er to stykker filt og den såkaldte diskette 694 00:32:20,990 --> 00:32:22,930 med et stykke metal på indersiden. 695 00:32:22,930 --> 00:32:25,990 >> Og der går halvdelen af min disk indhold. 696 00:32:25,990 --> 00:32:27,540 Der går en anden halvdelen af ​​dem. 697 00:32:27,540 --> 00:32:31,375 Men det er alt, der var spinning inde af din computer på gårsdagens. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> Og igen, for at sætte dette i perspektiv, hvor stor er de fleste af dine 700 00:32:38,310 --> 00:32:39,560 harddiske i disse dage? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 gigabyte, en terabyte, måske i en stationær computer, 2 terabyte, 3 703 00:32:46,230 --> 00:32:47,630 terabytes, 4 terabytes, right? 704 00:32:47,630 --> 00:32:52,480 Dette er en megabyte, give eller tage, der kan ikke engang passe en typisk MP3 705 00:32:52,480 --> 00:32:55,310 længere disse dage, eller nogle lignende musikfil. 706 00:32:55,310 --> 00:32:59,500 >> Så en lille souvenir til dig i dag, og også for at hjælpe kontekstualisere, hvad 707 00:32:59,500 --> 00:33:03,570 vi vil tage for givet nu problem sæt fem. 708 00:33:03,570 --> 00:33:04,820 Så dem er dine til at holde. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Så lad mig overgangen til hvor vil være tilbringe den næste Pset så godt. 711 00:33:13,370 --> 00:33:18,470 Så vi har nu sat denne side til - oh, et par meddelelser hurtigt. 712 00:33:18,470 --> 00:33:21,730 >> Denne fredag, hvis du gerne vil deltage i CS50 til frokost, gå til det sædvanlige, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 Og afgangsprojekt - 715 00:33:25,100 --> 00:33:28,520 så per pensum, vi har sendt den afgangsprojekt specifikation allerede. 716 00:33:28,520 --> 00:33:31,410 Indse, at det ikke betyder det er på grund særligt snart. 717 00:33:31,410 --> 00:33:33,990 Det er udstationeret, virkelig, bare for at få du fyre tænker over det. 718 00:33:33,990 --> 00:33:37,620 Og ja, en super betydelig procentdel af du vil tackle 719 00:33:37,620 --> 00:33:40,780 afgangsprojekter på materiale, som vi har ikke engang fået i klassen, 720 00:33:40,780 --> 00:33:42,730 men vil så tidligt som i næste uge. 721 00:33:42,730 --> 00:33:45,530 >> Bemærk dog, at spec opfordrer til et par forskellige komponenter i 722 00:33:45,530 --> 00:33:46,190 afgangsprojekt. 723 00:33:46,190 --> 00:33:49,590 Den første, i et par uger, er en foreløbige forslag, en temmelig afslappet e-mail til 724 00:33:49,590 --> 00:33:52,760 din TF at fortælle ham, eller hvad du er tænker til dit projekt, med 725 00:33:52,760 --> 00:33:53,650 Ingen Commitment. 726 00:33:53,650 --> 00:33:56,710 Forslaget vil være din særlige engagement, sagde her, dette er hvad 727 00:33:56,710 --> 00:33:57,770 Jeg vil gerne gøre for mit projekt. 728 00:33:57,770 --> 00:33:58,250 Hvad mener du? 729 00:33:58,250 --> 00:33:58,650 Too big? 730 00:33:58,650 --> 00:33:59,145 For lille? 731 00:33:59,145 --> 00:34:00,330 Er det overskueligt? 732 00:34:00,330 --> 00:34:02,230 Og du kan se spec for flere detaljer. 733 00:34:02,230 --> 00:34:05,060 >> Par uger efter det er status rapport, der er et tilsvarende 734 00:34:05,060 --> 00:34:08,260 afslappet e-mail til din TF til at sige lige hvordan langt bagud du er i din endelige 735 00:34:08,260 --> 00:34:12,360 projektets gennemførelse, efterfulgt af Den CS50 hackathon som alle 736 00:34:12,360 --> 00:34:17,520 er inviteret, som vil være en begivenhed fra 20:00 på en aften indtil 07:00 737 00:34:17,520 --> 00:34:19,150 AM næste morgen. 738 00:34:19,150 --> 00:34:22,560 Pizza, som jeg måske har nævnt i uge nul, skal wil serveres på 9:00 PM, 739 00:34:22,560 --> 00:34:24,120 Kinesisk mad på 1:00 AM. 740 00:34:24,120 --> 00:34:27,929 Og hvis du stadig vågen på 5:00 AM, Vi vil tage dig til IHOP til morgenmad. 741 00:34:27,929 --> 00:34:31,310 >> Så hackathon er en af ​​de mere mindeværdige oplevelser i klassen. 742 00:34:31,310 --> 00:34:35,290 Derefter gennemførelse skyldes, og derefter klimaks CS50 Fair. 743 00:34:35,290 --> 00:34:38,070 Flere detaljer om alle disse i de kommende uger. 744 00:34:38,070 --> 00:34:40,739 >> Men lad os gå tilbage til noget gamle skole - 745 00:34:40,739 --> 00:34:41,920 igen, et array. 746 00:34:41,920 --> 00:34:45,040 Så et array var rart, fordi det løser problemer som vi så bare en 747 00:34:45,040 --> 00:34:49,290 øjeblik siden med studerende strukturer få lidt ud af kontrol, hvis vi 748 00:34:49,290 --> 00:34:52,405 ønsker at have studerende en, student to, student tre, student dot dot dot, 749 00:34:52,405 --> 00:34:54,400 nogle vilkårligt antal studerende. 750 00:34:54,400 --> 00:34:58,850 >> Så arrays, et par uger siden slog i og løst alle vores problemer af ikke 751 00:34:58,850 --> 00:35:03,340 vide på forhånd, hvor mange ting af nogle type vi måske ønsker. 752 00:35:03,340 --> 00:35:07,390 Og vi har set, at structs kan hjælpe os yderligere at organisere vores kode og holde 753 00:35:07,390 --> 00:35:11,660 begrebsmæssigt lignende variabler, som en navn og et hus, sammen, så vi 754 00:35:11,660 --> 00:35:15,570 kan behandle dem som én enhed, indvendig hvoraf der er mindre stykker. 755 00:35:15,570 --> 00:35:17,810 >> Men arrays har nogle ulemper. 756 00:35:17,810 --> 00:35:19,780 Hvad er nogle af de ulemper Vi er stødt på 757 00:35:19,780 --> 00:35:22,320 med arrays hidtil? 758 00:35:22,320 --> 00:35:23,450 Hvad er det? 759 00:35:23,450 --> 00:35:28,130 Fast størrelse - så selvom du måske være i stand til at afsætte hukommelse til en 760 00:35:28,130 --> 00:35:32,310 array, når du ved, hvor mange studerende du har, hvor mange tegn du har 761 00:35:32,310 --> 00:35:35,460 fra brugeren, du engang har afsat array, har du slags malet 762 00:35:35,460 --> 00:35:36,740 selv ind i et hjørne. 763 00:35:36,740 --> 00:35:40,600 >> Fordi du ikke kan indsætte nye elementer i midten af ​​et array. 764 00:35:40,600 --> 00:35:43,660 Du kan ikke indsætte flere elementer ved slutningen af ​​et array. 765 00:35:43,660 --> 00:35:47,750 Virkelig, er du nødt til at ty til at skabe et helt ny array, som vi har diskuteret, 766 00:35:47,750 --> 00:35:49,320 kopierer det gamle til den nye. 767 00:35:49,320 --> 00:35:52,610 Og igen, det er hovedpine, GetString tilbud med for dig. 768 00:35:52,610 --> 00:35:56,170 >> Men igen, kan du ikke engang indsætte noget ind i midten af ​​array 769 00:35:56,170 --> 00:35:58,200 hvis satsen ikke er helt fyldt. 770 00:35:58,200 --> 00:36:03,010 For eksempel, på hvis dette array her størrelse seks har kun fem ting i det, 771 00:36:03,010 --> 00:36:06,080 godt, du bare kunne tack noget på enden. 772 00:36:06,080 --> 00:36:08,200 Men hvad nu hvis du ønsker at indsætte noget i midten af 773 00:36:08,200 --> 00:36:11,280 matrix, selvom det kan have fem ud af seks ting i det? 774 00:36:11,280 --> 00:36:14,250 >> Nå, hvad gjorde vi gør, når vi havde alle af vores frivillige på scenen i 775 00:36:14,250 --> 00:36:15,110 uger tidligere? 776 00:36:15,110 --> 00:36:18,710 Hvis vi ønskede at sætte nogen her, hverken disse folk, hvordan at flytte denne 777 00:36:18,710 --> 00:36:22,540 måde eller disse mennesker, hvordan man flytte denne måde, og det blev dyrt. 778 00:36:22,540 --> 00:36:26,950 Flytning af mennesker inde i en matrix endte med at tilføje op og koster 779 00:36:26,950 --> 00:36:31,240 os tiden, og dermed masse af vores n kvadreret kører tider som indsættelse sortere, for 780 00:36:31,240 --> 00:36:32,550 eksempel, i værste fald. 781 00:36:32,550 --> 00:36:36,520 Så arrays er store, men du er nødt til vide på forhånd, hvor stor du vil have dem. 782 00:36:36,520 --> 00:36:38,030 >> Så OK, her er en løsning. 783 00:36:38,030 --> 00:36:43,860 Hvis jeg ikke vide på forhånd, hvor mange elever, jeg måtte have, og jeg ved engang 784 00:36:43,860 --> 00:36:47,870 Jeg beslutter, selvom, jeg sidder med, at mange studerende, hvorfor jeg ikke bare altid 785 00:36:47,870 --> 00:36:51,740 tildele dobbelt så meget plads som jeg tror måske jeg har brug for? 786 00:36:51,740 --> 00:36:54,450 Er det ikke en fornuftig løsning? 787 00:36:54,450 --> 00:36:58,240 >> Realistisk set tror jeg ikke, at vi er vil få brug for mere end 50 slots 788 00:36:58,240 --> 00:37:02,190 i et array for en medium størrelse klasse, så lad os bare runde op. 789 00:37:02,190 --> 00:37:07,040 Jeg vil gøre 100 slots i min array, bare så vi kan helt sikkert få den 790 00:37:07,040 --> 00:37:10,330 Antallet af elever, jeg forventer at være i en mellemstor klasse. 791 00:37:10,330 --> 00:37:14,320 Så hvorfor ikke bare runde op og tildele mere hukommelse, typisk for et array 792 00:37:14,320 --> 00:37:16,290 end du tror, ​​du måske endda brug for? 793 00:37:16,290 --> 00:37:20,190 Hvad er denne enkle pushback til denne idé? 794 00:37:20,190 --> 00:37:21,440 >> Du er bare spilder hukommelse. 795 00:37:21,440 --> 00:37:25,350 Bogstaveligt talt hver program, du skriver så er måske ved hjælp dobbelt så meget hukommelse som 796 00:37:25,350 --> 00:37:26,680 du faktisk har brug for. 797 00:37:26,680 --> 00:37:28,990 Og der bare ikke føler sig som en særligt elegant løsning. 798 00:37:28,990 --> 00:37:31,990 Desuden er det blot nedsætter sandsynligheden for et problem. 799 00:37:31,990 --> 00:37:35,300 Hvis du tilfældigvis har en populær kursus et semester, og du har 101 800 00:37:35,300 --> 00:37:39,610 studerende dit program er stadig fundamentalt står over for samme problem. 801 00:37:39,610 --> 00:37:44,280 >> Så heldigvis er der en løsning på Denne annonce alle vores problemer i form 802 00:37:44,280 --> 00:37:46,790 af datastrukturer, der er mere komplekse end dem 803 00:37:46,790 --> 00:37:47,970 vi har set hidtil. 804 00:37:47,970 --> 00:37:50,530 Det jeg hævder, er en sammenkædet liste. 805 00:37:50,530 --> 00:37:51,920 Dette er en liste over numre - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26 og 34 - 807 00:37:54,970 --> 00:38:00,120 der er blevet kædet sammen ved hjælp af, hvad jeg har tegnet som pile. 808 00:38:00,120 --> 00:38:03,580 >> Med andre ord, jeg hvis ønsket at repræsentere et array, kunne jeg gøre 809 00:38:03,580 --> 00:38:04,910 noget som dette. 810 00:38:04,910 --> 00:38:07,310 Og jeg vil sætte dette over hovedhøjde på bare et øjeblik. 811 00:38:07,310 --> 00:38:09,970 Jeg kunne gøre - 812 00:38:09,970 --> 00:38:12,520 hej, okay. 813 00:38:12,520 --> 00:38:14,470 Standby. 814 00:38:14,470 --> 00:38:17,360 Ny computer her, klar - 815 00:38:17,360 --> 00:38:18,090 okay. 816 00:38:18,090 --> 00:38:21,730 >> Så hvis jeg har disse numre i array - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 ikke nødvendigvis at skalere. 819 00:38:30,530 --> 00:38:33,730 Okay, så her er mit array - 820 00:38:33,730 --> 00:38:34,980 Åh min Gud. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Okay, så her er mit array. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Åh min Gud. 825 00:38:45,050 --> 00:38:48,820 >> [Latter] 826 00:38:48,820 --> 00:38:49,440 >> DAVID MALAN: Pretend. 827 00:38:49,440 --> 00:38:52,330 Det er for besværligt at gå tilbage og ordne det, så der - 828 00:38:52,330 --> 00:38:54,290 26.. 829 00:38:54,290 --> 00:38:57,650 Så vi har denne vifte af 9, 17, 22, 26, og 34.. 830 00:38:57,650 --> 00:39:00,260 For dem af jer kan se pinligt fejl jeg lige lavet, 831 00:39:00,260 --> 00:39:00,830 der er det. 832 00:39:00,830 --> 00:39:04,490 >> Så jeg hævder, at dette er en meget effektiv løsning. 833 00:39:04,490 --> 00:39:07,310 Jeg har afsat så mange ints som Jeg har brug for - en, to, tre, 834 00:39:07,310 --> 00:39:09,100 fire, fem eller seks - 835 00:39:09,100 --> 00:39:11,660 og jeg har derefter lagret tallene indersiden af ​​dette array. 836 00:39:11,660 --> 00:39:15,220 Men formoder, så jeg ønsker at indsætte en værdi som nummer 8? 837 00:39:15,220 --> 00:39:16,100 Tja, hvor det gå? 838 00:39:16,100 --> 00:39:18,530 Antag jeg ønsker at indsætte et nummer ligesom 20. 839 00:39:18,530 --> 00:39:19,790 Tja, hvor det gå? 840 00:39:19,790 --> 00:39:23,160 Et eller andet sted er der i midten, eller antallet 35 har til at gå 841 00:39:23,160 --> 00:39:24,010 sted ved udgangen. 842 00:39:24,010 --> 00:39:25,320 Men jeg er alt ud af rummet. 843 00:39:25,320 --> 00:39:29,120 >> Og så dette er en grundlæggende udfordring af arrays, der ikke er løsningen. 844 00:39:29,120 --> 00:39:32,280 Jeg påstod for et øjeblik siden, getString løser dette problem. 845 00:39:32,280 --> 00:39:37,380 Hvis du ønsker at indsætte en sjette nummer i dette array, er det mindst én 846 00:39:37,380 --> 00:39:40,090 løsning, du kan falde tilbage på sikker, ligesom vi gør med getString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Hvad er det? 849 00:39:46,030 --> 00:39:48,190 >> Nå, gøre det større er lettere sagt end gjort. 850 00:39:48,190 --> 00:39:52,810 Vi kan ikke nødvendigvis gøre array større, men hvad kan vi gøre? 851 00:39:52,810 --> 00:39:56,570 Lav et nyt array, der er større, størrelse 6, eller måske størrelse 10, hvis vi ønsker 852 00:39:56,570 --> 00:40:00,490 at komme foran på tingene, og derefter kopiere den gamle array i den nye, og derefter 853 00:40:00,490 --> 00:40:01,680 frigøre den gamle array. 854 00:40:01,680 --> 00:40:05,770 >> Men hvad er den løbende tid nu i denne proces? 855 00:40:05,770 --> 00:40:09,870 Det er stort O n, fordi kopieringen kommer til at koste dig nogle enheder af 856 00:40:09,870 --> 00:40:13,480 tid, så ikke så ideel, hvis vi er nødt til tildele en ny matrix, som vil 857 00:40:13,480 --> 00:40:15,610 at forbruge dobbelt så meget hukommelse midlertidigt. 858 00:40:15,610 --> 00:40:16,660 Kopier gammelt til nyt - 859 00:40:16,660 --> 00:40:18,800 Jeg mener, det er bare en hovedpine, som er, igen, hvorfor vi skrev 860 00:40:18,800 --> 00:40:19,920 GetString for dig. 861 00:40:19,920 --> 00:40:21,380 >> Så hvad kunne vi gøre i stedet? 862 00:40:21,380 --> 00:40:25,000 Nå, hvad hvis vores datastruktur har faktisk huller i det? 863 00:40:25,000 --> 00:40:30,790 Antag, at jeg slap mit mål om at have sammenhængende bidder af hukommelsen, hvor 9 864 00:40:30,790 --> 00:40:34,500 er lige ved siden af ​​til 17, hvilket er ret ud til 22, og så videre. 865 00:40:34,500 --> 00:40:39,570 >> Og formoder, at 9 kan være herovre i RAM og 17 kan herovre i RAM, 866 00:40:39,570 --> 00:40:40,990 og 22 kan herovre i RAM. 867 00:40:40,990 --> 00:40:43,610 Med andre ord, jeg ikke har brug for dem selv tilbage til tilbage længere. 868 00:40:43,610 --> 00:40:47,850 Jeg har bare en eller anden måde tråd en nål gennem hver af disse numre, eller hver 869 00:40:47,850 --> 00:40:51,010 af disse knudepunkter, vi som ringer efter rektangler, som jeg har trukket dem til 870 00:40:51,010 --> 00:40:55,670 huske, hvordan man kommer til den sidste sådan node fra den første. 871 00:40:55,670 --> 00:40:59,940 >> Så hvad er det programmeringssprog konstruere vi har set for nylig, som jeg 872 00:40:59,940 --> 00:41:03,030 kan gennemføre denne tråd, eller trukket her, som jeg kan 873 00:41:03,030 --> 00:41:05,430 gennemføre disse pile? 874 00:41:05,430 --> 00:41:06,500 Så pointere, right? 875 00:41:06,500 --> 00:41:09,560 Hvis jeg ikke allokere bare en int, men en node - og ved 876 00:41:09,560 --> 00:41:10,810 node, jeg bare mener container. 877 00:41:10,810 --> 00:41:12,900 Og visuelt, mener jeg et rektangel. 878 00:41:12,900 --> 00:41:16,420 Så en knude tilsyneladende behov at indeholde to værdier - 879 00:41:16,420 --> 00:41:21,490 int selv, og så, som indikeret den nederste halvdel af rektanglet, 880 00:41:21,490 --> 00:41:23,010 nok plads til en int. 881 00:41:23,010 --> 00:41:26,130 >> Så bare tænke fremad her hvor stor er dette knudepunkt, dette 882 00:41:26,130 --> 00:41:27,170 container i spørgsmål? 883 00:41:27,170 --> 00:41:29,250 Hvor mange byte for int? 884 00:41:29,250 --> 00:41:31,310 Formentlig 4, hvis det er den samme som sædvanlig. 885 00:41:31,310 --> 00:41:33,270 Og så hvor mange bytes for pointeren? 886 00:41:33,270 --> 00:41:33,650 4.. 887 00:41:33,650 --> 00:41:37,940 Så denne beholder eller dette knudepunkt, er vil være en 8-byte struktur. 888 00:41:37,940 --> 00:41:41,760 Åh, og det er en glad tilfældighed, at vi bare indført denne forestilling om 889 00:41:41,760 --> 00:41:44,400 en struct, eller en C-struktur. 890 00:41:44,400 --> 00:41:48,890 >> Så jeg påstå, at jeg ønsker at tage et skridt mod dette mere sofistikerede 891 00:41:48,890 --> 00:41:52,560 gennemførelse af en liste af tal, et knyttet liste over numre, jeg har brug for at gøre en 892 00:41:52,560 --> 00:41:56,920 lidt mere at tænke op foran og erklære ikke bare en int, men en struct 893 00:41:56,920 --> 00:41:58,620 at jeg ringer, konventionelt her, node. 894 00:41:58,620 --> 00:42:01,630 Vi kunne kalde det noget, vi ønsker, men node bliver tematisk i en masse 895 00:42:01,630 --> 00:42:03,560 af de ting, vi begynder at se på nu. 896 00:42:03,560 --> 00:42:06,480 >> Inde i denne node er en int n. 897 00:42:06,480 --> 00:42:09,350 Og så denne syntaks, lidt underligt ved første øjekast - 898 00:42:09,350 --> 00:42:12,960 struct node * næste. 899 00:42:12,960 --> 00:42:16,900 Nå billedligt, hvad er det? 900 00:42:16,900 --> 00:42:21,000 Det er den nederste halvdel af rektanglet, som vi oplevede 901 00:42:21,000 --> 00:42:22,730 bare for et øjeblik siden. 902 00:42:22,730 --> 00:42:27,600 >> Men hvorfor siger jeg struct node * i modsætning til blot node *? 903 00:42:27,600 --> 00:42:31,370 For hvis denne pegepind peger på en anden node, er det bare 904 00:42:31,370 --> 00:42:32,760 adresse af en knude. 905 00:42:32,760 --> 00:42:35,630 Det er i overensstemmelse med, hvad vi har diskuterede pointers hidtil. 906 00:42:35,630 --> 00:42:39,690 Men hvorfor, hvis jeg hævder denne struktur er kaldet node, behøver jeg sige struct 907 00:42:39,690 --> 00:42:42,660 node herinde? 908 00:42:42,660 --> 00:42:43,190 >> Præcis. 909 00:42:43,190 --> 00:42:46,490 Det er en slags en dum virkelighed C. Den typedef, så at sige, har ikke 910 00:42:46,490 --> 00:42:47,220 sket endnu. 911 00:42:47,220 --> 00:42:48,510 C er super bogstavelig. 912 00:42:48,510 --> 00:42:51,050 Den læser din kode top til bund, venstre mod højre. 913 00:42:51,050 --> 00:42:54,930 Og indtil den rammer at semikolon på bundlinjen, gæt hvad der ikke 914 00:42:54,930 --> 00:42:57,590 eksistere som en datatype? 915 00:42:57,590 --> 00:42:59,060 Node, citat citat slut node. 916 00:42:59,060 --> 00:43:03,050 >> Men på grund af den mere detaljeret erklæring jeg gjorde på den første linje - 917 00:43:03,050 --> 00:43:05,340 typedef struct node - 918 00:43:05,340 --> 00:43:08,790 fordi der kom først, før krøllede parenteser, det er lidt ligesom 919 00:43:08,790 --> 00:43:11,800 pre-uddanne Clang det, du hvad, giv mig et struct 920 00:43:11,800 --> 00:43:13,570 kaldet struct node. 921 00:43:13,570 --> 00:43:16,270 Helt ærligt, jeg kan ikke lide kalde tingene struct node, struct node alle 922 00:43:16,270 --> 00:43:17,090 hele min kode. 923 00:43:17,090 --> 00:43:20,660 Men jeg vil kun bruge det én gang, lige inden, så jeg kan effektivt 924 00:43:20,660 --> 00:43:25,010 skabe en slags cirkulær reference, ikke en pointer til mig selv, men en 925 00:43:25,010 --> 00:43:29,400 pointer til en anden af samme type. 926 00:43:29,400 --> 00:43:32,330 >> Så det viser sig, at der på en datastruktur som dette, er der et par 927 00:43:32,330 --> 00:43:34,470 operationer, der kan være af interesse for os. 928 00:43:34,470 --> 00:43:37,460 Vi måske ønsker at indsætte ind i en liste som denne. 929 00:43:37,460 --> 00:43:39,850 Vi vil måske slette fra en liste som denne. 930 00:43:39,850 --> 00:43:43,490 Vi vil måske søge listen for en værdi, eller mere generelt, travers. 931 00:43:43,490 --> 00:43:46,410 Og traverse er bare en fancy måde siger starter til venstre og flytte alle 932 00:43:46,410 --> 00:43:47,650 vejen til højre. 933 00:43:47,650 --> 00:43:52,640 >> Og meddelelse, selv med denne lidt mere sofistikerede datastruktur, lad 934 00:43:52,640 --> 00:43:56,510 mig foreslår, at vi kan låne nogle af ideerne i de seneste to uger og 935 00:43:56,510 --> 00:43:58,410 gennemføre en funktion kaldet søge som dette. 936 00:43:58,410 --> 00:44:01,360 Det kommer til at returnere true eller falsk, hvilket indikerer, ja eller 937 00:44:01,360 --> 00:44:03,390 nej, n er på listen. 938 00:44:03,390 --> 00:44:05,960 Sit andet argument er en pointer til selve listen, så en 939 00:44:05,960 --> 00:44:07,920 pointer til et knudepunkt. 940 00:44:07,920 --> 00:44:10,350 >> Alt jeg har tænkt mig at så gøre, er at erklære en midlertidig variabel. 941 00:44:10,350 --> 00:44:12,730 Vi kalder det ptr af konventionen, for pointer. 942 00:44:12,730 --> 00:44:15,220 Og jeg tildele det lig med den begyndelsen af ​​listen. 943 00:44:15,220 --> 00:44:16,680 >> Og nu mærke til, mens du løkken. 944 00:44:16,680 --> 00:44:20,640 Så længe pointer ikke er lig til null, jeg kommer til at kontrollere. 945 00:44:20,640 --> 00:44:24,520 Er Markørpilen n lig med n, der blev vedtaget i? 946 00:44:24,520 --> 00:44:26,410 Og vent et øjeblik - ny stykke syntaks. 947 00:44:26,410 --> 00:44:29,324 Hvad er pil pludselig? 948 00:44:29,324 --> 00:44:30,574 Ja? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Præcis. 951 00:44:34,810 --> 00:44:38,860 Så mens nogle få minutter siden, brugte vi dot notation adgang noget 952 00:44:38,860 --> 00:44:43,080 indersiden af ​​en struct, hvis variablen har du er ikke den struct 953 00:44:43,080 --> 00:44:47,420 sig selv, men en pointer til en struct, heldigvis et stykke syntaks, 954 00:44:47,420 --> 00:44:48,620 endelig gør intuitiv fornemmelse. 955 00:44:48,620 --> 00:44:52,360 Pilen betyder at følge markøren, ligesom vores pile typisk betyder 956 00:44:52,360 --> 00:44:56,570 billedligt, og går på datafelt indeni. 957 00:44:56,570 --> 00:44:59,700 Så pilen er den samme som prik, men du bruge det, når du har en pointer. 958 00:44:59,700 --> 00:45:05,270 >> Så bare for at opsummere så, hvis n feltet indersiden af ​​struct kaldet markøren 959 00:45:05,270 --> 00:45:07,760 lig lig n, returnere sandt. 960 00:45:07,760 --> 00:45:11,970 Ellers er dette linje her - pointer lig pointer næste. 961 00:45:11,970 --> 00:45:17,540 Så hvad det gør, varsel, er, hvis jeg er i øjeblikket peger på struct 962 00:45:17,540 --> 00:45:21,430 indeholdende 9, og 9 er ikke antallet Jeg leder efter - formoder jeg leder 963 00:45:21,430 --> 00:45:22,830 for n lig 50 - 964 00:45:22,830 --> 00:45:25,930 Jeg har tænkt mig at opdatere min midlertidige pointer for ikke at pege på dette knudepunkt 965 00:45:25,930 --> 00:45:31,190 længere, men Markørpilen næste, som kommer til at sætte mig op her. 966 00:45:31,190 --> 00:45:34,270 >> Nu indså jeg er en hvirvelvind introduktion. 967 00:45:34,270 --> 00:45:37,380 På onsdag vil vi faktisk gøre dette med nogle mennesker og med nogle mere 968 00:45:37,380 --> 00:45:38,900 kode i et langsommere tempo. 969 00:45:38,900 --> 00:45:42,990 Men indse, vi nu gør vores data strukturer mere kompleks, så vores 970 00:45:42,990 --> 00:45:45,780 algoritmer kan få mere effektiv, hvilket vil være nødvendige for 971 00:45:45,780 --> 00:45:50,500 Pset seks, når vi lægger i, igen, de 150.000 ord, men er nødt til at gøre det 972 00:45:50,500 --> 00:45:55,650 effektivt, og ideelt set, at skabe en program, der kører for vores brugere ikke er i 973 00:45:55,650 --> 00:46:00,460 lineær, ikke i n kvadreret, men i konstant tid, i det ideelle. 974 00:46:00,460 --> 00:46:02,300 >> Vi vil se dig på onsdag. 975 00:46:02,300 --> 00:46:07,240 >> SPEAKER: På det næste CS50, David glemmer sin base case. 976 00:46:07,240 --> 00:46:12,770 >> DAVID MALAN: Og det er, hvordan du sender tekstbeskeder med C. Hvad - 977 00:46:12,770 --> 00:46:14,020 >> [FORSKELLIGE TEKSTMEDDELELSE ANMELDELSE SOUNDS] 978 00:46:14,020 --> 00:46:19,734