1 00:00:00,000 --> 00:00:02,742 2 00:00:02,742 --> 00:00:05,680 >> SPEAKER 1: Hoi iedereen. 3 00:00:05,680 --> 00:00:07,530 We gaan aan de slag. 4 00:00:07,530 --> 00:00:09,330 Ik denk dat mensen gaan nog steeds te filteren in. 5 00:00:09,330 --> 00:00:12,840 Maar in het belang van de tijd, dus we kunnen Willen jullie hier op tijd, 6 00:00:12,840 --> 00:00:14,110 we gaan beginnen. 7 00:00:14,110 --> 00:00:18,780 Dus welkom op de CS50 Quiz 0 beoordeling. 8 00:00:18,780 --> 00:00:23,020 Voor degenen onder u die niet gerealiseerd zijn nog, je hebt een vraag op woensdag. 9 00:00:23,020 --> 00:00:25,700 Woo-hoo. 10 00:00:25,700 --> 00:00:29,780 >> Als u nog niet begonnen met nog studeren of hebben zich niet gerealiseerd dat dit nog bestaat, 11 00:00:29,780 --> 00:00:34,070 verleden quizzen en alle informatie over uw quiz op cs50.net/quizzes. 12 00:00:34,070 --> 00:00:38,090 Er is wat best goed spul op daar, verleden quizzen van de laatste 10 13 00:00:38,090 --> 00:00:43,760 jaar alsmede informatie over deze quiz en onderwerpen 14 00:00:43,760 --> 00:00:46,250 die zullen worden gedekt. 15 00:00:46,250 --> 00:00:48,980 Dus laten we beginnen. 16 00:00:48,980 --> 00:00:54,240 >> Dus jullie kunnen herinneren, de eerste lesdag David had die lampen op. 17 00:00:54,240 --> 00:00:59,650 Dus in wezen, alles wat daarbij hoort onder de motorkap van een computer is 18 00:00:59,650 --> 00:01:00,860 gedaan in binaire. 19 00:01:00,860 --> 00:01:04,080 Binaire betekent wat het klinkt zoals, 0's en 1's. 20 00:01:04,080 --> 00:01:09,290 Het heeft twee waarden kan worden weergegeven. 21 00:01:09,290 --> 00:01:14,675 >> Dus net als in de eerste dag van de sectie toen David draaide op een lichte 22 00:01:14,675 --> 00:01:21,990 gloeilamp te vertegenwoordigen op, of 1, onze computer begrijpt binair als 0 en 23 00:01:21,990 --> 00:01:24,110 1's, aan of uit. 24 00:01:24,110 --> 00:01:25,360 Basis van de Binary. 25 00:01:25,360 --> 00:01:29,440 26 00:01:29,440 --> 00:01:32,470 Elke plaats is vertegenwoordigd in basis twee. 27 00:01:32,470 --> 00:01:36,260 Dus je 2 toe te voegen aan de 0 naar de 1 op de 2 helemaal naar boven. 28 00:01:36,260 --> 00:01:41,970 >> Om te berekenen wat uw binary is te decimaal, volg gewoon deze vergelijking 29 00:01:41,970 --> 00:01:42,840 soort ding. 30 00:01:42,840 --> 00:01:49,510 Als je een 1 in een van die plaatsen, je het vermenigvuldigt met welke 31 00:01:49,510 --> 00:01:53,820 Baseer het in, voeg het op, en je krijgt de decimaal. 32 00:01:53,820 --> 00:01:57,930 Dus dit is hoe je telt tot en met 5 in binaire. 33 00:01:57,930 --> 00:02:01,400 Net als wat we aan het doen waren op de laatste dia, dit is hoe je dat zou doen 34 00:02:01,400 --> 00:02:02,650 1 vertegenwoordigen tot en met 5. 35 00:02:02,650 --> 00:02:05,320 36 00:02:05,320 --> 00:02:09,660 >> Op dezelfde manier, net als u kunt toevoegen en aftrekken in decimale of baseren 10, of 37 00:02:09,660 --> 00:02:13,040 echt geen basis, op kunt toevoegen en aftrekken in het binaire. 38 00:02:13,040 --> 00:02:18,400 Precies wat je zou verwachten als je Voeg de twee op, als het groter gelijk 39 00:02:18,400 --> 00:02:24,220 dan 1, je draagt ​​een 1, maken het een 0, en doe de toevoeging op die manier, net 40 00:02:24,220 --> 00:02:29,910 zoals je zou verwachten met regelmatige decimaal of een andere base. 41 00:02:29,910 --> 00:02:30,970 Cool. 42 00:02:30,970 --> 00:02:35,140 >> Dus zoals ik al eerder zei, alles wat gaat verder onder de motorkap van onze computer 43 00:02:35,140 --> 00:02:37,560 gebeurt in 0 en 1's, of binair. 44 00:02:37,560 --> 00:02:43,470 Dus hoe kunnen we uitdrukken, bijvoorbeeld, letters of cijfers en andere tekens? 45 00:02:43,470 --> 00:02:45,560 En het antwoord daarop is ASCII. 46 00:02:45,560 --> 00:02:49,380 >> ASCII is een mapping tussen de personages dat we normaal zien in de 47 00:02:49,380 --> 00:02:53,360 Engels taal zoals A's, B's, C's, onderstrepen, streepjes, en 48 00:02:53,360 --> 00:02:54,910 iets dergelijks. 49 00:02:54,910 --> 00:02:57,260 En het brengt dat naar een ASCII-waarde. 50 00:02:57,260 --> 00:03:03,080 Een ASCII-waarde is slechts een nummer dat begrepen kan worden door de computer. 51 00:03:03,080 --> 00:03:07,430 En net zoals je bovendien kunt doen en aftrekken met getallen, kunt u doen 52 00:03:07,430 --> 00:03:10,890 ze met ASCII waarden. 53 00:03:10,890 --> 00:03:14,050 >> In dit voorbeeld, welke zal dit uitprinten? 54 00:03:14,050 --> 00:03:26,790 55 00:03:26,790 --> 00:03:35,480 Ja, dus gewoon een ruimte B ruimte C ruimte D. Waar is mijn muis te gaan? 56 00:03:35,480 --> 00:03:39,200 57 00:03:39,200 --> 00:03:43,380 Let op u kunt een int 65 definiëren. 58 00:03:43,380 --> 00:03:47,080 En wanneer u afdrukt dat met behulp van procent C, zal het interpreteren dat als een 59 00:03:47,080 --> 00:03:49,330 karakter en zal A. uitprinten 60 00:03:49,330 --> 00:03:52,800 >> Op dezelfde manier kunt u aangeven het als een char. 61 00:03:52,800 --> 00:03:56,860 En wanneer u het afdrukken met behulp procent C, zal het interpreteren dat als 62 00:03:56,860 --> 00:04:05,240 procent D. En net zoals je een kunt toevoegen nummer, kunt u toevoegen tekens zijn 63 00:04:05,240 --> 00:04:06,878 ASCII-waarden, in dit geval. 64 00:04:06,878 --> 00:04:11,370 65 00:04:11,370 --> 00:04:16,130 >> Dus een beetje wijzer voor iedereen. 66 00:04:16,130 --> 00:04:19,610 5, als een string, niet eigenlijk gelijk 5. 67 00:04:19,610 --> 00:04:26,610 Dus hoe kunnen we zetten de snaar 5 aan integer 5? 68 00:04:26,610 --> 00:04:28,930 Het even welke ideeën? 69 00:04:28,930 --> 00:04:31,630 Yeah. 70 00:04:31,630 --> 00:04:36,720 >> Dus als we hebben 5 als een string, we kunnen aftrekken 0. 71 00:04:36,720 --> 00:04:37,820 En dat zal ons 5. 72 00:04:37,820 --> 00:04:41,670 En evenzo, als we 5 als integer, voeg dat toe aan de string 0. 73 00:04:41,670 --> 00:04:43,112 En dat geeft ons de snaar 5. 74 00:04:43,112 --> 00:04:46,350 75 00:04:46,350 --> 00:04:48,350 Cool. 76 00:04:48,350 --> 00:04:52,940 >> Nu, herinner terug naar een situatie waarin de les hebben we gesproken over algoritmen. 77 00:04:52,940 --> 00:04:57,260 Dus hoe willen we eigenlijk een computer om interessante dingen te doen? 78 00:04:57,260 --> 00:05:00,460 Je weet wel, gewoon optellen en aftrekken nummers en afdrukken dingen, is niet 79 00:05:00,460 --> 00:05:01,730 dat spannend. 80 00:05:01,730 --> 00:05:04,620 Meestal willen we onze computer te voeren wat soort algoritme. 81 00:05:04,620 --> 00:05:07,820 Iets wat complexer dan alleen eenvoudige rekenkundige. 82 00:05:07,820 --> 00:05:11,930 >> Een algoritme is gewoon een stap voor stap set van de instructies voor het uitvoeren van 83 00:05:11,930 --> 00:05:14,640 bepaalde task-- 84 00:05:14,640 --> 00:05:15,660 net als een recept. 85 00:05:15,660 --> 00:05:19,990 Je zou de eerste dag van herinneren klasse waar David had ons horen een kamer 86 00:05:19,990 --> 00:05:22,550 van mensen en hoeveel mensen waren in de kamer. 87 00:05:22,550 --> 00:05:24,480 U zou kunnen worden gebruikt om te tellen een voor een. 88 00:05:24,480 --> 00:05:25,860 1, 2, 3, 4. 89 00:05:25,860 --> 00:05:28,010 In dat geval kan een lineaire tijd algoritme. 90 00:05:28,010 --> 00:05:31,710 >> Maar David introduceerde een algoritme voor je aan de mensen in de kamer te tellen 91 00:05:31,710 --> 00:05:37,340 waar iedereen staat op, zegt u uw nummer aan een ander persoon, toe te voegen dat 92 00:05:37,340 --> 00:05:39,200 nummer op, en een persoon gaat zitten. 93 00:05:39,200 --> 00:05:40,410 En u dat herhalen. 94 00:05:40,410 --> 00:05:42,910 Dat is een type algoritme. 95 00:05:42,910 --> 00:05:47,520 Wij analyseren hoe efficiënt een algoritme is gebaseerd op het gestart tijd. 96 00:05:47,520 --> 00:05:49,680 Maar we zullen een beetje praten daarover later meer. 97 00:05:49,680 --> 00:05:52,740 98 00:05:52,740 --> 00:05:57,090 >> Dus alle algoritmes kunnen ook worden geschreven in pseudocode. 99 00:05:57,090 --> 00:06:01,120 Pseudocode is gewoon een Engels als syntax gebruikt om 100 00:06:01,120 --> 00:06:02,420 een programmeertaal. 101 00:06:02,420 --> 00:06:06,070 Bijvoorbeeld, als we wilden om een ​​gebruiker te vragen mijn favoriete nummer raden, we 102 00:06:06,070 --> 00:06:08,390 kan pseudocode als zodanig. 103 00:06:08,390 --> 00:06:09,850 >> Hier krijg je een gebruikers raden. 104 00:06:09,850 --> 00:06:13,570 Als de schatting juist is, vertel hen ze correct zijn, anders vertel hen 105 00:06:13,570 --> 00:06:15,560 ze zijn niet correct. 106 00:06:15,560 --> 00:06:22,530 En pseudocode is een manier om gemakkelijk vertegenwoordigen een idee of een algoritme. 107 00:06:22,530 --> 00:06:26,910 Dus nu hebben we misschien willen eigenlijk schrijven dit in de taal die de computer 108 00:06:26,910 --> 00:06:27,980 zou kunnen begrijpen. 109 00:06:27,980 --> 00:06:35,660 Dus konden we onze pseudocode schrijven en interpreteren dat in de broncode. 110 00:06:35,660 --> 00:06:41,320 >> Tot nu toe moet broncode voldoen een bepaalde syntax van 111 00:06:41,320 --> 00:06:42,490 een programmeertaal. 112 00:06:42,490 --> 00:06:45,430 En tot nu toe, in CS50, we hebben werd met behulp van vooral c. 113 00:06:45,430 --> 00:06:48,320 Dus dit kan broncode c zijn. 114 00:06:48,320 --> 00:06:51,440 Later in de cursus, je 's nachts komen in contact met andere programmering 115 00:06:51,440 --> 00:06:52,480 talen zoals PHP. 116 00:06:52,480 --> 00:06:57,540 Of als u zelfs andere klassen, u zou kunnen doen Java, Python, of zelfs OCML. 117 00:06:57,540 --> 00:07:01,570 Maar in onze c-programma taal, dit is hoe we de broncode voor zou kunnen schrijven 118 00:07:01,570 --> 00:07:04,760 de pseudocode algoritme dat Ik eerder beschreef. 119 00:07:04,760 --> 00:07:08,630 120 00:07:08,630 --> 00:07:11,430 >> Dus hoe werkt de computer eigenlijk Begrijp je dat? 121 00:07:11,430 --> 00:07:14,490 Zoals ik al eerder zei het pas echt begrijpt nullen en enen. 122 00:07:14,490 --> 00:07:17,880 Dus hoe werkt het krijgen van de bron code iets dat kan worden 123 00:07:17,880 --> 00:07:18,960 begrepen? 124 00:07:18,960 --> 00:07:22,920 Nou, we hebben iets genoemd compiler. 125 00:07:22,920 --> 00:07:28,450 >> Als je terug herinneren in de meeste van uw psets, je een soort van programma hadden 126 00:07:28,450 --> 00:07:30,370 geschreven in een punt c bestand. 127 00:07:30,370 --> 00:07:32,550 En dan zou je make typt. 128 00:07:32,550 --> 00:07:35,970 Dus wat maakt het doen? 129 00:07:35,970 --> 00:07:39,970 >> U kunt typen maak samen te stellen uw programma, omdat someone-- 130 00:07:39,970 --> 00:07:42,730 wie schreef je p set; Waarschijnlijk David-- 131 00:07:42,730 --> 00:07:44,190 creëerde een make file. 132 00:07:44,190 --> 00:07:51,320 En dat zegt te maken om te weten te lopen uw compiler, genaamd clang, dat wil 133 00:07:51,320 --> 00:07:55,560 dan is uw broncode te compileren om bezwaar code, die nullen en enen 134 00:07:55,560 --> 00:07:57,720 dat de computer begrijpt. 135 00:07:57,720 --> 00:08:01,610 Maar een beetje later, gaan we meer in de diepte over compilers. 136 00:08:01,610 --> 00:08:05,640 137 00:08:05,640 --> 00:08:10,800 >> Dus herinneren PSET 0, where-- ja, heb je een vraag? 138 00:08:10,800 --> 00:08:11,620 >> PUBLIEK: [onverstaanbaar]? 139 00:08:11,620 --> 00:08:12,490 >> SPEAKER 1: Ja. 140 00:08:12,490 --> 00:08:14,960 Ik denk dat ze eigenlijk moet online zijn. 141 00:08:14,960 --> 00:08:15,120 Yeah. 142 00:08:15,120 --> 00:08:16,572 >> PUBLIEK: Is het als [onverstaanbaar]? 143 00:08:16,572 --> 00:08:19,476 144 00:08:19,476 --> 00:08:20,830 >> SPEAKER 1: Het is niet. 145 00:08:20,830 --> 00:08:25,810 Het zijn op cs50.net/quizzes. 146 00:08:25,810 --> 00:08:32,900 >> PUBLIEK: Slash quizzen, slash 2013 slash 0, en klik je gewoon door 147 00:08:32,900 --> 00:08:35,956 quizzen 2013 en quiz 0, beoordelen sectie glijbanen. 148 00:08:35,956 --> 00:08:40,380 >> SPEAKER 1: Ja, dus als jullie willen trek hem omhoog en kijk naar het op uw 149 00:08:40,380 --> 00:08:42,740 eigen computer, is dat ook goed. 150 00:08:42,740 --> 00:08:43,130 Zeg dat nog eens. 151 00:08:43,130 --> 00:08:44,546 >> PUBLIEK: [onverstaanbaar]. 152 00:08:44,546 --> 00:08:48,780 >> SPEAKER 1: Ja, [onverstaanbaar] is de dummy variabele. 153 00:08:48,780 --> 00:08:49,644 Oh, ja? 154 00:08:49,644 --> 00:08:51,372 >> PUBLIEK: [onverstaanbaar]? 155 00:08:51,372 --> 00:08:54,300 >> SPEAKER 1: Nee, stakingen zijn niet op het examen. 156 00:08:54,300 --> 00:08:55,950 Sorry, haar vraag was, was stakingen op het examen. 157 00:08:55,950 --> 00:08:59,530 En is het niet. 158 00:08:59,530 --> 00:09:05,780 Dus PSET 0, moeten jullie allemaal geïmplementeerd iets met scratch. 159 00:09:05,780 --> 00:09:13,100 En we leerden een aantal fundamentele programmering bouwblokken met scratch. 160 00:09:13,100 --> 00:09:15,590 >> Dus laten we eens een kijkje bij enkele Deze bouwstenen 161 00:09:15,590 --> 00:09:18,170 die deel uitmaken van een programma. 162 00:09:18,170 --> 00:09:20,570 Eerst is Booleaanse uitdrukking. 163 00:09:20,570 --> 00:09:24,540 Booleaanse uitdrukkingen zijn enen en 0's of iets dat heeft 164 00:09:24,540 --> 00:09:25,700 twee mogelijke waarden. 165 00:09:25,700 --> 00:09:30,320 In dit geval, waar of onwaar, aan of uit, en ja of nee. 166 00:09:30,320 --> 00:09:35,390 Een voorbeeld van een eenvoudige, zeer eenvoudig, programma dat gebruik maakt van een Booleaanse 167 00:09:35,390 --> 00:09:39,140 uitdrukking hier. 168 00:09:39,140 --> 00:09:43,220 >> Dus om voor Booleaanse expressies nuttig, we Booleaanse operatoren. 169 00:09:43,220 --> 00:09:48,920 Dit zijn operatoren die kunnen worden gebruikt bepaalde waarden te vergelijken. 170 00:09:48,920 --> 00:09:52,820 Dus we hebben en dan niet gelijk aan minder, dan of gelijk aan, groter dan of 171 00:09:52,820 --> 00:09:55,130 gelijk aan en kleiner dan of meer. 172 00:09:55,130 --> 00:09:59,060 Maar deze operatoren zijn niet erg nuttig tenzij we ze kunnen combineren tot 173 00:09:59,060 --> 00:10:00,320 voorwaarden. 174 00:10:00,320 --> 00:10:04,370 >> Dus jullie herinneren zich misschien nog van de grond af en van uw p stelt dat we 175 00:10:04,370 --> 00:10:05,400 had voorwaarden. 176 00:10:05,400 --> 00:10:09,710 Ze zijn, in wezen, zoals vorken in de logica van het programma dat 177 00:10:09,710 --> 00:10:12,670 uitgevoerd naargelang een voorwaarde is voldaan. 178 00:10:12,670 --> 00:10:18,150 Dus een van de voorwaarden die we hadden vele malen gebruikt in deze cursus is de 179 00:10:18,150 --> 00:10:21,470 indien, anders, als, en anders voorwaarden. 180 00:10:21,470 --> 00:10:24,060 >> Hier is een voorbeeld van hoe je zou kunnen gebruiken dat. 181 00:10:24,060 --> 00:10:28,430 Weet iemand het verschil tussen weten alleen met behulp van if-statements alle 182 00:10:28,430 --> 00:10:32,530 de weg naar beneden verzen als, anders, indien, en anders gecombineerd? 183 00:10:32,530 --> 00:10:33,013 Ja? 184 00:10:33,013 --> 00:10:34,263 >> PUBLIEK: [onverstaanbaar]. 185 00:10:34,263 --> 00:10:40,741 186 00:10:40,741 --> 00:10:42,160 >> SPEAKER 1: Precies. 187 00:10:42,160 --> 00:10:50,210 Dus als ik had als helemaal naar beneden deze manier, zelfs als deze aandoening terugkeert 188 00:10:50,210 --> 00:10:52,800 true, zal het nog steeds het testen van de volgende twee. 189 00:10:52,800 --> 00:11:00,120 Overwegende dat, met een anders-of, een ander verklaring, als de ene geeft true, 190 00:11:00,120 --> 00:11:02,640 de anderen zijn niet getest. 191 00:11:02,640 --> 00:11:05,955 Heeft u vragen over dat? 192 00:11:05,955 --> 00:11:06,890 Cool. 193 00:11:06,890 --> 00:11:12,240 >> Dus je een if-else van een anders te gebruiken statement als je weet dat het kan alleen 194 00:11:12,240 --> 00:11:14,470 een van deze gevallen. 195 00:11:14,470 --> 00:11:21,550 We weten als x kleiner is dan 0, is het zeker niet van plan te zijn 196 00:11:21,550 --> 00:11:22,890 groter dan 0. 197 00:11:22,890 --> 00:11:26,940 198 00:11:26,940 --> 00:11:31,480 >> Vervolgens een andere bouwsteen dat we geleerd hebben lussen. 199 00:11:31,480 --> 00:11:33,310 We hebben drie soorten lussen. 200 00:11:33,310 --> 00:11:35,830 Voor loops, terwijl loops, en te doen terwijl loops. 201 00:11:35,830 --> 00:11:38,730 En in het algemeen, als je gaat zitten om te schrijf iets, je moet beslissen 202 00:11:38,730 --> 00:11:40,060 welke van de drie die u wilt gebruiken. 203 00:11:40,060 --> 00:11:41,900 Dus hoe kunnen we beslissen welke? 204 00:11:41,900 --> 00:11:44,920 205 00:11:44,920 --> 00:11:48,790 >> We gebruiken over het algemeen een lus als we weten hoe vaak we willen herhalen 206 00:11:48,790 --> 00:11:53,650 door iets of hoe vaak we willen een taak uit te voeren. 207 00:11:53,650 --> 00:11:58,830 We gebruiken terwijl loops als we nodig hebben voorwaarde om waar te draaiende te houden zijn. 208 00:11:58,830 --> 00:12:03,730 En we gebruiken doen terwijl zeer vergelijkbaar met tijdje, maar we willen onze code kan worden uitgevoerd op 209 00:12:03,730 --> 00:12:04,880 minste een keer. 210 00:12:04,880 --> 00:12:09,410 >> Dus doen terwijl, wat in de doe zal altijd op minstens een maal. 211 00:12:09,410 --> 00:12:13,120 Overwegende dat, met de tijd, het misschien niet helemaal als het lopen 212 00:12:13,120 --> 00:12:15,490 voorwaarde niet is voldaan. 213 00:12:15,490 --> 00:12:16,740 Voor vragen met dat? 214 00:12:16,740 --> 00:12:20,480 215 00:12:20,480 --> 00:12:22,860 >> Dus de structuur van een lus. 216 00:12:22,860 --> 00:12:23,620 Jullie hebben allemaal gezien. 217 00:12:23,620 --> 00:12:25,320 Je initialiseren. 218 00:12:25,320 --> 00:12:26,600 Je hebt een soort van aandoening. 219 00:12:26,600 --> 00:12:32,340 Dus, bijvoorbeeld, kunnen we initialiseren als voor i gelijk is aan 0. 220 00:12:32,340 --> 00:12:34,040 i kleiner is dan 10. 221 00:12:34,040 --> 00:12:35,442 En ik ++. 222 00:12:35,442 --> 00:12:39,010 Heel simpel een die we hebben gedaan. 223 00:12:39,010 --> 00:12:42,210 >> Voor een tijdje loop, evenzo, je hebt om een ​​soort van initialisatie hebben, 224 00:12:42,210 --> 00:12:44,980 een soort aandoening, en een soort van aanpassing. 225 00:12:44,980 --> 00:12:51,990 Dus we kunnen ons ook uit te voeren voor de lus als een while lus met behulp van deze. 226 00:12:51,990 --> 00:12:56,000 En ook met een do while lus, we misschien wat initialisatie hebben, 227 00:12:56,000 --> 00:12:58,640 voeren iets, updaten, en controleer dan de conditie. 228 00:12:58,640 --> 00:13:03,500 229 00:13:03,500 --> 00:13:05,140 >> Dus nu functioneert. 230 00:13:05,140 --> 00:13:06,460 We zetten alles samen. 231 00:13:06,460 --> 00:13:10,140 We zouden willen wat te schrijven soort functie. 232 00:13:10,140 --> 00:13:12,790 Voorkomende functie die je misschien hebben al gezien is de belangrijkste. 233 00:13:12,790 --> 00:13:13,770 Belangrijkste is een functie. 234 00:13:13,770 --> 00:13:16,160 Het heeft een soort terugkeer, int. 235 00:13:16,160 --> 00:13:18,470 Het heeft een functie naam, de belangrijkste. 236 00:13:18,470 --> 00:13:20,810 En het heeft argumenten, argc en argv. 237 00:13:20,810 --> 00:13:24,040 Dus belangrijkste is gewoon een functie. 238 00:13:24,040 --> 00:13:27,230 >> Andere functies die u zou kunnen hebben gebruikt, printf-- printf is een function-- 239 00:13:27,230 --> 00:13:29,330 GetInt, toupper. 240 00:13:29,330 --> 00:13:32,010 Maar die gebeuren te zijn geweest door geïmplementeerd voor ons 241 00:13:32,010 --> 00:13:33,270 een soort bibliotheek. 242 00:13:33,270 --> 00:13:37,400 Als jullie niet vergeten, waaronder Dit CS50.h bibliotheek of de 243 00:13:37,400 --> 00:13:38,510 standaard I / O library. 244 00:13:38,510 --> 00:13:39,200 Ja, vraag? 245 00:13:39,200 --> 00:13:41,610 >> PUBLIEK: Is main gewoon inherent aan c? 246 00:13:41,610 --> 00:13:44,740 Is het gewoon een soort van [onverstaanbaar]? 247 00:13:44,740 --> 00:13:47,370 >> SPEAKER 1: De vraag is als belangrijkste is inherent aan c. 248 00:13:47,370 --> 00:13:51,460 En ja, alle functies hebben een belangrijke functie. 249 00:13:51,460 --> 00:13:55,290 Het is een soort van nodig zijn voor de computer om te weten waar te beginnen 250 00:13:55,290 --> 00:13:55,993 het uitvoeren van de code. 251 00:13:55,993 --> 00:13:58,108 >> PUBLIEK: Dus je zou het niet [onverstaanbaar]? 252 00:13:58,108 --> 00:13:59,480 >> SPEAKER 1: Nee 253 00:13:59,480 --> 00:14:00,760 Een andere vragen? 254 00:14:00,760 --> 00:14:03,430 255 00:14:03,430 --> 00:14:04,770 Cool. 256 00:14:04,770 --> 00:14:08,050 Dus net zoals je een functie kunt gebruiken dat is geschreven voor u, kunt u ook 257 00:14:08,050 --> 00:14:10,380 schrijf je eigen functie. 258 00:14:10,380 --> 00:14:17,050 Dit is een functie die iemand zou kunnen hebben geschreven om het volume te berekenen 259 00:14:17,050 --> 00:14:18,395 van q, bijvoorbeeld. 260 00:14:18,395 --> 00:14:21,300 261 00:14:21,300 --> 00:14:29,500 Er is een soort terugkeer hier, in dit geval int, onze functie naam q en onze 262 00:14:29,500 --> 00:14:31,360 lijst van parameters. 263 00:14:31,360 --> 00:14:34,550 >> En er rekening mee dat je de gegevens te schrijven soort van de parameter die u wilt 264 00:14:34,550 --> 00:14:38,660 gebruiken of anders de functie niet weten wat voor soort 265 00:14:38,660 --> 00:14:41,650 parameter moet ik accepteren. 266 00:14:41,650 --> 00:14:48,110 Dus, in dit geval, we willen een geheel als onze inbreng. 267 00:14:48,110 --> 00:14:50,390 Dus waarom zouden we willen kunnen gebruiken? 268 00:14:50,390 --> 00:14:52,800 >> Allereerst, geweldig voor de organisatie. 269 00:14:52,800 --> 00:14:56,350 Ze helpen breken uw code in meer georganiseerd brokken en maken 270 00:14:56,350 --> 00:14:57,960 het makkelijker om te lezen. 271 00:14:57,960 --> 00:14:59,760 Vereenvoudiging. 272 00:14:59,760 --> 00:15:01,740 Dit is goed voor het ontwerp. 273 00:15:01,740 --> 00:15:04,570 Als je het lezen van een stukje code en de belangrijkste functie is echt, 274 00:15:04,570 --> 00:15:07,750 echt lang, zou het moeilijker te zijn reden over wat er gaande is. 275 00:15:07,750 --> 00:15:11,710 Dus als je het af te breken in functies, is het misschien makkelijker te lezen zijn. 276 00:15:11,710 --> 00:15:12,750 En hergebruik-mogelijkheden. 277 00:15:12,750 --> 00:15:16,940 Als je een stuk code dat wordt gebeld of lopen meerdere keren, 278 00:15:16,940 --> 00:15:20,690 in plaats van het herschrijven van de code 10 keer in uw belangrijkste functie, zou je 279 00:15:20,690 --> 00:15:21,440 wilt hergebruiken. 280 00:15:21,440 --> 00:15:25,740 En dan elke keer dat je nodig hebt om dat te gebruiken stukje code, bellen met de functie. 281 00:15:25,740 --> 00:15:30,550 282 00:15:30,550 --> 00:15:35,380 >> Dus nu, als we terug naar het niets herinneren, hebben we ook gesproken over een aantal concepten, 283 00:15:35,380 --> 00:15:37,680 waarvan wordt threading. 284 00:15:37,680 --> 00:15:41,120 Draad is het concept van meerdere sequenties van code 285 00:15:41,120 --> 00:15:43,040 uitvoeren tegelijk. 286 00:15:43,040 --> 00:15:47,490 Dus denk terug aan de eerste dag waar David had jullie aftellen van het aantal 287 00:15:47,490 --> 00:15:48,440 mensen in de kamer. 288 00:15:48,440 --> 00:15:50,550 >> Wezen, wat er gaande was on is jullie allemaal jongens waren 289 00:15:50,550 --> 00:15:52,370 lopen aparte threads. 290 00:15:52,370 --> 00:15:55,540 En die draden werden samen komen een soort antwoord. 291 00:15:55,540 --> 00:15:58,890 Ook in Scratch, als je meerdere sprites, zou je 292 00:15:58,890 --> 00:16:01,070 een kat en een hond. 293 00:16:01,070 --> 00:16:08,770 En ze zouden tegelijkertijd worden het runnen van hun eigen scripts. 294 00:16:08,770 --> 00:16:10,020 Dit is een voorbeeld van schroefdraad. 295 00:16:10,020 --> 00:16:12,860 296 00:16:12,860 --> 00:16:18,000 >> En de andere concept dat was geïntroduceerd in het niets was gebeurtenissen. 297 00:16:18,000 --> 00:16:22,550 En gebeurtenissen zijn wanneer er meerdere delen van uw code met elkaar communiceren. 298 00:16:22,550 --> 00:16:26,840 In Scratch, was dit wanneer u gebruikt de broadcast-controle en het Toen ik 299 00:16:26,840 --> 00:16:29,500 Ontvang blokken. 300 00:16:29,500 --> 00:16:35,170 >> En ook, in Probleem Set 4, zagen we een beetje van evenementen. 301 00:16:35,170 --> 00:16:38,250 Jullie zouden hebben gebruikt het gevent bibliotheek. 302 00:16:38,250 --> 00:16:42,450 En er was een functie waitForClick waarin u zaten te wachten 303 00:16:42,450 --> 00:16:44,300 voor de gebruiker om te klikken. 304 00:16:44,300 --> 00:16:47,870 En uw klik, in dit geval zou zijn het evenement en wacht klik is uw 305 00:16:47,870 --> 00:16:49,120 event handler. 306 00:16:49,120 --> 00:16:53,690 307 00:16:53,690 --> 00:16:58,630 >> En ook, gedurende het runnen van uw psets en werken aan je psets, u 308 00:16:58,630 --> 00:17:01,920 misschien in contact komen met zijn gekomen sommige van deze commando's. 309 00:17:01,920 --> 00:17:05,579 Dit is wat je getypt in uw terminalvenster of wat dan ook venster 310 00:17:05,579 --> 00:17:12,119 dat verschijnt op uw g bewerking om, wezen, navigeer je computer. 311 00:17:12,119 --> 00:17:19,440 >> Dus bijvoorbeeld, LS worden de inhoud van een directory. 312 00:17:19,440 --> 00:17:22,510 Maak map een nieuwe map creëert. 313 00:17:22,510 --> 00:17:24,819 CD, change directory. 314 00:17:24,819 --> 00:17:28,400 RM, verwijdert, verwijdert een bestand of een directory. 315 00:17:28,400 --> 00:17:31,050 En verwijder vervolgens directory verwijdert een directory. 316 00:17:31,050 --> 00:17:32,300 >> PUBLIEK: [onverstaanbaar]? 317 00:17:32,300 --> 00:17:36,978 318 00:17:36,978 --> 00:17:38,370 >> SPEAKER 1: Ja, natuurlijk. 319 00:17:38,370 --> 00:17:42,530 320 00:17:42,530 --> 00:17:46,040 Sorry, de vraag was of je zou voorstellen om deze 321 00:17:46,040 --> 00:17:48,840 op het spiekbriefje. 322 00:17:48,840 --> 00:17:49,440 Het zou kunnen helpen. 323 00:17:49,440 --> 00:17:51,490 Als u ruimte, kunt u het op. 324 00:17:51,490 --> 00:17:56,170 Het is ook gewoon over het algemeen goed genoeg om te onthouden, want als je het gebruikt 325 00:17:56,170 --> 00:17:59,060 wilt u misschien gewoon hebben in het geheugen. 326 00:17:59,060 --> 00:18:02,750 Dat zal je leven een stuk makkelijker maken. 327 00:18:02,750 --> 00:18:04,000 Heb ik je vraag beantwoord? 328 00:18:04,000 --> 00:18:10,528 329 00:18:10,528 --> 00:18:14,290 >> Dus nu, spraken we een beetje kort over bibliotheken. 330 00:18:14,290 --> 00:18:18,570 Maar de twee belangrijkste zijn dat we geweest zijn middels dusver in de cursus 331 00:18:18,570 --> 00:18:20,860 standaard I / O en CS50. 332 00:18:20,860 --> 00:18:25,410 Wat voor soort dingen zijn opgenomen in de standaard I / O-bibliotheek? 333 00:18:25,410 --> 00:18:28,410 >> Ja, tot nu toe die we hebben gebruikt printf. 334 00:18:28,410 --> 00:18:31,150 In CS50, hebben we gebruikt getInt en GetString. 335 00:18:31,150 --> 00:18:37,200 En het type data reeks gebeurt ook te worden verklaard in deze CS50 bibliotheek. 336 00:18:37,200 --> 00:18:40,250 We zullen een beetje meer praten in de diepte over hoe bibliotheken werken en hoe ze 337 00:18:40,250 --> 00:18:41,870 interactie met de rest van je code. 338 00:18:41,870 --> 00:18:46,220 Maar dat zijn de twee belangrijkste zijn dat we in contact zijn gekomen met de tot nu toe in 339 00:18:46,220 --> 00:18:48,430 de cursus. 340 00:18:48,430 --> 00:18:50,050 >> Types. 341 00:18:50,050 --> 00:18:58,120 Deze zijn goed om te onthouden hoeveel elk wordt voorgesteld door of hoe 342 00:18:58,120 --> 00:19:02,840 veel bytes elk type requires-- 343 00:19:02,840 --> 00:19:04,990 int, 4 bytes; char, 1 byte. 344 00:19:04,990 --> 00:19:06,550 Float is 4 bytes. 345 00:19:06,550 --> 00:19:07,782 Wat is een dubbele? 346 00:19:07,782 --> 00:19:09,032 >> PUBLIEK: [onverstaanbaar]. 347 00:19:09,032 --> 00:19:11,398 348 00:19:11,398 --> 00:19:16,240 >> SPEAKER 1: Ja, dus een vlotter maar het dubbele van de grootte. 349 00:19:16,240 --> 00:19:17,150 Hoe zit het met een lange? 350 00:19:17,150 --> 00:19:18,400 >> PUBLIEK: [onverstaanbaar]. 351 00:19:18,400 --> 00:19:21,614 352 00:19:21,614 --> 00:19:24,680 >> SPEAKER 1: OK. 353 00:19:24,680 --> 00:19:25,410 Wat is een lange? 354 00:19:25,410 --> 00:19:26,660 >> PUBLIEK: [onverstaanbaar]. 355 00:19:26,660 --> 00:19:29,400 356 00:19:29,400 --> 00:19:31,450 >> SPEAKER 1: Ja, het dubbele van een int. 357 00:19:31,450 --> 00:19:34,240 358 00:19:34,240 --> 00:19:34,705 Ja. 359 00:19:34,705 --> 00:19:36,100 >> PUBLIEK: [onverstaanbaar]. 360 00:19:36,100 --> 00:19:38,030 >> SPEAKER 1: Lange [onverstaanbaar]. 361 00:19:38,030 --> 00:19:41,860 En dan is een lange lange is het dubbele. 362 00:19:41,860 --> 00:19:42,814 >> PUBLIEK: Nee, nee. 363 00:19:42,814 --> 00:19:47,107 Een lang is gewoon een int. 364 00:19:47,107 --> 00:19:50,910 Het hangt van de architectuur vóór de [onverstaanbaar] 365 00:19:50,910 --> 00:19:52,922 en int hebben dezelfde grootte. 366 00:19:52,922 --> 00:19:54,172 [Onverstaanbaar]. 367 00:19:54,172 --> 00:19:58,841 368 00:19:58,841 --> 00:20:00,920 >> SPEAKER 1: Dus een lange en een int zijn hetzelfde. 369 00:20:00,920 --> 00:20:02,943 En dan een lange lange is het dubbele van de int. 370 00:20:02,943 --> 00:20:03,910 Cool. 371 00:20:03,910 --> 00:20:05,550 En dan, wat is het laatste type? 372 00:20:05,550 --> 00:20:06,510 >> PUBLIEK: Pointer. 373 00:20:06,510 --> 00:20:10,350 >> SPEAKER 1: Ja, dus we geleerd een beetje over pointers. 374 00:20:10,350 --> 00:20:14,015 En ongeacht wat een pointer is wijzen om-- het kan een char ster 375 00:20:14,015 --> 00:20:15,880 of een int star-- 376 00:20:15,880 --> 00:20:20,530 het is altijd 4 bytes voor een pointer. 377 00:20:20,530 --> 00:20:21,633 Vragen over dat? 378 00:20:21,633 --> 00:20:22,116 Ja? 379 00:20:22,116 --> 00:20:24,531 >> PUBLIEK: [onverstaanbaar]? 380 00:20:24,531 --> 00:20:29,530 >> SPEAKER 1: Dus een lange en een int zijn hetzelfde in dit CS50 apparaat. 381 00:20:29,530 --> 00:20:32,302 >> Publiek: Het apparaat is volledig verwisselbaar. 382 00:20:32,302 --> 00:20:33,510 >> SPEAKER 1: Ja. 383 00:20:33,510 --> 00:20:36,610 Dus dan is een lange lange is dubbel een int. 384 00:20:36,610 --> 00:20:39,250 >> Publiek: Dit is de 32 bit? 385 00:20:39,250 --> 00:20:40,620 >> SPEAKER 1: 32 bit, ja. 386 00:20:40,620 --> 00:20:43,572 >> PUBLIEK: Dus [onverstaanbaar]? 387 00:20:43,572 --> 00:20:46,790 >> SPEAKER 1: Ja, als het niet expliciet zeggen, je 388 00:20:46,790 --> 00:20:47,870 moet 32 ​​bits nemen. 389 00:20:47,870 --> 00:20:50,040 >> Publiek: Het zou iets te zeggen zoals uitgaande van een 390 00:20:50,040 --> 00:20:51,498 architectuur, zoals het apparaat. 391 00:20:51,498 --> 00:20:58,800 392 00:20:58,800 --> 00:21:01,710 Voor 64 bit, de enige dingen die verandering zijn longs en pointers. 393 00:21:01,710 --> 00:21:05,614 Beiden [onverstaanbaar]. 394 00:21:05,614 --> 00:21:06,590 >> SPEAKER 1: Ja? 395 00:21:06,590 --> 00:21:07,566 >> PUBLIEK: Vraag. 396 00:21:07,566 --> 00:21:10,982 Dus op een van de praktijk quizzen, het vraagt ​​over een unsigned int. 397 00:21:10,982 --> 00:21:15,374 Dus hoe zou dat worden bepaald van een int [onverstaanbaar]? 398 00:21:15,374 --> 00:21:18,140 >> SPEAKER 1: Een unsigned in is 4 bytes. 399 00:21:18,140 --> 00:21:21,172 Maar wat anders is aan een getekend is int en een unsigned int? 400 00:21:21,172 --> 00:21:22,422 >> PUBLIEK: [onverstaanbaar]. 401 00:21:22,422 --> 00:21:24,868 402 00:21:24,868 --> 00:21:25,630 >> SPEAKER 1: Recht. 403 00:21:25,630 --> 00:21:27,570 Men kan negatieve waarden vertegenwoordigen. 404 00:21:27,570 --> 00:21:28,580 Maar hoe komt het dat doen? 405 00:21:28,580 --> 00:21:30,536 >> PUBLIEK: [onverstaanbaar]. 406 00:21:30,536 --> 00:21:36,370 >> SPEAKER 1: Ja, het bespaart 1 beetje aan het bord te vertegenwoordigen. 407 00:21:36,370 --> 00:21:40,910 408 00:21:40,910 --> 00:21:45,040 De ondertekende heeft een bit dat vertegenwoordigt het teken. 409 00:21:45,040 --> 00:21:48,886 En unsigned gewoon alle positieven. 410 00:21:48,886 --> 00:21:50,365 >> PUBLIEK: OK. 411 00:21:50,365 --> 00:21:54,230 Dus je zegt dat een dubbele is twee keer de grootte van een vlotter? 412 00:21:54,230 --> 00:21:58,202 >> SPEAKER 1: Dubbel is tweemaal de grootte van een vlotter, ja. 413 00:21:58,202 --> 00:22:01,639 >> Publiek: Hoe werkt een pointer een lange lange [onverstaanbaar]? 414 00:22:01,639 --> 00:22:06,058 415 00:22:06,058 --> 00:22:10,870 >> SPEAKER 1: Dus de vraag is hoe werkt de aanwijzer om een ​​lange long-- 416 00:22:10,870 --> 00:22:13,800 hoe is dat slechts vier bytes bij een lange lange haar 8 bytes. 417 00:22:13,800 --> 00:22:17,310 Dus onthoud wat is een pointer, wezen, aan de basis waarde. 418 00:22:17,310 --> 00:22:19,046 >> PUBLIEK: [onverstaanbaar]. 419 00:22:19,046 --> 00:22:22,670 >> SPEAKER 1: Ja, dus een pointer is gewoon een geheugen locatie. 420 00:22:22,670 --> 00:22:28,040 Dus het maakt niet uit hoeveel ruimte dat pointer wijst. 421 00:22:28,040 --> 00:22:32,060 Het moet alleen 4 bytes om bij te houden van dat geheugen locatie. 422 00:22:32,060 --> 00:22:34,760 423 00:22:34,760 --> 00:22:36,010 Een andere vragen? 424 00:22:36,010 --> 00:22:39,800 425 00:22:39,800 --> 00:22:41,050 Cool. 426 00:22:41,050 --> 00:22:42,920 427 00:22:42,920 --> 00:22:47,460 >> Dus het laatste wat ik heb is standaard output. 428 00:22:47,460 --> 00:22:51,020 Je moet ze vaak te gebruiken genoeg dat je kan herinneren. 429 00:22:51,020 --> 00:22:54,800 Maar dit is wanneer we gebruik maken van printf bijvoorbeeld. 430 00:22:54,800 --> 00:22:59,260 En we hebben deze placeholders die werden genoemd formaat codes. 431 00:22:59,260 --> 00:23:03,910 >> Dus procent c char, procent i voor int, en we kunnen ook gebruik maken procent d. 432 00:23:03,910 --> 00:23:05,130 Het is hetzelfde ding. 433 00:23:05,130 --> 00:23:08,200 Maar, over het algemeen, in CS50 we probeer procent i gebruiken. 434 00:23:08,200 --> 00:23:09,860 Procent f voor float. 435 00:23:09,860 --> 00:23:15,620 Procent ld voor lange lange en procent s voor string. 436 00:23:15,620 --> 00:23:18,550 >> Ook hebben we gebruik gemaakt van een paar van deze escape sequences. 437 00:23:18,550 --> 00:23:22,431 Bijvoorbeeld, backslash n voor de nieuwe lijn. 438 00:23:22,431 --> 00:23:26,910 Dit is alleen voor wanneer u formatteert uw code voor print f. 439 00:23:26,910 --> 00:23:27,260 Ja? 440 00:23:27,260 --> 00:23:28,906 >> Publiek: Wat procent d voor? 441 00:23:28,906 --> 00:23:31,850 >> SPEAKER 1: Dus de vraag is wat is d procent voor? 442 00:23:31,850 --> 00:23:33,270 Procent d is voor ints. 443 00:23:33,270 --> 00:23:37,392 Percentage d en i procent zijn hetzelfde. 444 00:23:37,392 --> 00:23:41,130 >> Publiek: Wat is het verschil tussen backslash n en backslash r? 445 00:23:41,130 --> 00:23:45,300 >> SPEAKER 1: De vraag is dus wat is het verschil tussen speling n en 446 00:23:45,300 --> 00:23:48,615 speling r? 447 00:23:48,615 --> 00:23:50,906 Ik denk backslash r is-- 448 00:23:50,906 --> 00:23:54,340 >> PUBLIEK: Dus backslash r impliceert net terug naar het begin van de regel 449 00:23:54,340 --> 00:23:56,670 zonder daadwerkelijk te gaan naar een nieuwe regel. 450 00:23:56,670 --> 00:24:01,000 Dus als je een backslash r afdrukken en u ga terug naar het begin van de regel 451 00:24:01,000 --> 00:24:04,005 dan heb je meer spullen af ​​te drukken, kunt overschrijven de dingen die al op 452 00:24:04,005 --> 00:24:04,390 [Onverstaanbaar]. 453 00:24:04,390 --> 00:24:06,725 Overwegende dat, n eigenlijk gaat om een ​​nieuwe lijn en gaat naar [onverstaanbaar]. 454 00:24:06,725 --> 00:24:10,525 455 00:24:10,525 --> 00:24:13,915 >> SPEAKER 1: Nou, nog andere vragen? 456 00:24:13,915 --> 00:24:15,430 Oke. 457 00:24:15,430 --> 00:24:18,617 Ik ga het de hand uit naar Dan die zullen blijven. 458 00:24:18,617 --> 00:24:25,078 >> [Applaus] 459 00:24:25,078 --> 00:25:08,814 460 00:25:08,814 --> 00:25:09,720 >> DAN: Alle righty. 461 00:25:09,720 --> 00:25:18,590 Dus ik zal het over een andere grote waaier van ideeën uit de klasse die zijn 462 00:25:18,590 --> 00:25:23,220 ruwweg representatief week twee en het begin van de week drie wegrijden 463 00:25:23,220 --> 00:25:28,690 met gieten, dat is gewoon een manier van behandelen van een waarde van een bepaald type als 464 00:25:28,690 --> 00:25:30,830 een waarde van een ander type. 465 00:25:30,830 --> 00:25:34,110 Dus we kunnen dit doen met chars naar ints, drijft naar ints, en 466 00:25:34,110 --> 00:25:35,360 lange longs te verdubbelen. 467 00:25:35,360 --> 00:25:38,170 468 00:25:38,170 --> 00:25:44,500 >> Al deze dingen kunnen worden gebruikt als middelen behandelen van bepaalde numerieke waarde 469 00:25:44,500 --> 00:25:48,370 minus char als sommige andere numerieke waarde. 470 00:25:48,370 --> 00:25:54,480 Dus er zijn een aantal problemen met deze, van cursus, die komt wanneer u werpen 471 00:25:54,480 --> 00:25:57,860 dingen als float naar ints. 472 00:25:57,860 --> 00:26:00,500 Dus dit is een beetje raar. 473 00:26:00,500 --> 00:26:03,170 We hebben een float die is 1,31. 474 00:26:03,170 --> 00:26:05,220 We vermenigvuldigen met 10.000. 475 00:26:05,220 --> 00:26:08,380 En dan af te drukken wij het als een int. 476 00:26:08,380 --> 00:26:09,630 Wat doet deze output? 477 00:26:09,630 --> 00:26:11,600 478 00:26:11,600 --> 00:26:14,020 10.000 keer 1,31. 479 00:26:14,020 --> 00:26:18,761 Dus 13.000, is dat de gok? 480 00:26:18,761 --> 00:26:20,685 >> Publiek: Ik denk dat het 10.000. 481 00:26:20,685 --> 00:26:24,234 >> DAN: Dus ik doe het vermenigvuldigen met 10.000 voordat ik het gieten. 482 00:26:24,234 --> 00:26:25,202 >> PUBLIEK: Oh. 483 00:26:25,202 --> 00:26:27,622 Zou er een 9 en sommige nummers 0? 484 00:26:27,622 --> 00:26:29,270 >> DAN: Je zou kunnen hebben een aantal rare cijfers. 485 00:26:29,270 --> 00:26:32,410 486 00:26:32,410 --> 00:26:37,670 Zo goed, het is 1,3 keer 10.000. 487 00:26:37,670 --> 00:26:40,040 Dus dat is 13.000. 488 00:26:40,040 --> 00:26:41,313 En deze extra weird-- 489 00:26:41,313 --> 00:26:42,160 >> PUBLIEK: 13.100. 490 00:26:42,160 --> 00:26:42,650 >> DAN: 13.100. 491 00:26:42,650 --> 00:26:44,910 Dank je, Rob. 492 00:26:44,910 --> 00:26:46,610 En deze extra weirdness-- 493 00:26:46,610 --> 00:26:48,060 dit 9,9-- 494 00:26:48,060 --> 00:26:53,860 is simpelweg omdat deze casting belandde afronding naar beneden waar 495 00:26:53,860 --> 00:26:55,394 het moet niet. 496 00:26:55,394 --> 00:26:55,871 Yeah. 497 00:26:55,871 --> 00:26:58,256 >> Publiek: Het gieten gebeurt Na iets anders? 498 00:26:58,256 --> 00:27:03,865 >> DAN: Dus omdat ik dit in print, het doet deze vermenigvuldiging voor het 499 00:27:03,865 --> 00:27:05,230 Dit doet casting. 500 00:27:05,230 --> 00:27:06,140 >> PUBLIEK: [onverstaanbaar]. 501 00:27:06,140 --> 00:27:11,350 >> DAN: Ik denk dat het eerst zou werpen, ja, die zou zijn 10.000. 502 00:27:11,350 --> 00:27:12,610 Iets anders? 503 00:27:12,610 --> 00:27:13,330 Cool. 504 00:27:13,330 --> 00:27:16,344 Dus dit is 13.099. 505 00:27:16,344 --> 00:27:17,840 Waarom gebeurt dit? 506 00:27:17,840 --> 00:27:18,900 Onnauwkeurigheid. 507 00:27:18,900 --> 00:27:21,020 >> Praalwagens zijn niet perfect. 508 00:27:21,020 --> 00:27:27,550 Ze kunnen alleen nummers een vertegenwoordigen aantal significante cijfers. 509 00:27:27,550 --> 00:27:35,120 Dus als we uitprinten 8 sig vijgen op Deze vlotter, krijgen we een soort van 510 00:27:35,120 --> 00:27:36,800 lelijke nummer. 511 00:27:36,800 --> 00:27:45,580 En dat komt omdat 1,31 kan niet nauwkeurig worden vertegenwoordigd door een eenvoudige 512 00:27:45,580 --> 00:27:49,000 machten van twee in de machine. 513 00:27:49,000 --> 00:27:53,530 Dus het eindigt het nemen van de dichtst raden, dat eindigt 514 00:27:53,530 --> 00:27:55,710 een beetje laag. 515 00:27:55,710 --> 00:27:57,730 Zinvol? 516 00:27:57,730 --> 00:27:59,110 OK. 517 00:27:59,110 --> 00:28:05,840 >> Nu, geschakeld zijn een andere manier van doet conditionele uitspraken waar alle 518 00:28:05,840 --> 00:28:09,900 we de zorg over een enkele variabele. 519 00:28:09,900 --> 00:28:16,570 Dus in dit specifieke voorbeeld, we zijn steeds een geheel getal van de gebruiker. 520 00:28:16,570 --> 00:28:21,070 En dan zijn we op zoek naar wat dat integer is. 521 00:28:21,070 --> 00:28:23,500 Vermoedelijk is het aantal tussen de een en vier. 522 00:28:23,500 --> 00:28:24,800 Dat is wat we vragen. 523 00:28:24,800 --> 00:28:28,450 >> Dus je moet een schakelaar van doen de naam van de variabele. 524 00:28:28,450 --> 00:28:34,290 Dan moet je het opzetten van gevallen van mogelijke waardeert het zou kunnen zijn. 525 00:28:34,290 --> 00:28:37,730 Dus het geval een, zeggen dat het laag. 526 00:28:37,730 --> 00:28:41,080 En dan breek je om eruit te komen van de schakelaar staat dus 527 00:28:41,080 --> 00:28:43,270 je hoeft niet door te gaan. 528 00:28:43,270 --> 00:28:44,830 >> In de volgende geval-- 529 00:28:44,830 --> 00:28:46,940 dus geval twee en case three-- 530 00:28:46,940 --> 00:28:51,920 als het geval twee zakt gewoon naar beneden te de eerste regel van de code het ziet als met 531 00:28:51,920 --> 00:28:55,400 case drie totdat hij ziet een pauze. 532 00:28:55,400 --> 00:29:00,430 Dus de reden dat je krijgt bij een tot alleen druk laag is, omdat ik 533 00:29:00,430 --> 00:29:01,890 hier hebben deze pauze. 534 00:29:01,890 --> 00:29:05,360 Als ik, zeg, negeerde dit break-- als ik gooide dit breakaway-- 535 00:29:05,360 --> 00:29:09,740 het laag zou afdrukken, en dan zou het afdrukken midden, en dan zou het breken. 536 00:29:09,740 --> 00:29:12,200 >> Dus pauzes zijn een belangrijk onderdeel van schakelen voorwaarden en 537 00:29:12,200 --> 00:29:14,340 ze moeten er zijn. 538 00:29:14,340 --> 00:29:20,070 Alle gevallen die niet expliciet zijn vermeld worden door de standaard 539 00:29:20,070 --> 00:29:26,645 geval de schakelaar en moet worden gegoten. 540 00:29:26,645 --> 00:29:31,363 >> PUBLIEK: Dus 1, 2, 3, en 4 zouden n zijn? 541 00:29:31,363 --> 00:29:33,310 >> DAN: Waarden die n kan zijn. 542 00:29:33,310 --> 00:29:34,654 Ja. 543 00:29:34,654 --> 00:29:35,146 Yeah? 544 00:29:35,146 --> 00:29:37,606 >> PUBLIEK: Dus als je dat [onverstaanbaar]? 545 00:29:37,606 --> 00:29:44,002 546 00:29:44,002 --> 00:29:46,830 >> DAN: Je zou laag af te drukken, en vervolgens zou het midden te drukken, en 547 00:29:46,830 --> 00:29:47,400 dan zou breken. 548 00:29:47,400 --> 00:29:50,244 >> PUBLIEK: Waarom zou het af te drukken midden als [onverstaanbaar]? 549 00:29:50,244 --> 00:29:54,036 550 00:29:54,036 --> 00:30:00,550 >> DAN: Dus alles onder een case voordat er een pauze valt onder. 551 00:30:00,550 --> 00:30:09,390 Dus het geval een afdruk eronder geval men zoals deze volgende afdrukopties. 552 00:30:09,390 --> 00:30:09,890 Yeah? 553 00:30:09,890 --> 00:30:11,140 >> PUBLIEK: [onverstaanbaar]? 554 00:30:11,140 --> 00:30:15,890 555 00:30:15,890 --> 00:30:22,170 >> DAN: Dus dit nummer is gewoon een bijzonder waarde dat deze variabele 556 00:30:22,170 --> 00:30:23,420 kan nemen, toch? 557 00:30:23,420 --> 00:30:26,740 558 00:30:26,740 --> 00:30:28,490 Heeft dat zin? 559 00:30:28,490 --> 00:30:28,990 Yeah. 560 00:30:28,990 --> 00:30:31,490 >> PUBLIEK: [onverstaanbaar]? 561 00:30:31,490 --> 00:30:34,130 >> DAN: Ja, bij twee zouden afdrukken midden en dan breken. 562 00:30:34,130 --> 00:30:35,380 >> PUBLIEK: [onverstaanbaar]? 563 00:30:35,380 --> 00:30:37,954 564 00:30:37,954 --> 00:30:40,050 >> DAN: Ik denk dat elke? 565 00:30:40,050 --> 00:30:43,855 Welke andere soorten data kunt u overschakelen? 566 00:30:43,855 --> 00:30:46,320 >> PUBLIEK: U kunt schakelen over een gegevenstypen. 567 00:30:46,320 --> 00:30:50,905 Maar het betekent slechts iets meer dan chars en ints en dat soort dingen, want 568 00:30:50,905 --> 00:30:55,600 als je dan overstapt van een pointer dat niet echt zinvol, 569 00:30:55,600 --> 00:30:59,555 omschakelen belastingen, indien zelfs laten doe je dat, als gevolg van floating point 570 00:30:59,555 --> 00:31:02,840 in precisie, zou je niet echt willen dat toch te doen. 571 00:31:02,840 --> 00:31:07,320 Dus vrij veel, gewoon ints en chars en dat soort dingen. 572 00:31:07,320 --> 00:31:12,360 >> DAN: Ja, het is als je expliciet hebt waarden die u weet, denk ik, kan zijn 573 00:31:12,360 --> 00:31:14,250 dat een schakelaar is werkelijk nuttig. 574 00:31:14,250 --> 00:31:17,094 575 00:31:17,094 --> 00:31:18,990 Goed? 576 00:31:18,990 --> 00:31:21,370 OK. 577 00:31:21,370 --> 00:31:26,180 >> Scope is het bereik dat een verklaard variabele uitstrekt. 578 00:31:26,180 --> 00:31:32,190 Dus in dit kleine stuk code die ik heb, het vol fouten zou zijn. 579 00:31:32,190 --> 00:31:41,450 En de reden is dat ik verklaarde deze int i binnen de werkingssfeer van deze for-lus. 580 00:31:41,450 --> 00:31:46,390 En dan probeer ik te verwijzen naar die ik buiten die lus scope. 581 00:31:46,390 --> 00:31:50,330 >> Dus eigenlijk, kunt u na te denken over scope als iets dat je verklaren 582 00:31:50,330 --> 00:31:59,750 met daarin een set van accolades alleen bestaat binnen de accolades. 583 00:31:59,750 --> 00:32:04,990 En als je probeert te gebruiken die variabele buiten deze accolades, zult u 584 00:32:04,990 --> 00:32:08,356 krijg een foutmelding van de compiler. 585 00:32:08,356 --> 00:32:08,812 Yeah? 586 00:32:08,812 --> 00:32:09,724 >> PUBLIEK: Dus dit niet werkt? 587 00:32:09,724 --> 00:32:11,790 >> DAN: Dit werkt niet, ja. 588 00:32:11,790 --> 00:32:17,190 589 00:32:17,190 --> 00:32:18,660 Snaren. 590 00:32:18,660 --> 00:32:19,780 String een char *. 591 00:32:19,780 --> 00:32:22,250 Ze zijn precies hetzelfde. 592 00:32:22,250 --> 00:32:25,540 Ze zijn gewoon verwijzingen naar karakters. 593 00:32:25,540 --> 00:32:33,000 En alle strings die je moet eindigen met backslash nul, dat is gewoon 594 00:32:33,000 --> 00:32:34,410 een c conventie. 595 00:32:34,410 --> 00:32:36,680 >> Het heet de NULL terminator. 596 00:32:36,680 --> 00:32:39,050 En NULL-- 597 00:32:39,050 --> 00:32:41,670 hoofdstad N, de hoofdstad U, hoofdstad L, hoofdstad L-- 598 00:32:41,670 --> 00:32:44,290 is niet hetzelfde als de NULL terminator. 599 00:32:44,290 --> 00:32:46,640 Dit is een pointer. 600 00:32:46,640 --> 00:32:48,280 Dit is een karakter. 601 00:32:48,280 --> 00:32:49,530 Ze zijn zeer verschillend. 602 00:32:49,530 --> 00:32:50,200 Onthouden. 603 00:32:50,200 --> 00:32:52,320 Het zal op de quiz, waarschijnlijk. 604 00:32:52,320 --> 00:32:54,040 Ik heb niet gezien dat de quiz. 605 00:32:54,040 --> 00:32:57,880 606 00:32:57,880 --> 00:32:58,840 Yeah? 607 00:32:58,840 --> 00:33:01,232 >> Publiek: Dus NULL is, laten we zeggen, de wijzer? 608 00:33:01,232 --> 00:33:01,995 >> DAN: Ja. 609 00:33:01,995 --> 00:33:05,170 >> Publiek: Wat doet [onverstaanbaar]? 610 00:33:05,170 --> 00:33:10,050 >> DAN: als, laten we zeggen, malloc wordt genoemd wanneer u niet genoeg geheugen om niet 611 00:33:10,050 --> 00:33:14,400 ongeacht hun grootte je vraagt, malloc zal terugkeren NULL. 612 00:33:14,400 --> 00:33:19,550 Het is, in principe, wanneer een functie verondersteld een pointer terug, je 613 00:33:19,550 --> 00:33:22,600 moeten controleren tegen NULL omdat NULL is een mooie goed-- 614 00:33:22,600 --> 00:33:25,260 het is, een soort van, de vuilnis waarde. 615 00:33:25,260 --> 00:33:27,050 Het is een nul zover pointers gaan. 616 00:33:27,050 --> 00:33:29,630 617 00:33:29,630 --> 00:33:32,250 >> Wanneer u een functie aan te roepen, dat geeft een pointer. 618 00:33:32,250 --> 00:33:35,960 Je gaat te willen controleren om te zorgen dat die pointer niet NULL 619 00:33:35,960 --> 00:33:37,760 omdat NULL is heel gebruikelijk. 620 00:33:37,760 --> 00:33:40,160 Het is een soort van een vuilnisbak terugkeer. 621 00:33:40,160 --> 00:33:44,902 Dus als er iets niet goed deed gaan, gewoon terug NULL plaats. 622 00:33:44,902 --> 00:33:45,898 >> PUBLIEK: [onverstaanbaar]? 623 00:33:45,898 --> 00:33:48,922 >> DAN: Ja, en dat is dit. 624 00:33:48,922 --> 00:33:51,750 >> PUBLIEK: [onverstaanbaar]? 625 00:33:51,750 --> 00:33:52,800 >> DAN: Spell het als dit. 626 00:33:52,800 --> 00:33:54,150 Het is de NULL terminator. 627 00:33:54,150 --> 00:33:56,560 Het kleine N-U-L-L als je bent te spellen. 628 00:33:56,560 --> 00:33:59,860 >> PUBLIEK: En ik ging gewoon heen en getest. 629 00:33:59,860 --> 00:34:03,010 En als je probeert om een ​​floating point gezet waarde in een schakelaar, zal het tegen je schreeuwen 630 00:34:03,010 --> 00:34:05,916 zeggen, verklaring vereist uitdrukking van integer type. 631 00:34:05,916 --> 00:34:07,166 >> DAN: Daar ga je. 632 00:34:07,166 --> 00:34:09,639 633 00:34:09,639 --> 00:34:12,246 Maar ja, wat was de vraag ook alweer? 634 00:34:12,246 --> 00:34:13,496 >> PUBLIEK: [onverstaanbaar]? 635 00:34:13,496 --> 00:34:16,150 636 00:34:16,150 --> 00:34:23,679 >> DAN: Dus hoofdstad N, de hoofdstad van U, de hoofdstad L, de hoofdstad L is een echte c ding. 637 00:34:23,679 --> 00:34:29,719 Het is de NULL-pointer en zal alleen als zodanig worden behandeld. 638 00:34:29,719 --> 00:34:33,530 Je zal nooit proberen en spellen het NULL karakter en zien geen 639 00:34:33,530 --> 00:34:35,630 anders dan deze. 640 00:34:35,630 --> 00:34:36,610 Yeah? 641 00:34:36,610 --> 00:34:42,490 >> PUBLIEK: Dus terug naar char max of iets wat in de toelichting, zou het 642 00:34:42,490 --> 00:34:43,960 belichamen dezelfde functie als [onverstaanbaar]? 643 00:34:43,960 --> 00:34:50,655 644 00:34:50,655 --> 00:34:54,949 >> PUBLIEK: Dus bent u verwijzen naar terug char max uit getchar, of 645 00:34:54,949 --> 00:34:55,444 wat het ook is? 646 00:34:55,444 --> 00:34:55,940 >> Publiek: Ja. 647 00:34:55,940 --> 00:34:58,620 >> Publiek: Ja, dus de algemene term voor al die dingen 648 00:34:58,620 --> 00:34:59,920 zijn sentinel waarden. 649 00:34:59,920 --> 00:35:03,640 Dus als terugkerende int max van getInt en char max uit getchar, het is 650 00:35:03,640 --> 00:35:06,010 verondersteld te zijn zoals, oke, als deze zaken zijn terug te keren naar ons, 651 00:35:06,010 --> 00:35:07,210 ging er iets mis. 652 00:35:07,210 --> 00:35:09,950 >> Voor tips, we hebben toevallig deze sentinel waarde die iedereen 653 00:35:09,950 --> 00:35:10,750 stemt in met. 654 00:35:10,750 --> 00:35:13,210 En dit is het ding dat je terugkeert als er dingen fout gaan. 655 00:35:13,210 --> 00:35:15,910 Dus char max is wat we gebruiken iets vertegenwoordigen 656 00:35:15,910 --> 00:35:18,100 zoals NULL of getchar. 657 00:35:18,100 --> 00:35:23,420 >> PUBLIEK: Dus als u test getchar, kon je gewoon NULL? 658 00:35:23,420 --> 00:35:23,910 Zou dat een verschil maken? 659 00:35:23,910 --> 00:35:25,400 >> DAN: Je kon niet zomaar controleren NULL. 660 00:35:25,400 --> 00:35:30,130 Je zou char max omdat de te controleren terugkeerwaarde van de functie 661 00:35:30,130 --> 00:35:35,416 een personage niet een pointer. 662 00:35:35,416 --> 00:35:35,888 Yeah? 663 00:35:35,888 --> 00:35:38,248 >> Doelgroep: Deze vraag stelt voor de lengte van de string. 664 00:35:38,248 --> 00:35:40,136 Doet dat de NULL karakter bevatten? 665 00:35:40,136 --> 00:35:41,000 >> DAN: Nee 666 00:35:41,000 --> 00:35:45,930 En dat is eigenlijk hoe tekenreekslengte weet stoppen omdat doorloopt 667 00:35:45,930 --> 00:35:49,070 array van tekens tot hij ziet een NULL karakter. 668 00:35:49,070 --> 00:35:51,030 En dan is het net als alle Goed, ik ben klaar. 669 00:35:51,030 --> 00:35:52,130 >> PUBLIEK: [onverstaanbaar] vijf? 670 00:35:52,130 --> 00:35:53,990 >> DAN: Hallo zou vijf zijn. 671 00:35:53,990 --> 00:35:55,240 Yep. 672 00:35:55,240 --> 00:35:59,580 673 00:35:59,580 --> 00:36:02,880 Dus arrays continu geheugenblokken. 674 00:36:02,880 --> 00:36:08,480 Ze hebben direct toegang door te zeggen dat de naam van de array en vervolgens, in krullende 675 00:36:08,480 --> 00:36:16,720 bretels, welke index u wilt gaan aan, ze geïndexeerd vanaf nul tot 676 00:36:16,720 --> 00:36:20,100 de lengte van de array minus 1. 677 00:36:20,100 --> 00:36:23,070 >> En ze zijn verklaard door de aard van de ding dat je het opslaan in het 678 00:36:23,070 --> 00:36:29,750 array, de naam van de array, en ongeacht de grootte is van die array. 679 00:36:29,750 --> 00:36:36,660 Dus dit is een char array met lengte zes dat deze waarden heeft. 680 00:36:36,660 --> 00:36:42,050 681 00:36:42,050 --> 00:36:42,700 Yeah? 682 00:36:42,700 --> 00:36:43,950 >> PUBLIEK: [onverstaanbaar]? 683 00:36:43,950 --> 00:36:47,980 684 00:36:47,980 --> 00:36:48,460 >> DAN: Ja. 685 00:36:48,460 --> 00:36:51,340 >> PUBLIEK: [onverstaanbaar]? 686 00:36:51,340 --> 00:36:56,700 >> DAN: Als u wat er gaande in de matrix reeds. 687 00:36:56,700 --> 00:37:02,260 Dus zou je dit in plaats opgeven als, zeg, char, wat ook de naam van uw 688 00:37:02,260 --> 00:37:12,200 array lege haakjes geeft curly brace H komma E komma L komma L komma 689 00:37:12,200 --> 00:37:16,290 O komma NULL karakter en accolade. 690 00:37:16,290 --> 00:37:18,180 Dat zou ook werken als een verklaring. 691 00:37:18,180 --> 00:37:20,886 >> PUBLIEK: [onverstaanbaar]? 692 00:37:20,886 --> 00:37:23,110 >> DAN: Dan moet je hebben de grootte reeds. 693 00:37:23,110 --> 00:37:23,896 >> PUBLIEK: [onverstaanbaar]? 694 00:37:23,896 --> 00:37:25,146 >> DAN: Ja. 695 00:37:25,146 --> 00:37:30,114 696 00:37:30,114 --> 00:37:32,420 Alle righty. 697 00:37:32,420 --> 00:37:36,430 Command line argumenten zijn een manier van het krijgen van input van de gebruiker als 698 00:37:36,430 --> 00:37:39,380 argumenten naar hoofdpagina. 699 00:37:39,380 --> 00:37:40,600 Hoofd heeft twee argumenten. 700 00:37:40,600 --> 00:37:47,680 Het aantal argumenten dat wordt doorgegeven aan de command line en een 701 00:37:47,680 --> 00:37:55,340 touw vector of een string-array van alle argumenten. 702 00:37:55,340 --> 00:38:07,840 >> Als ik bijvoorbeeld zogenaamde functie als een punt uit 1 ruimte, 2 ruimte, drie, 703 00:38:07,840 --> 00:38:10,110 argc zou zijn 4. 704 00:38:10,110 --> 00:38:17,370 En de argv 0 zou een punt buiten te zijn. 705 00:38:17,370 --> 00:38:19,130 Argv1 zou 1. 706 00:38:19,130 --> 00:38:23,030 argv2 zou 2 argv3 zou 3, in dat specifieke geval. 707 00:38:23,030 --> 00:38:23,310 Yeah? 708 00:38:23,310 --> 00:38:25,400 >> PUBLIEK: [onverstaanbaar]? 709 00:38:25,400 --> 00:38:34,010 >> DAN: Het laatste element in de array omdat de array lengte argc plus 710 00:38:34,010 --> 00:38:41,050 een van aRGB, het laatste element is de NULL pointer. 711 00:38:41,050 --> 00:38:42,580 Het is argc plus 1. 712 00:38:42,580 --> 00:38:46,210 713 00:38:46,210 --> 00:38:52,150 Dus in het geval dat ik al zei, het is gewoon zou worden argv 0 is een punt uit. 714 00:38:52,150 --> 00:38:56,330 argv 1 is 1 argv2 is 2 argv 3 is 3. 715 00:38:56,330 --> 00:39:03,490 argv 4, dat is een grotere dan argc NULL zou zijn. 716 00:39:03,490 --> 00:39:04,870 >> En dat is de NULL-pointer. 717 00:39:04,870 --> 00:39:06,590 Ja. 718 00:39:06,590 --> 00:39:11,250 En dat komt omdat string een char ster is een pointer. 719 00:39:11,250 --> 00:39:14,102 Dus moet hetzelfde type zijn. 720 00:39:14,102 --> 00:39:14,595 Yeah? 721 00:39:14,595 --> 00:39:16,074 >> PUBLIEK: Twee vragen. 722 00:39:16,074 --> 00:39:21,004 Dus een, wat is het verschil tussen deze en andere dan een type GetString 723 00:39:21,004 --> 00:39:22,483 in de gebruiker motor? 724 00:39:22,483 --> 00:39:25,934 En twee, is het binnen opgeslagen Uw recente geschiedenis? 725 00:39:25,934 --> 00:39:28,399 Dus als, GetString zou zijn [onverstaanbaar]? 726 00:39:28,399 --> 00:39:31,357 727 00:39:31,357 --> 00:39:33,650 >> DAN: Waar wordt het opgeslagen? 728 00:39:33,650 --> 00:39:34,905 Ik weet niet waar het is opgeslagen. 729 00:39:34,905 --> 00:39:40,000 >> PUBLIEK: Dus, eigenlijk, je weet hoe elke functioneren bel je het argumenten 730 00:39:40,000 --> 00:39:42,170 worden opgeslagen in de stack? 731 00:39:42,170 --> 00:39:46,610 Dus argc en argv zijn argumenten naar hoofdpagina en ze zijn op de stapel, of eigenlijk 732 00:39:46,610 --> 00:39:49,131 net boven wat je denkt als het begin van de stack. 733 00:39:49,131 --> 00:39:53,490 Wat was het andere deel van de vraag? 734 00:39:53,490 --> 00:39:56,821 >> Publiek: Dus wat is het [onverstaanbaar]? 735 00:39:56,821 --> 00:40:00,990 >> DAN: Ja, het is gewoon een andere manier op het krijgen van input van de gebruiker. 736 00:40:00,990 --> 00:40:06,030 Deze is iets efficiënter en het is handiger voor scripts, omdat je 737 00:40:06,030 --> 00:40:10,070 kan gewoon argumenten doorgeven aan uw belangrijkste functie in plaats van te moeten wachten 738 00:40:10,070 --> 00:40:13,400 voor gebruikers als u niet beschikt over enige gebruikers. 739 00:40:13,400 --> 00:40:16,280 >> PUBLIEK: En ja, krijgen strings zou zijn [onverstaanbaar]. 740 00:40:16,280 --> 00:40:17,922 Het zou de spullen die je nodig hebt op te slaan. 741 00:40:17,922 --> 00:40:18,834 >> DAN: Ja? 742 00:40:18,834 --> 00:40:21,114 >> PUBLIEK: [onverstaanbaar]? 743 00:40:21,114 --> 00:40:27,545 >> DAN: Ja, argv 0 bevat altijd de dot slash van de functie aan te roepen. 744 00:40:27,545 --> 00:40:28,042 Yeah? 745 00:40:28,042 --> 00:40:29,292 >> PUBLIEK: [onverstaanbaar]? 746 00:40:29,292 --> 00:40:33,509 747 00:40:33,509 --> 00:40:37,310 >> DAN: Ja, elk van de argumenten zijn eindigde in NULL karakter, omdat ze 748 00:40:37,310 --> 00:40:38,310 zijn strings. 749 00:40:38,310 --> 00:40:40,892 >> PUBLIEK: [onverstaanbaar]? 750 00:40:40,892 --> 00:40:44,116 >> DAN: Ja, argv argc is een NULL-pointer. 751 00:40:44,116 --> 00:40:45,112 >> PUBLIEK: [onverstaanbaar]? 752 00:40:45,112 --> 00:40:47,104 >> DAN: Oh ja. 753 00:40:47,104 --> 00:40:48,100 Ja, sorry. 754 00:40:48,100 --> 00:40:49,594 >> PUBLIEK: Dus [onverstaanbaar]? 755 00:40:49,594 --> 00:41:08,518 756 00:41:08,518 --> 00:41:16,340 >> DAN: Dus de vraag is als je had de opdrachtregel dot slash een punt uit 1, 2, 757 00:41:16,340 --> 00:41:20,410 zou het aantal command line argumenten zijn twee of zou het drie? 758 00:41:20,410 --> 00:41:24,420 759 00:41:24,420 --> 00:41:28,240 >> Publiek: Ik denk het niet echt toe doen. 760 00:41:28,240 --> 00:41:31,370 Ik ben geneigd om te zeggen, oh, je niet voorbij elke command line argumenten als, 761 00:41:31,370 --> 00:41:32,730 natuurlijk, je de functie genaamd. 762 00:41:32,730 --> 00:41:37,950 Dus heb ik de neiging om vocaal uit te sluiten van de functie vanaf de opdrachtregel 763 00:41:37,950 --> 00:41:40,350 argumenten ook al is het opgenomen in argv. 764 00:41:40,350 --> 00:41:42,600 >> DAN: Maar als het was op de test-- 765 00:41:42,600 --> 00:41:46,550 yeah-- en ook als je iets te zeggen zoals argc is gelijk aan 3, 766 00:41:46,550 --> 00:41:48,512 je bent in een veilige staande. 767 00:41:48,512 --> 00:41:49,416 Yeah? 768 00:41:49,416 --> 00:41:50,666 >> PUBLIEK: [onverstaanbaar]? 769 00:41:50,666 --> 00:42:00,990 770 00:42:00,990 --> 00:42:09,510 >> DAN: Ik denk dat als plaats van het aanroepen van deze in argc en strijkorkest argv beugels 771 00:42:09,510 --> 00:42:14,350 maar hield dezelfde soorten en belde net ze iets anders zoals een 772 00:42:14,350 --> 00:42:16,640 en b, zou het nog steeds werken? 773 00:42:16,640 --> 00:42:18,790 En het zou nog steeds werken, je zou gewoon-- 774 00:42:18,790 --> 00:42:21,520 plaats van argc-- je zou gebruiken a en b. 775 00:42:21,520 --> 00:42:24,436 776 00:42:24,436 --> 00:42:25,408 Yeah? 777 00:42:25,408 --> 00:42:26,658 >> PUBLIEK: [onverstaanbaar]? 778 00:42:26,658 --> 00:42:34,642 779 00:42:34,642 --> 00:42:38,850 >> DAN: Dus de vraag is GetString is naar geheugen in de heap 780 00:42:38,850 --> 00:42:42,280 omdat GetString is char *. 781 00:42:42,280 --> 00:42:47,530 Het slaat geheugen in de heap omdat vraagt ​​nu malloc binnen het feitelijke 782 00:42:47,530 --> 00:42:49,258 uitvoering van GetString. 783 00:42:49,258 --> 00:42:53,210 784 00:42:53,210 --> 00:42:55,090 OK, over te gaan. 785 00:42:55,090 --> 00:42:55,950 >> Beveiliging. 786 00:42:55,950 --> 00:43:01,090 Dus om echt veilig te zijn, je vertrouwen op geen een en je niemand toegang tot staan 787 00:43:01,090 --> 00:43:04,540 van uw gegevens, dat is de reden waarom iedereen bouwt hun eigen machines, 788 00:43:04,540 --> 00:43:09,580 hun eigen besturingssystemen, al hun programma's van de grond af, en uiteraard 789 00:43:09,580 --> 00:43:13,410 niet aansluiten op andere apparaten via het internet. 790 00:43:13,410 --> 00:43:17,350 Dus computers zijn onzeker. 791 00:43:17,350 --> 00:43:19,200 Ze werkelijk zijn. 792 00:43:19,200 --> 00:43:20,940 We moeten andere mensen te vertrouwen. 793 00:43:20,940 --> 00:43:26,500 >> En het idee van veiligheid is dat je bent proberen om de hoeveelheid te beperken 794 00:43:26,500 --> 00:43:27,540 vertrouwen dat je nodig hebt. 795 00:43:27,540 --> 00:43:32,080 En een van de middelen die u dat te doen is door middel van cryptografie. 796 00:43:32,080 --> 00:43:34,950 Cryptografie is, in wezen, we hebben geheimen. 797 00:43:34,950 --> 00:43:38,880 >> Soms moeten we onze geheimen passeren mee door, laten we zeggen, het internet of 798 00:43:38,880 --> 00:43:39,980 andere dingen. 799 00:43:39,980 --> 00:43:43,180 En we hebben geen mensen willen om deze geheimen te leren kennen. 800 00:43:43,180 --> 00:43:50,100 Zo coderen we geheimen een manier waarvan we hopen dat niemand kan achterhalen. 801 00:43:50,100 --> 00:43:51,600 >> Dus we used-- 802 00:43:51,600 --> 00:43:54,340 in de loop van dit class-- 803 00:43:54,340 --> 00:44:00,750 dingen zoals Caesar cipher en [Onverstaanbaar], die beide zeer, zeer 804 00:44:00,750 --> 00:44:03,200 onveilige manieren van versleutelen dingen. 805 00:44:03,200 --> 00:44:07,930 Ze zijn eenvoudig om erachter te komen wat ze zijn en wat je geheimen zijn. 806 00:44:07,930 --> 00:44:12,130 De echte wereld gebruikt veel ingewikkelde encryptie schema. 807 00:44:12,130 --> 00:44:13,880 En we gaan nu niet in veel meer dan dat. 808 00:44:13,880 --> 00:44:18,280 809 00:44:18,280 --> 00:44:19,430 >> Debuggen. 810 00:44:19,430 --> 00:44:20,785 GDB is het beste. 811 00:44:20,785 --> 00:44:24,014 812 00:44:24,014 --> 00:44:25,810 Ik ga dit nogmaals benadrukken. 813 00:44:25,810 --> 00:44:30,920 Gebruik GDB hele tijd elke keer als je een probleem hebt. 814 00:44:30,920 --> 00:44:36,030 Commando's die nuttig zijn in GDB zijn breken, dat je ofwel een lijn passeren 815 00:44:36,030 --> 00:44:41,330 nummer, een functienaam, in wezen waar in de code dat u wilt stoppen, 816 00:44:41,330 --> 00:44:45,600 en in staat zijn om controle te nemen. 817 00:44:45,600 --> 00:44:54,140 >> Print neemt een variabele en drukt wat dat ook variabel is op dat 818 00:44:54,140 --> 00:44:55,990 punt in de uitvoering. 819 00:44:55,990 --> 00:45:00,130 Vervolgens beweegt uw executie langs een stap. 820 00:45:00,130 --> 00:45:05,050 En stap stappen in een functie in de uitvoering. 821 00:45:05,050 --> 00:45:10,480 >> Andere dingen worden uitgebaat, dat is hoe u daadwerkelijk uitvoeren van uw code. 822 00:45:10,480 --> 00:45:16,630 Doorgaan neemt alle stappen die nodig zijn naar de volgende onderbreking punt. 823 00:45:16,630 --> 00:45:18,300 En er zijn vele, vele anderen. 824 00:45:18,300 --> 00:45:19,040 Ze opzoeken. 825 00:45:19,040 --> 00:45:19,901 Ze zijn geweldig. 826 00:45:19,901 --> 00:45:20,863 Yeah? 827 00:45:20,863 --> 00:45:22,113 >> PUBLIEK: [onverstaanbaar]? 828 00:45:22,113 --> 00:45:26,635 829 00:45:26,635 --> 00:45:28,200 >> DAN: Ja, dat is een debugger. 830 00:45:28,200 --> 00:45:34,230 Dus een debugger is een programma dat kunt u uw programma te debuggen. 831 00:45:34,230 --> 00:45:39,931 Het is niet een programma dat bugs vindt voor je zou al geweldig zijn. 832 00:45:39,931 --> 00:45:43,020 833 00:45:43,020 --> 00:45:46,040 >> En de laatste is voor mij zoeken. 834 00:45:46,040 --> 00:45:51,470 Dus de soorten zoektocht die we gesproken over in deze klasse zijn lineaire zoeken, 835 00:45:51,470 --> 00:45:55,960 dat is gewoon dat je door elke element van het zoekgebied, een 836 00:45:55,960 --> 00:46:00,410 element in een tijd, totdat je wat vindt u zoekt of tot u bij 837 00:46:00,410 --> 00:46:03,350 het einde van uw zoekopdracht ruimte waar wijzen u zegt dat u niet kon vinden 838 00:46:03,350 --> 00:46:06,360 het element dat je zocht. 839 00:46:06,360 --> 00:46:13,450 Dit duurt best constante tijd, die 0 of 1 en in het slechtste lineaire 840 00:46:13,450 --> 00:46:16,070 tijd, die 0 of n. 841 00:46:16,070 --> 00:46:19,250 >> Binary search, dat moet verachtelijke elementen. 842 00:46:19,250 --> 00:46:24,230 Je gaat naar het midden van je elementen, zien of het element dat u zoekt 843 00:46:24,230 --> 00:46:30,120 groter of kleiner is dan het element dat je in het midden. 844 00:46:30,120 --> 00:46:36,510 Het het is groter, je zegt dat de bodem van uw zoekopdracht ruimte is uw 845 00:46:36,510 --> 00:46:41,550 huidige locatie, in het midden, en u het proces opnieuw starten. 846 00:46:41,550 --> 00:46:46,150 Als het kleiner is, je kijkt zeggen dat de-- ja, wat is er? 847 00:46:46,150 --> 00:46:47,400 >> PUBLIEK: [onverstaanbaar]? 848 00:46:47,400 --> 00:46:51,000 849 00:46:51,000 --> 00:46:54,260 >> DAN: Ja. 850 00:46:54,260 --> 00:46:58,360 Een soort van een soort die is onderwezen in de klas is eerlijk spel voor de test. 851 00:46:58,360 --> 00:47:01,504 852 00:47:01,504 --> 00:47:04,920 >> [Lachen] 853 00:47:04,920 --> 00:47:10,260 >> DAN: En het feit dat je niet hebt gehad om het voor een probleem set te doen, het is eerlijk 854 00:47:10,260 --> 00:47:12,420 spel voor de test. 855 00:47:12,420 --> 00:47:15,186 >> PUBLIEK: Kunnen we gaan erover hoe om-- 856 00:47:15,186 --> 00:47:17,052 >> DAN: Het zal worden over gegaan. 857 00:47:17,052 --> 00:47:20,496 >> SPEAKER 2: De daadwerkelijke code voor [Onverstaanbaar] is op study.cs50.net. 858 00:47:20,496 --> 00:47:25,910 859 00:47:25,910 --> 00:47:32,680 Dus als je kijkt naar de praktijk probleem in de merge soort pagina van 860 00:47:32,680 --> 00:47:35,880 study.cs50.net, is de code voor de uitvoering samenvoegen soort. 861 00:47:35,880 --> 00:47:38,550 Dus je hoeft niet te implementeren het zelf vanavond. 862 00:47:38,550 --> 00:47:42,090 Maar zorg ervoor dat je het begrijpt in plaats dan onthouden is. 863 00:47:42,090 --> 00:47:45,035 >> PUBLIEK: [onverstaanbaar]? 864 00:47:45,035 --> 00:47:49,720 >> SPEAKER 2: De merge sort pagina op study.cs50.net er een praktijk 865 00:47:49,720 --> 00:47:53,570 probleem is dat, als je door het klikken probleem, aan het einde is er een 866 00:47:53,570 --> 00:47:56,280 oplossing die het samenvoegen soort implementatie. 867 00:47:56,280 --> 00:47:58,510 Maar zorg ervoor dat je het begrijpt in plaats van alleen het onthouden 868 00:47:58,510 --> 00:47:59,760 of kopiëren van het naar beneden. 869 00:47:59,760 --> 00:48:02,870 870 00:48:02,870 --> 00:48:06,340 >> PUBLIEK: En een volkomen geldig probleem voor het examen zou zijn 871 00:48:06,340 --> 00:48:07,990 zoiets als hier is een lijst. 872 00:48:07,990 --> 00:48:12,100 Wat doet deze lijst zien na een stap van selecties soort of 873 00:48:12,100 --> 00:48:13,330 insertion sort of wat dan ook. 874 00:48:13,330 --> 00:48:14,940 Een volledige iteratie van de lijst. 875 00:48:14,940 --> 00:48:18,530 Dus zelfs als je uiteindelijk niet om code voor het, moet u om het te begrijpen 876 00:48:18,530 --> 00:48:20,440 genoeg om te weten hoe het gaat te wijzigen van deze array. 877 00:48:20,440 --> 00:48:24,144 878 00:48:24,144 --> 00:48:25,394 >> DAN: Dat is het voor mij. 879 00:48:25,394 --> 00:48:30,604 880 00:48:30,604 --> 00:48:32,588 >> [Applaus] 881 00:48:32,588 --> 00:49:06,316 882 00:49:06,316 --> 00:49:07,410 >> LUCAS: Hey iedereen. 883 00:49:07,410 --> 00:49:08,390 Mijn naam is Lucas. 884 00:49:08,390 --> 00:49:16,840 Ik ga om te praten over recursie, alle de soorten die we hebben geleerd, en een 885 00:49:16,840 --> 00:49:18,050 beetje alle pointers. 886 00:49:18,050 --> 00:49:18,740 OK? 887 00:49:18,740 --> 00:49:20,340 Dus in de eerste plaats, recursie. 888 00:49:20,340 --> 00:49:22,951 Wat betekent het om te zeggen dat een functie is recursief? 889 00:49:22,951 --> 00:49:24,675 >> PUBLIEK: Noemt zichzelf. 890 00:49:24,675 --> 00:49:26,500 >> LUCAS: OK, noemt zichzelf, ja. 891 00:49:26,500 --> 00:49:27,700 Dus graag deze foto, bijvoorbeeld. 892 00:49:27,700 --> 00:49:30,280 Het is als het beeld van binnen van een beeld enzovoort. 893 00:49:30,280 --> 00:49:35,740 Dus bijvoorbeeld, kunt u have-- als Dan die sprak over binary search. 894 00:49:35,740 --> 00:49:41,840 Een manier waarop binary search is recursieve is het feit dat je bent 895 00:49:41,840 --> 00:49:43,130 proberen een nummer. 896 00:49:43,130 --> 00:49:44,250 Dus ga je naar het midden. 897 00:49:44,250 --> 00:49:47,130 En dan moet je controleren of de nummers er in links en rechts. 898 00:49:47,130 --> 00:49:49,650 >> En dan als je het nummer is gaat worden aan de linkerkant, het is hetzelfde 899 00:49:49,650 --> 00:49:53,340 ding zo weer doen van de zoektocht, maar net aan de linkerkant van de lijst. 900 00:49:53,340 --> 00:49:57,350 Dus dat is hoe het klinkt alsof het recursieve. 901 00:49:57,350 --> 00:50:01,870 Dus dat is de reden waarom jullie hebben recursieve oplossing voor merge sort. 902 00:50:01,870 --> 00:50:04,270 >> OK, dus hier is een voorbeeld. 903 00:50:04,270 --> 00:50:07,280 Dus laten we zeggen dat ik wil kiezen alle getallen van 1 tot n. 904 00:50:07,280 --> 00:50:13,790 Ik kan realiseren dat de som van de n nummer n plus n minus 1 tot 1. 905 00:50:13,790 --> 00:50:17,810 Maar dan, als ik kijk naar n minus 1 plus n minus 2 plus 1, dat is hetzelfde 906 00:50:17,810 --> 00:50:20,680 zoiets als het optellen van getallen tot n minus 1. 907 00:50:20,680 --> 00:50:25,890 Dus ik kan de som van een gelijke som zeggen n gelijk plus de som van n minus 1. 908 00:50:25,890 --> 00:50:28,010 Heeft dat zin? 909 00:50:28,010 --> 00:50:32,630 >> En ik heb ook nog iets anders zou hebben riep het basisscenario, namelijk dat 910 00:50:32,630 --> 00:50:37,440 de som van de getallen nul zou nul bedragen. 911 00:50:37,440 --> 00:50:42,770 Dus zodra ik naar het nummer nul, ik stoppen met tellen. 912 00:50:42,770 --> 00:50:45,330 Heeft dat zin? 913 00:50:45,330 --> 00:50:48,120 >> Dus hier is een voorbeeld van hoe Ik kan implementeren die. 914 00:50:48,120 --> 00:50:49,860 Dus ik heb deze functie in sommige. 915 00:50:49,860 --> 00:50:51,700 Dat kost een geheel getal n. 916 00:50:51,700 --> 00:50:56,300 Dus hier Ik check eerst als n minder of gelijk aan nul. 917 00:50:56,300 --> 00:51:00,310 Als het minder of gelijk aan nul, I terug nul, dat is ons basisscenario. 918 00:51:00,310 --> 00:51:05,690 Anders kan ik gewoon terug n plus de som van de getallen van 919 00:51:05,690 --> 00:51:07,190 een tot n minus een. 920 00:51:07,190 --> 00:51:09,360 Zinvol? 921 00:51:09,360 --> 00:51:10,100 OK. 922 00:51:10,100 --> 00:51:11,610 >> Dus hier is wat het lijkt. 923 00:51:11,610 --> 00:51:15,260 Je hebt een bedrag van 2 gelijken 2 plus de som van 1. 924 00:51:15,260 --> 00:51:18,930 En een aantal van 1 is 1 plus de som 0, die 0. 925 00:51:18,930 --> 00:51:20,216 Zinvol? 926 00:51:20,216 --> 00:51:25,342 Dus als we kijken naar de stapel van uw programma, dit is hoe het eruit ziet. 927 00:51:25,342 --> 00:51:26,820 >> Ten eerste hebben we de belangrijkste functie. 928 00:51:26,820 --> 00:51:30,320 En dan de belangrijkste functie genoemd bedrag 2. 929 00:51:30,320 --> 00:51:36,690 En dan som 2 gaat zeggen, oh, som 2 gelijk is aan 2 plus de som van een. 930 00:51:36,690 --> 00:51:39,460 Dus heb ik een bedrag van 1 toe te voegen aan de stapel. 931 00:51:39,460 --> 00:51:43,860 En de som van 1 gaat naar som van bellen 0, die eveneens zal worden toegevoegd 932 00:51:43,860 --> 00:51:44,630 de stack. 933 00:51:44,630 --> 00:51:49,240 En dan elk van deze degenen die op elkaar moeten terugkeren 934 00:51:49,240 --> 00:51:52,020 voor de anderen kunnen blijven gaan. 935 00:51:52,020 --> 00:51:56,240 >> Dus bijvoorbeeld, hier, een bedrag van 0, Eerst, gaat terug 0. 936 00:51:56,240 --> 00:51:58,320 En kies vervolgens een bedrag van 1. 937 00:51:58,320 --> 00:52:00,850 Dan som van 1 gaat terug 1 op te sommen van 2. 938 00:52:00,850 --> 00:52:03,900 En tenslotte, een bedrag van 2 gaat 3 terug naar de belangrijkste. 939 00:52:03,900 --> 00:52:05,320 Heeft dat zin? 940 00:52:05,320 --> 00:52:09,496 >> Het is echt belangrijk om te begrijpen hoe de stapel werkt en proberen te 941 00:52:09,496 --> 00:52:11,980 te zien of het zinvol is. 942 00:52:11,980 --> 00:52:13,260 OK, dus het sorteren. 943 00:52:13,260 --> 00:52:16,170 Dus waarom is het sorteren van belang, Allereerst? 944 00:52:16,170 --> 00:52:18,260 Waarom zouden we de zorg? 945 00:52:18,260 --> 00:52:20,310 Anyone? 946 00:52:20,310 --> 00:52:20,695 Geef mij een voorbeeld? 947 00:52:20,695 --> 00:52:21,040 Yeah? 948 00:52:21,040 --> 00:52:22,968 >> PUBLIEK: [onverstaanbaar]. 949 00:52:22,968 --> 00:52:24,700 >> LUCAS: Ja, OK. 950 00:52:24,700 --> 00:52:26,090 Dus je kan efficiënter zoeken. 951 00:52:26,090 --> 00:52:28,580 Dat is een goede manier. 952 00:52:28,580 --> 00:52:32,462 Dus, bijvoorbeeld, hebben we veel van dingen, in feite, in ons leven, dat 953 00:52:32,462 --> 00:52:32,920 gesorteerd. 954 00:52:32,920 --> 00:52:34,830 Bijvoorbeeld woordenboeken. 955 00:52:34,830 --> 00:52:39,210 >> Het is heel belangrijk om alle hebben woorden in een bepaalde volgorde die we 956 00:52:39,210 --> 00:52:41,970 gemakkelijk toegang. 957 00:52:41,970 --> 00:52:43,280 Dus dat is wat hij zei. 958 00:52:43,280 --> 00:52:45,530 U kunt efficiënter zoeken. 959 00:52:45,530 --> 00:52:48,740 Denk aan hoe moeilijk het zou zijn om een ​​hebben woordenboek waarin de woorden zijn in 960 00:52:48,740 --> 00:52:49,500 willekeurige volgorde. 961 00:52:49,500 --> 00:52:53,120 Je zult moeten kijken, vrij veel, elk woord tot u de 962 00:52:53,120 --> 00:52:54,720 woord dat u zoekt. 963 00:52:54,720 --> 00:52:58,710 >> Als u gebruik Facebook ook, wanneer u op zoek bent naar je vrienden, je bent 964 00:52:58,710 --> 00:53:03,540 gaan om te zien dat Facebook zet je dichter vriend is op de top van degenen 965 00:53:03,540 --> 00:53:05,470 dat je dat niet te doen praten veel. 966 00:53:05,470 --> 00:53:08,080 Als je helemaal naar de onderkant van je vriendenlijst, je gaat om te zien 967 00:53:08,080 --> 00:53:11,250 mensen die je waarschijnlijk niet eens vergeet niet dat je vrienden bent met. 968 00:53:11,250 --> 00:53:14,590 En dat komt omdat Facebook soorten je vrienden op basis van hoe 969 00:53:14,590 --> 00:53:16,472 sluit u zich bij hen. 970 00:53:16,472 --> 00:53:17,930 >> Dus ordenen van gegevens. 971 00:53:17,930 --> 00:53:18,450 Ook Pokemon. 972 00:53:18,450 --> 00:53:21,400 Zo zie je dat alle Pokemons hebben nummers. 973 00:53:21,400 --> 00:53:27,210 En dat is net als een makkelijk manier van toegang tot gegevens. 974 00:53:27,210 --> 00:53:29,050 >> PUBLIEK: Toegang Pokemon. 975 00:53:29,050 --> 00:53:29,890 >> LUCAS: Ja. 976 00:53:29,890 --> 00:53:32,395 >> PUBLIEK: [onverstaanbaar]. 977 00:53:32,395 --> 00:53:33,460 >> LUCAS: Yep. 978 00:53:33,460 --> 00:53:35,140 OK, dus selectie sorteren. 979 00:53:35,140 --> 00:53:41,610 Selectie soort gaat het selecteren kleinste ongesorteerde waarde van een lijst elke 980 00:53:41,610 --> 00:53:43,300 tijd in elke iteratie. 981 00:53:43,300 --> 00:53:46,800 Het is net zoiets als het soort dat je doet in je hoofd als je probeert te 982 00:53:46,800 --> 00:53:48,430 sorteren van een lijst bij de hand. 983 00:53:48,430 --> 00:53:51,990 >> Kortom, alles wat je doet is je kijkt voor het kleinste getal. 984 00:53:51,990 --> 00:53:54,280 Je zet het in de gesorteerde lijst. 985 00:53:54,280 --> 00:53:56,230 En dan kijk je naar de volgende kleinste getal. 986 00:53:56,230 --> 00:54:00,080 En dan houd je aan het doen die enzovoort. 987 00:54:00,080 --> 00:54:04,600 >> Dus selectie soort is eigenlijk je selecteren wanneer de kleinste 988 00:54:04,600 --> 00:54:05,750 ongesorteerd waarde. 989 00:54:05,750 --> 00:54:10,840 Gebracht op het einde van de gesorteerde deel van de lijst. 990 00:54:10,840 --> 00:54:12,370 En dat blijven doen. 991 00:54:12,370 --> 00:54:15,890 Dus laten we snel kijken wat dit eruit ziet. 992 00:54:15,890 --> 00:54:19,340 Dus hier is de gesorteerde en ongesorteerde lijst. 993 00:54:19,340 --> 00:54:23,350 >> Dus voor de lijst van gesorteerd, Het is aanvankelijk leeg. 994 00:54:23,350 --> 00:54:26,760 En dan ga ik naar de te selecteren kleinste aantal hier, dat is 2. 995 00:54:26,760 --> 00:54:30,650 Dus ik krijg het nummer 2 en ik zet in de voorzijde van de lijst. 996 00:54:30,650 --> 00:54:34,910 En dan kijk ik voor de volgende kleinste element, dat is 3. 997 00:54:34,910 --> 00:54:37,050 Dus ik zet het op het einde van de gesorteerde lijst. 998 00:54:37,050 --> 00:54:38,140 En dan houd ik dat doen. 999 00:54:38,140 --> 00:54:40,040 Ik vind 4 en zet het op het einde. 1000 00:54:40,040 --> 00:54:41,360 Zoek 5 en zet het op het einde. 1001 00:54:41,360 --> 00:54:44,830 >> En kijken hoe al die keren dat Ik zeg zet het op het einde is, 1002 00:54:44,830 --> 00:54:46,850 principe, wisselen twee waarden. 1003 00:54:46,850 --> 00:54:48,100 OK? 1004 00:54:48,100 --> 00:54:50,140 1005 00:54:50,140 --> 00:54:52,825 En dan de laatste, je gewoon heb nog een element. 1006 00:54:52,825 --> 00:54:55,870 Dus het is al opgelost. 1007 00:54:55,870 --> 00:54:57,800 >> OK, dus insertion sort. 1008 00:54:57,800 --> 00:55:03,180 Insertion sort je gaat ook dat ding van het hebben van een gesorteerd en 1009 00:55:03,180 --> 00:55:04,690 een ongesorteerde lijst. 1010 00:55:04,690 --> 00:55:14,540 Het enige ding is dat elke keer dat je bent het toevoegen van een element aan de gesorteerde 1011 00:55:14,540 --> 00:55:18,170 lijst, je kies gewoon het element dat is in de voorkant van de ongesorteerde lijst. 1012 00:55:18,170 --> 00:55:20,880 En dan zul je wat vinden positie dient in de gesorteerde 1013 00:55:20,880 --> 00:55:22,300 deel van de lijst. 1014 00:55:22,300 --> 00:55:25,840 >> Laten we eens kijken wat dit is zo Dit heeft meer zin. 1015 00:55:25,840 --> 00:55:29,360 Dus in eerste instantie, bijvoorbeeld, probeer ik het nummer drie plaatsen in de 1016 00:55:29,360 --> 00:55:30,680 gesorteerde deel van de lijst. 1017 00:55:30,680 --> 00:55:31,800 Dus de lijst zegt niets te hebben. 1018 00:55:31,800 --> 00:55:34,160 Dus ik kan gewoon de nummer 3. 1019 00:55:34,160 --> 00:55:37,480 >> Nu wil ik de nummer 5 toe te voegen aan het gesorteerde deel van de lijst. 1020 00:55:37,480 --> 00:55:38,900 Dus ik kijk naar het nummer 5. 1021 00:55:38,900 --> 00:55:40,450 Ik merk dat het groter is dan 3. 1022 00:55:40,450 --> 00:55:41,980 Dus ik weet dat het moet zijn na 3. 1023 00:55:41,980 --> 00:55:44,100 Dus heb ik 3 en 5. 1024 00:55:44,100 --> 00:55:45,940 >> Dan wil ik de nummer 2 in te voegen. 1025 00:55:45,940 --> 00:55:51,630 Ik merk dat het nummer 2 is eigenlijk duren dan zowel 3 en 5. 1026 00:55:51,630 --> 00:55:54,580 Dus ik heb eigenlijk het hele zetten wijze het begin van de lijst. 1027 00:55:54,580 --> 00:55:59,030 Dus ik moet, soort, verschuiven alle elementen in de gesorteerde lijst, zodat ik kan 1028 00:55:59,030 --> 00:56:01,970 om ruimte te maken voor de nummer 2. 1029 00:56:01,970 --> 00:56:03,160 >> Dan zie ik het getal 6. 1030 00:56:03,160 --> 00:56:05,450 Ik zie dat het zou moeten zijn na 5. 1031 00:56:05,450 --> 00:56:06,240 Dus ik zet het daar. 1032 00:56:06,240 --> 00:56:07,965 En tot slot, ik kijk naar het nummer 4. 1033 00:56:07,965 --> 00:56:11,030 En ik merk het hoort tussen 3 en 5. 1034 00:56:11,030 --> 00:56:14,870 En dan heb ik het daar en verschuiving alle andere elementen. 1035 00:56:14,870 --> 00:56:16,120 Zinvol? 1036 00:56:16,120 --> 00:56:17,880 1037 00:56:17,880 --> 00:56:19,150 >> Bubble Sort. 1038 00:56:19,150 --> 00:56:25,730 Dus bubble sort is eigenlijk wat je bent ga doen-- we noemen het bubbel 1039 00:56:25,730 --> 00:56:30,113 soort omdat je door de list-- het is eigenlijk beter als ik laten zien 1040 00:56:30,113 --> 00:56:32,300 je dit-- 1041 00:56:32,300 --> 00:56:35,030 en je gaat om te vergelijken aangrenzende nummers. 1042 00:56:35,030 --> 00:56:38,410 En je gaat wisselen hun posities als ze niet 1043 00:56:38,410 --> 00:56:39,190 in de juiste volgorde. 1044 00:56:39,190 --> 00:56:42,570 >> Dus eigenlijk, wat er gaat gebeurt is hier, bijvoorbeeld, 1045 00:56:42,570 --> 00:56:44,160 je hebt 8 en 6. 1046 00:56:44,160 --> 00:56:47,270 U weet dat de gesorteerde volgorde zal eigenlijk zijn 6 en 5, toch? 1047 00:56:47,270 --> 00:56:49,540 Dus je gaat om de bestellingen te wisselen. 1048 00:56:49,540 --> 00:56:51,370 Dan zie ik 8 en 4 hier. 1049 00:56:51,370 --> 00:56:52,250 En ik doe hetzelfde. 1050 00:56:52,250 --> 00:56:53,400 Ik swap weer. 1051 00:56:53,400 --> 00:56:55,070 En tenslotte, 2 en 8. 1052 00:56:55,070 --> 00:56:56,670 Ik ruil ze ook. 1053 00:56:56,670 --> 00:57:01,690 >> Het Bubble Sort omdat na genoemd elk van deze herhalingen, eigenlijk, 1054 00:57:01,690 --> 00:57:05,910 het grootste aantal in de lijst krijgt alle tot aan het einde van de lijst. 1055 00:57:05,910 --> 00:57:06,940 Heeft dat zin? 1056 00:57:06,940 --> 00:57:11,880 Want het houdt te verwisselen en het bewegen naar rechts. 1057 00:57:11,880 --> 00:57:14,440 >> OK, dus dit is de tweede iteratie. 1058 00:57:14,440 --> 00:57:17,200 Het zou hetzelfde zijn. 1059 00:57:17,200 --> 00:57:20,190 Ik zal een swap te doen en dan de laatste. 1060 00:57:20,190 --> 00:57:23,290 Ik dat er geen swaps en de lijst is gesorteerd. 1061 00:57:23,290 --> 00:57:27,460 Dus in Bubble Sort, in principe houden we gaan door de lijst en swapping 1062 00:57:27,460 --> 00:57:32,310 dingen totdat ik merk dat ik niet heb gedaan elke swaps doen dat iteratie, die 1063 00:57:32,310 --> 00:57:34,270 betekent deze lijst al gesorteerd. 1064 00:57:34,270 --> 00:57:35,520 Zinvol? 1065 00:57:35,520 --> 00:57:38,400 1066 00:57:38,400 --> 00:57:40,870 >> Laten we praten een beetje over het uitvoeren van de tijd. 1067 00:57:40,870 --> 00:57:45,165 Dus doen jullie herinneren Big O, Omega en Theta? 1068 00:57:45,165 --> 00:57:49,290 1069 00:57:49,290 --> 00:57:50,990 Yeah? 1070 00:57:50,990 --> 00:57:53,070 OK, wat Big O allereerst? 1071 00:57:53,070 --> 00:57:54,315 >> PUBLIEK: [onverstaanbaar]. 1072 00:57:54,315 --> 00:57:59,070 >> LUCAS: Ja, het is wel een worst-case runtime, die gewoon betekent dat het 1073 00:57:59,070 --> 00:58:03,470 hoeveel u het programma verwacht nemen lopen. 1074 00:58:03,470 --> 00:58:04,910 Zoals, in termen van-- 1075 00:58:04,910 --> 00:58:06,660 in deze geval-- n. 1076 00:58:06,660 --> 00:58:09,150 Het aantal elementen in de lijst in het ergste geval. 1077 00:58:09,150 --> 00:58:12,520 Zoals, in het ergste geval. 1078 00:58:12,520 --> 00:58:17,100 >> Dus voor Bubble Sort bijvoorbeeld We hebben grote O van n plein. 1079 00:58:17,100 --> 00:58:20,580 Waarom hebben we dat? 1080 00:58:20,580 --> 00:58:24,716 Waarom is Bubble Sort Big O n plein? 1081 00:58:24,716 --> 00:58:27,614 >> PUBLIEK: [onverstaanbaar]. 1082 00:58:27,614 --> 00:58:35,670 >> LUCAS: Ja, dus het ergste geval zal zijn dat ik zal moeten n iteraties doen. 1083 00:58:35,670 --> 00:58:39,260 Dus elk van de iteraties zal breng het grootste element aan het einde 1084 00:58:39,260 --> 00:58:40,290 van de lijst. 1085 00:58:40,290 --> 00:58:44,230 Dus het ergste geval is dat ik om dat ding n keer doen. 1086 00:58:44,230 --> 00:58:48,550 En voor elk van die tijd, ik moet doe n swaps, want ik heb om te vergelijken 1087 00:58:48,550 --> 00:58:49,870 per twee elementen. 1088 00:58:49,870 --> 00:58:53,730 Dus dat is de reden waarom het is n kwadraat want het is n keer n. 1089 00:58:53,730 --> 00:59:00,120 >> Dan selectie soort is ook n plein want voor elke iteratie, ik moet 1090 00:59:00,120 --> 00:59:02,650 kijk naar elk element in de lijst. 1091 00:59:02,650 --> 00:59:04,980 En vinden dan de kleinste, wat betekent dat ik moet 1092 00:59:04,980 --> 00:59:06,130 kijk door n elementen. 1093 00:59:06,130 --> 00:59:11,750 En wat ik moet doen, dat n keer omdat Ik moet alle n elementen te selecteren. 1094 00:59:11,750 --> 00:59:18,273 >> Een insertion sort is ook n plein omdat het ergste geval zal 1095 00:59:18,273 --> 00:59:20,950 zijn, een, ik moet invoegen n getallen, toch? 1096 00:59:20,950 --> 00:59:22,765 Dus ik weet nu al dat ik ga N iteraties hebben. 1097 00:59:22,765 --> 00:59:25,466 1098 00:59:25,466 --> 00:59:29,840 Maar voor elk van deze nummers, als ik had om te kijken naar alle nummers in 1099 00:59:29,840 --> 00:59:34,380 de gesorteerde lijst en zet het helemaal voorin, zal dat n vierkant 1100 00:59:34,380 --> 00:59:36,230 Het zal immers n maal n weer. 1101 00:59:36,230 --> 00:59:38,280 Zinvol? 1102 00:59:38,280 --> 00:59:41,512 Hoe zit het met omega? 1103 00:59:41,512 --> 00:59:42,886 >> PUBLIEK: [onverstaanbaar]. 1104 00:59:42,886 --> 00:59:44,620 >> LUCAS: Het is het best case scenario. 1105 00:59:44,620 --> 00:59:48,810 Dus het is net als in een heleboel keer voor het sorteren, het best case scenario is 1106 00:59:48,810 --> 00:59:50,660 als de lijst al is gesorteerd. 1107 00:59:50,660 --> 00:59:52,670 Dus je hoeft niet echt om iets te doen. 1108 00:59:52,670 --> 00:59:56,290 Bubble Sort heeft de beste case scenario van n. 1109 00:59:56,290 --> 00:59:58,820 Weten jullie waarom? 1110 00:59:58,820 --> 01:00:00,620 >> PUBLIEK: [onverstaanbaar]. 1111 01:00:00,620 --> 01:00:05,640 >> LUCAS: Ja, als je bijhouden of de gegevens rantsoen had geen swaps of 1112 01:00:05,640 --> 01:00:10,533 niet, als je iets hebt als ingesteld op true als er een iteratie, wanneer de 1113 01:00:10,533 --> 01:00:15,140 lijst wordt al naargelang, in principe, wat er gaat gebeuren is dat ik ga 1114 01:00:15,140 --> 01:00:17,890 probeer te wisselen elke twee aangrenzende elementen. 1115 01:00:17,890 --> 01:00:19,920 Ik ga om te zien dat zijn er geen swaps. 1116 01:00:19,920 --> 01:00:21,230 En ik gewoon terug meteen. 1117 01:00:21,230 --> 01:00:24,240 >> Dus dat betekent dat ik moest gewoon gaan door de lijst een keer. 1118 01:00:24,240 --> 01:00:28,990 Dus het is n omdat ik kijk bij n elementen. 1119 01:00:28,990 --> 01:00:30,930 Waarom selectie soort n vierkant? 1120 01:00:30,930 --> 01:00:35,150 1121 01:00:35,150 --> 01:00:45,520 >> Ja, zelfs wanneer deze wordt gesorteerd voor elke iteratie van de selectie sorteren, I 1122 01:00:45,520 --> 01:00:47,590 moet de minimale element selecteren. 1123 01:00:47,590 --> 01:00:49,980 Dus dat betekent dat ik uit te kijken bij alle elementen in de ongesorteerde 1124 01:00:49,980 --> 01:00:53,350 overzicht en vind de minimale voor elke iteratie. 1125 01:00:53,350 --> 01:00:54,600 Heeft dat zin? 1126 01:00:54,600 --> 01:00:56,880 1127 01:00:56,880 --> 01:01:04,690 >> En insertie zwaard n omdat het geval dat ik probeer om het in te voegen 1128 01:01:04,690 --> 01:01:09,320 nummers en alle getallen, als ik proberen om ze in te voegen, zie ik dat ze 1129 01:01:09,320 --> 01:01:10,510 zijn in de juiste positie. 1130 01:01:10,510 --> 01:01:15,120 Ik hoef niet te gaan controleren alle andere nummers in de ongesorteerde lijst. 1131 01:01:15,120 --> 01:01:17,170 Dus dat is de reden waarom het n zal zijn. 1132 01:01:17,170 --> 01:01:19,480 Zinvol? 1133 01:01:19,480 --> 01:01:21,035 En wat is theta? 1134 01:01:21,035 --> 01:01:23,410 >> PUBLIEK: [onverstaanbaar]. 1135 01:01:23,410 --> 01:01:24,380 >> LUCAS: Wat, sorry? 1136 01:01:24,380 --> 01:01:24,960 Zeg het nog eens. 1137 01:01:24,960 --> 01:01:25,666 >> PUBLIEK: [onverstaanbaar]. 1138 01:01:25,666 --> 01:01:26,490 >> LUCAS: Precies. 1139 01:01:26,490 --> 01:01:31,280 Dus je kunt dat alleen selectie te zien opgeslagen in Merge soort hebben Thetas. 1140 01:01:31,280 --> 01:01:39,920 En dat komt omdat je alleen maar theta als zowel Big O en Omega zijn hetzelfde. 1141 01:01:39,920 --> 01:01:41,520 OK. 1142 01:01:41,520 --> 01:01:44,210 En tot slot, samenvoegen soort is in log n. 1143 01:01:44,210 --> 01:01:48,910 >> En dan, als Dan zei, samenvoegen soort is net zoiets als op dezelfde manier als 1144 01:01:48,910 --> 01:01:50,320 je doet binair zoeken. 1145 01:01:50,320 --> 01:01:53,530 Dus krijg je de lijst. 1146 01:01:53,530 --> 01:01:55,170 En je gaat snijden in de helft. 1147 01:01:55,170 --> 01:02:00,580 En dan snijd ze je in kleinere helften. 1148 01:02:00,580 --> 01:02:01,730 En dan moet je ze samenvoegen. 1149 01:02:01,730 --> 01:02:02,960 Jullie herinneren dat, toch? 1150 01:02:02,960 --> 01:02:04,960 OK, zoals hij zei. 1151 01:02:04,960 --> 01:02:08,330 >> OK, pointers. 1152 01:02:08,330 --> 01:02:11,078 Dus wat is een pointer? 1153 01:02:11,078 --> 01:02:12,050 >> PUBLIEK: [onverstaanbaar]. 1154 01:02:12,050 --> 01:02:12,820 >> LUCAS: Een adres. 1155 01:02:12,820 --> 01:02:13,720 OK. 1156 01:02:13,720 --> 01:02:18,530 Ik weet dat David toont een stelletje video's van binky en dingen wijzen 1157 01:02:18,530 --> 01:02:19,080 elkaar. 1158 01:02:19,080 --> 01:02:22,960 Maar ik denk graag van pointers als slechts een adres. 1159 01:02:22,960 --> 01:02:26,110 Dus het is een variabele die gaat een adres op te slaan. 1160 01:02:26,110 --> 01:02:31,940 >> Dus het is gewoon deze speciale variabele dat vier bytes lang. 1161 01:02:31,940 --> 01:02:36,550 Vergeet niet, dat de wijzer iets is altijd vier bytes lang voor onze 32-bit 1162 01:02:36,550 --> 01:02:39,370 machine dus het geval met het apparaat. 1163 01:02:39,370 --> 01:02:41,920 1164 01:02:41,920 --> 01:02:47,050 En het heeft alleen de locatie een variabele erin. 1165 01:02:47,050 --> 01:02:50,240 >> OK, dus er is dit geheugen, eigenlijk. 1166 01:02:50,240 --> 01:02:57,420 Zodat elk blok van het geheugen heeft eigenlijk een label, het adres van de 1167 01:02:57,420 --> 01:02:58,890 slotty geheugen. 1168 01:02:58,890 --> 01:03:02,370 Dus dat betekent dat ik kan hebben een pointer die wijst naar 1169 01:03:02,370 --> 01:03:03,380 elk van deze adressen. 1170 01:03:03,380 --> 01:03:09,930 Dus de reden waarom we pointers zullen gebruiken is als ik naar de locatie te onthouden 1171 01:03:09,930 --> 01:03:12,300 dat een specifieke variabele een geheugen. 1172 01:03:12,300 --> 01:03:16,560 >> En jullie herinneren dat een van die gevallen was als ik een functie 1173 01:03:16,560 --> 01:03:20,820 als ik eigenlijk dat u wilt swap voor reals, ik eigenlijk 1174 01:03:20,820 --> 01:03:22,110 moet een pointer sturen. 1175 01:03:22,110 --> 01:03:23,460 Niet de variabele. 1176 01:03:23,460 --> 01:03:25,200 Herinneren jullie je dat? 1177 01:03:25,200 --> 01:03:26,450 Het verschil between-- 1178 01:03:26,450 --> 01:03:33,350 1179 01:03:33,350 --> 01:03:34,120 wat is de naam? 1180 01:03:34,120 --> 01:03:36,010 Bellen met waarde en bellen aan de hand, toch? 1181 01:03:36,010 --> 01:03:36,840 >> OK, ja. 1182 01:03:36,840 --> 01:03:38,330 Dus bel naar waarde. 1183 01:03:38,330 --> 01:03:43,570 Als je stuur een variabele te functie je bent gewoon het verzenden van een waarde. 1184 01:03:43,570 --> 01:03:45,610 Dus je bent eigenlijk het verzenden Een kopie van de variabele. 1185 01:03:45,610 --> 01:03:49,720 En uw programma niet kon schelen ongeveer als dezelfde variabele eigenlijk 1186 01:03:49,720 --> 01:03:51,650 maakt een kopie. 1187 01:03:51,650 --> 01:03:56,330 >> En bellen aan de hand betekent dat Ik ben eigenlijk een kopie van de 1188 01:03:56,330 --> 01:03:57,550 pointer naar die variabele. 1189 01:03:57,550 --> 01:04:00,970 Dus dat betekent dat ik ben het verzenden van de plaats van die variabele. 1190 01:04:00,970 --> 01:04:04,440 Dus voel ik de locatie van de variabele, als ik roep de functie 1191 01:04:04,440 --> 01:04:09,700 met pointers, ik ben in staat om daadwerkelijk de gegevens die zich in hoofd veranderen. 1192 01:04:09,700 --> 01:04:12,050 Zinvol? 1193 01:04:12,050 --> 01:04:17,560 >> Hoewel, de wijzer is een kopie, het pointer nog de werkelijke adres 1194 01:04:17,560 --> 01:04:20,090 de variabele die ik wil veranderen. 1195 01:04:20,090 --> 01:04:21,920 Zinvol? 1196 01:04:21,920 --> 01:04:24,290 >> Dus het maken van pointers. 1197 01:04:24,290 --> 01:04:28,410 Vergeet niet, de wijzer altijd het type dat het wijzend 1198 01:04:28,410 --> 01:04:29,890 aan en dan een ster. 1199 01:04:29,890 --> 01:04:31,030 En dan zet je de naam. 1200 01:04:31,030 --> 01:04:35,765 Dus vergeet niet dat wanneer je welke ster, het is als een pointer naar 1201 01:04:35,765 --> 01:04:38,990 dat wat variabele typen die je had. 1202 01:04:38,990 --> 01:04:42,850 >> Dus hier in de ster, bijvoorbeeld, is het een pointer en een integer. 1203 01:04:42,850 --> 01:04:47,680 En dan char ster is een pointer char ster enzovoort. 1204 01:04:47,680 --> 01:04:47,960 Yeah? 1205 01:04:47,960 --> 01:04:52,710 >> Publiek: Wat als we een pointer naar n naar x ster. 1206 01:04:52,710 --> 01:04:55,255 Ik weet dat schept een pointer naar x. 1207 01:04:55,255 --> 01:04:59,432 Heeft het ook te verklaren x een geheel getal? 1208 01:04:59,432 --> 01:05:05,170 >> LUCAS: OK, dus als je zegt n ster x, je bent niet het maken van een pointer naar een 1209 01:05:05,170 --> 01:05:06,000 variabele x. 1210 01:05:06,000 --> 01:05:08,170 U bent het maken van een pointer met de naam x. 1211 01:05:08,170 --> 01:05:09,396 >> PUBLIEK: [onverstaanbaar]. 1212 01:05:09,396 --> 01:05:14,250 >> LUCAS: Dus als ik zeg n ster x, ik ben zeggen, hey, in het geheugen, ik ga 1213 01:05:14,250 --> 01:05:16,390 krijgt een van deze drie vakken. 1214 01:05:16,390 --> 01:05:20,750 En ik ga om te zeggen dat dat zal x worden, hetgeen 1215 01:05:20,750 --> 01:05:22,000 naar een pointer. 1216 01:05:22,000 --> 01:05:26,860 1217 01:05:26,860 --> 01:05:30,640 En iets wetenswaardigs over pointers is dat we kunnen zeggen dat ze hebben 1218 01:05:30,640 --> 01:05:32,620 4 bytes voor een 32-bits machine. 1219 01:05:32,620 --> 01:05:36,320 En de reden daarvoor is omdat 4 bytes 32-bits. 1220 01:05:36,320 --> 01:05:40,490 >> En machines die 64 bits eigenlijk hebben pointers adressen 1221 01:05:40,490 --> 01:05:43,480 die 64 bits lang. 1222 01:05:43,480 --> 01:05:49,820 Dus het betekent alleen dat de grootte van de adressen in de machine afwijkt. 1223 01:05:49,820 --> 01:05:52,270 >> Dus Verwijzen en dereferentie. 1224 01:05:52,270 --> 01:05:54,310 Er zijn twee operators die jullie moeten onthouden. 1225 01:05:54,310 --> 01:05:55,450 De eerste is ampersand. 1226 01:05:55,450 --> 01:05:56,810 De tweede is ster. 1227 01:05:56,810 --> 01:06:05,060 Raak niet verward door die ster en deze ster omdat herinneren dat, in 1228 01:06:05,060 --> 01:06:06,950 dit geval, je hebt n ster. 1229 01:06:06,950 --> 01:06:08,700 >> Het is als een geheel samen. 1230 01:06:08,700 --> 01:06:10,720 Er is geen ruimte n ster. 1231 01:06:10,720 --> 01:06:12,070 Dus dat betekent dat het de soort. 1232 01:06:12,070 --> 01:06:14,870 Vergeet niet, dat wanneer je de variabele ster, je bent 1233 01:06:14,870 --> 01:06:16,230 praten over het type. 1234 01:06:16,230 --> 01:06:20,540 >> Als je gewoon ster en vervolgens de naam van de variabele, betekent dat 1235 01:06:20,540 --> 01:06:24,100 je dereferencing de aanwijzer, die betekent dat u op zoek bent naar de 1236 01:06:24,100 --> 01:06:28,290 wijzer, het vinden van het adres is het verwezen, naar dat adres, 1237 01:06:28,290 --> 01:06:30,850 en kijken naar waar je hebt daar. 1238 01:06:30,850 --> 01:06:34,310 Dus ik zeg tegen mijn studenten dat wanneer je ster, zou je denken dat het 1239 01:06:34,310 --> 01:06:36,850 de afkorting van de inhoud van. 1240 01:06:36,850 --> 01:06:39,770 >> Dus als je een pointer en u doen ster pointer, het is de 1241 01:06:39,770 --> 01:06:41,720 inhoud van de aanwijzer. 1242 01:06:41,720 --> 01:06:44,580 Dus ga je naar wat het ook wijzen op en kijken naar de constante inhoud. 1243 01:06:44,580 --> 01:06:47,730 En het is gelijk teken zoiets als het adres van. 1244 01:06:47,730 --> 01:06:52,560 >> Dus als ik een variabele a-- als, laten we zeggen dat ik int een evenaart 3-- 1245 01:06:52,560 --> 01:06:56,900 als ik het adres van die vinden variabele een geheugen, kan ik gewoon doen 1246 01:06:56,900 --> 01:06:58,240 ampersand een. 1247 01:06:58,240 --> 01:07:00,280 Dus het is het adres van een. 1248 01:07:00,280 --> 01:07:01,530 Zinvol? 1249 01:07:01,530 --> 01:07:03,790 1250 01:07:03,790 --> 01:07:05,040 >> Dus hier is een voorbeeld. 1251 01:07:05,040 --> 01:07:08,370 1252 01:07:08,370 --> 01:07:11,530 Dit ontbreekt int b en int c. 1253 01:07:11,530 --> 01:07:16,520 Dus int een is gelijk aan 3 betekent dat Ik ga naar het geheugen. 1254 01:07:16,520 --> 01:07:19,870 En ik ga een slot vinden en zet het getal 3 hier. 1255 01:07:19,870 --> 01:07:22,200 >> En dan int b is gelijk aan 4. 1256 01:07:22,200 --> 01:07:23,100 Ik ga hetzelfde doen. 1257 01:07:23,100 --> 01:07:25,840 Ga naar het geheugen en zet een aantal 4 in een van de vakken. 1258 01:07:25,840 --> 01:07:27,100 En int gelijk aan 5. 1259 01:07:27,100 --> 01:07:29,740 Zoek een andere doos en zet een nummer 5. 1260 01:07:29,740 --> 01:07:36,160 >> Dus wat is deze lijn aan het doen? n ster pa gelijk aan een ampersand. 1261 01:07:36,160 --> 01:07:37,800 Dus in de eerste plaats, n ster pa. 1262 01:07:37,800 --> 01:07:39,050 Wat doet het? 1263 01:07:39,050 --> 01:07:40,930 1264 01:07:40,930 --> 01:07:42,298 >> PUBLIEK: [onverstaanbaar]. 1265 01:07:42,298 --> 01:07:47,890 >> LUCAS: Ja, dus n ster pa, eerste, verklaart een pointer genaamd pa. 1266 01:07:47,890 --> 01:07:53,720 En dan is het toewijzen van de waarde van die pointer naar het adres van een te zijn. 1267 01:07:53,720 --> 01:07:55,790 Dus een ampersand. 1268 01:07:55,790 --> 01:07:58,510 Dan, als ik dat doe ster pb, wat is een ster pb? 1269 01:07:58,510 --> 01:08:02,418 1270 01:08:02,418 --> 01:08:03,150 >> Oh, sorry. 1271 01:08:03,150 --> 01:08:06,330 Dit wordt ook vermist. n ster pb. 1272 01:08:06,330 --> 01:08:07,905 Ik bedoel ster pc. 1273 01:08:07,905 --> 01:08:11,200 Het spijt me zo. 1274 01:08:11,200 --> 01:08:11,940 Het is hetzelfde ding. 1275 01:08:11,940 --> 01:08:16,408 Maar nu ben ik goed ar maken van een pointer naar b en dan een verwijzing naar c. 1276 01:08:16,408 --> 01:08:16,886 Yeah? 1277 01:08:16,886 --> 01:08:18,136 >> PUBLIEK: [onverstaanbaar]? 1278 01:08:18,136 --> 01:08:25,490 1279 01:08:25,490 --> 01:08:26,670 >> LUCAS: Ja. 1280 01:08:26,670 --> 01:08:32,630 Dus als je naar het geheugen en ga je naar het vak dat is aanduiding voor pa, 1281 01:08:32,630 --> 01:08:37,149 je in feite gaat om zie het adres van een. 1282 01:08:37,149 --> 01:08:38,399 OK? 1283 01:08:38,399 --> 01:08:42,970 1284 01:08:42,970 --> 01:08:43,300 Yeah? 1285 01:08:43,300 --> 01:08:45,605 >> PUBLIEK: [onverstaanbaar]? 1286 01:08:45,605 --> 01:08:49,260 >> LUCAS: Ja, wijzer is een adres. 1287 01:08:49,260 --> 01:08:50,120 Vergeet nooit dat. 1288 01:08:50,120 --> 01:08:52,800 Het is als het belangrijkste deel over pointers. 1289 01:08:52,800 --> 01:08:56,180 Er opslaan en adres enkele variabele. 1290 01:08:56,180 --> 01:08:56,890 Iets anders? 1291 01:08:56,890 --> 01:08:58,370 Een andere vragen? 1292 01:08:58,370 --> 01:08:59,189 OK. 1293 01:08:59,189 --> 01:09:00,399 >> Dus Pointers en arrays. 1294 01:09:00,399 --> 01:09:08,189 Vergeet niet dat als ik dat doe int rij 3, in principe, wat ik doe is dat ik, soort 1295 01:09:08,189 --> 01:09:12,779 van, verklaren in een pointer. 1296 01:09:12,779 --> 01:09:18,960 Dus array is net zoiets als een pointer naar een specifieke plaats in het geheugen waar ik 1297 01:09:18,960 --> 01:09:21,999 drie slots toegewezen integers. 1298 01:09:21,999 --> 01:09:23,430 Heeft dat zin? 1299 01:09:23,430 --> 01:09:30,250 >> Dus als ik het doe int rij 3, wat ik ben Daarbij principe, creëert drie 1300 01:09:30,250 --> 01:09:31,479 sleuven in geheugen. 1301 01:09:31,479 --> 01:09:33,899 Dus ik vind slechts drie sleuven in het geheugen. 1302 01:09:33,899 --> 01:09:38,810 Dus als ik dat doe, dan een ster array, het betekent in feite de inhoud van de array, 1303 01:09:38,810 --> 01:09:46,180 wat betekent dat ik de pointer te wissen, ik ga naar die plaats dat het wijst naar, 1304 01:09:46,180 --> 01:09:47,939 en ik zet de nummer een. 1305 01:09:47,939 --> 01:09:53,729 >> En dan, als ik dat doe ster reeks plus 1, dat is hetzelfde als het doen scala 1306 01:09:53,729 --> 01:09:59,690 beugels een, die gewoon betekent dat ik ga naar de plaats die het wijzend op. 1307 01:09:59,690 --> 01:10:03,000 En dan de plus 1 merken me verschuiven een positie. 1308 01:10:03,000 --> 01:10:06,510 Dus ik ga naar deze positie, in feite, en zet de nummer twee. 1309 01:10:06,510 --> 01:10:10,900 >> En dan, tot slot, als ik dat doe serie plus 2, ga ik naar de plaats waar 1310 01:10:10,900 --> 01:10:11,825 wijzend matrix bij. 1311 01:10:11,825 --> 01:10:14,690 En toen ik naar het geheugen blokken. 1312 01:10:14,690 --> 01:10:16,240 En dan heb ik het nummer drie hier. 1313 01:10:16,240 --> 01:10:16,600 Yeah? 1314 01:10:16,600 --> 01:10:21,400 >> PUBLIEK: Dus ster array is gewoon zeggen de allereerste punt. 1315 01:10:21,400 --> 01:10:25,090 En u kunt toevoegen 1, alleen maar omdat we zijn pas echt 1316 01:10:25,090 --> 01:10:27,295 verwijzen naar dat eerste adres. 1317 01:10:27,295 --> 01:10:28,545 >> LUCAS: Ja. 1318 01:10:28,545 --> 01:10:32,720 1319 01:10:32,720 --> 01:10:36,020 Waarom hebben we bijvoorbeeld zeggen reeks 0, serie 1 en serie 2? 1320 01:10:36,020 --> 01:10:38,970 1321 01:10:38,970 --> 01:10:42,790 Ik zeg, waarom doe je dan 0, 1, 2, 3 in plaats van 1, 2, 3? 1322 01:10:42,790 --> 01:10:46,550 Een van de redenen is, een computer programmeurs beginnen het liefst 1323 01:10:46,550 --> 01:10:47,750 tellen vanaf 0. 1324 01:10:47,750 --> 01:10:52,370 Twee is want als je scala 0 doen, het is hetzelfde als het doen scala 1325 01:10:52,370 --> 01:10:56,330 plus 0, wat betekent dat ik ga naar die positie, en ik niet 1326 01:10:56,330 --> 01:10:59,320 skip elke geheugen blokken. 1327 01:10:59,320 --> 01:11:01,750 Dus ik weet niet verplaatst geheugen blokken. 1328 01:11:01,750 --> 01:11:02,015 Yeah? 1329 01:11:02,015 --> 01:11:03,265 >> PUBLIEK: [onverstaanbaar]? 1330 01:11:03,265 --> 01:11:05,928 1331 01:11:05,928 --> 01:11:12,670 >> LUCAS: Dus ze vraagt ​​wat is het verschil tussen doen 1332 01:11:12,670 --> 01:11:14,000 dit of doet malloc. 1333 01:11:14,000 --> 01:11:17,550 Een van de verschillen is dat int rij 3 is het creëren van een 1334 01:11:17,550 --> 01:11:19,260 serie op de stapel. 1335 01:11:19,260 --> 01:11:23,080 En toen ik malloc doen, het creëert op de heap. 1336 01:11:23,080 --> 01:11:25,250 Heeft dat zin? 1337 01:11:25,250 --> 01:11:28,870 >> Dus hoe werkt malloc eigenlijk? 1338 01:11:28,870 --> 01:11:32,245 Dus waarom moeten we zelfs naar malloc gebruiken? 1339 01:11:32,245 --> 01:11:35,730 1340 01:11:35,730 --> 01:11:39,700 Je compiler soort figuren uit alle de variabelen die u gedeclareerd. 1341 01:11:39,700 --> 01:11:44,040 En hij schept ruimte voor alle van hen in de stapel. 1342 01:11:44,040 --> 01:11:47,180 Dus al je variabelen gaan ergens in de stack. 1343 01:11:47,180 --> 01:11:49,460 Dus hier is de omgevingsvariabelen. 1344 01:11:49,460 --> 01:11:53,850 >> Dus eigenlijk, ruimte voor die variabelen in het geheugen is toegewezen aan 1345 01:11:53,850 --> 01:11:55,080 compileren. 1346 01:11:55,080 --> 01:11:58,790 Het betekent dus dat uw computer al die variabelen kent 1347 01:11:58,790 --> 01:11:59,790 vooraf. 1348 01:11:59,790 --> 01:12:02,500 Het hoeft niet te weten wat de waarde je gaat in hen te zetten. 1349 01:12:02,500 --> 01:12:05,490 Maar het moet weten hoe hoeveel geheugen je nodig hebt. 1350 01:12:05,490 --> 01:12:09,380 >> Maar nu laten we zeggen dat, bijvoorbeeld, je het creëren van een array of het nemen van een 1351 01:12:09,380 --> 01:12:13,430 snaar die je neemt van de gebruiker. 1352 01:12:13,430 --> 01:12:17,300 Je weet niet hoe lang de string gaat worden, bijvoorbeeld. 1353 01:12:17,300 --> 01:12:20,600 Dus je weet niet precies hoeveel memory blocks u wijzen, toch? 1354 01:12:20,600 --> 01:12:24,120 >> Dus het maakt niet echt zinvol voor je zeggen zet 100 karakters. 1355 01:12:24,120 --> 01:12:26,420 En wat als de gebruiker schrijft 150? 1356 01:12:26,420 --> 01:12:27,670 Je gaat om te worden geschroefd. 1357 01:12:27,670 --> 01:12:30,160 1358 01:12:30,160 --> 01:12:34,620 >> Dus eigenlijk kun je niet zeker zijn van hoe hoeveel geheugen je nodig hebt om te wijzen 1359 01:12:34,620 --> 01:12:35,960 wanneer u het programma samen te stellen. 1360 01:12:35,960 --> 01:12:38,240 Je weet gewoon dat op de looptijd. 1361 01:12:38,240 --> 01:12:39,950 Dus dat is de reden waarom u de heap. 1362 01:12:39,950 --> 01:12:47,610 Dus de heap gaat geheugen dat u tijdens het bent toewijzing 1363 01:12:47,610 --> 01:12:50,810 duur van het programma draait. 1364 01:12:50,810 --> 01:12:55,780 >> Dus eigenlijk, als je malloc doen, wat je doet is het toewijzen van geheugen aan 1365 01:12:55,780 --> 01:13:00,160 runtime, wat betekent dat je beslissen precies op dat moment dat je 1366 01:13:00,160 --> 01:13:02,670 moet die geheugen. 1367 01:13:02,670 --> 01:13:04,210 Dus dat is als je het toewijzen van het. 1368 01:13:04,210 --> 01:13:06,430 Heeft dat zin? 1369 01:13:06,430 --> 01:13:11,690 >> Dus denk eraan, de stapel heeft variabelen die zijn gemaakt op het compileren. 1370 01:13:11,690 --> 01:13:14,560 En dan is de hoop heeft variabelen die ontstaan ​​als je gaat 1371 01:13:14,560 --> 01:13:15,600 met malloc bijvoorbeeld. 1372 01:13:15,600 --> 01:13:16,850 >> PUBLIEK: [onverstaanbaar]? 1373 01:13:16,850 --> 01:13:19,179 1374 01:13:19,179 --> 01:13:24,340 >> LUCAS: Dus GetString is naar malloc bellen. 1375 01:13:24,340 --> 01:13:26,710 Laat me praten over malloc, en Ik zal GetString uitleggen. 1376 01:13:26,710 --> 01:13:32,000 Dus malloc is hetzelfde zoals het toewijzen van geheugen. 1377 01:13:32,000 --> 01:13:34,600 Dus het gaat om toe te wijzen geheugen op de heap. 1378 01:13:34,600 --> 01:13:40,010 En het gaat om een ​​pointer terug te keren naar waar dat geheugen is toegewezen aan. 1379 01:13:40,010 --> 01:13:43,090 >> Dus als je doen-- 1380 01:13:43,090 --> 01:13:44,910 hier voor example-- 1381 01:13:44,910 --> 01:13:45,830 n ster pointer. 1382 01:13:45,830 --> 01:13:50,520 En dan wijzer gelijk aan malloc afmeting van 10 inch tijden. 1383 01:13:50,520 --> 01:13:52,110 Ik ben het creëren van een pointer. 1384 01:13:52,110 --> 01:13:59,020 En dan heb ik het toewijzen van die pointer naar de waarde van de pointer die malloc 1385 01:13:59,020 --> 01:13:59,680 geeft me. 1386 01:13:59,680 --> 01:14:04,150 >> Dus ik vraag malloc kunt u toewijzen space 10 integers. 1387 01:14:04,150 --> 01:14:05,390 Dat is wat het zegt. 1388 01:14:05,390 --> 01:14:09,020 En malloc geeft me weer een pointer naar die plaats. 1389 01:14:09,020 --> 01:14:11,460 Zinvol? 1390 01:14:11,460 --> 01:14:12,270 OK. 1391 01:14:12,270 --> 01:14:17,940 Ik En GetString is, in principe, een doen bellen om malloc zodat u kunt toewijzen 1392 01:14:17,940 --> 01:14:21,680 geheugen tijdens runtime. 1393 01:14:21,680 --> 01:14:26,460 >> Altijd onthouden om te controleren op null omdat malloc gaat null terug 1394 01:14:26,460 --> 01:14:28,200 indien geen geheugen kan toewijzen. 1395 01:14:28,200 --> 01:14:31,660 Laten we zeggen dat je vraagt ​​voor een belachelijke hoeveelheid geheugen. 1396 01:14:31,660 --> 01:14:33,950 Uw computer is niet van plan te zijn kunnen wijzen dat veel. 1397 01:14:33,950 --> 01:14:36,410 >> Dus malloc wordt gewoon om terug te keren null. 1398 01:14:36,410 --> 01:14:42,210 Dus altijd onthouden om te controleren of de pointer die je kreeg van malloc is 1399 01:14:42,210 --> 01:14:45,640 null of niet omdat, als het is, zou je worden dereferentie een pointer en 1400 01:14:45,640 --> 01:14:48,340 waardoor zij fouten. 1401 01:14:48,340 --> 01:14:50,930 En tot slot, vergeet niet uw geheugen vrij. 1402 01:14:50,930 --> 01:14:57,800 1403 01:14:57,800 --> 01:15:00,560 >> Malloc is het creëren van het geheugen in de heap. 1404 01:15:00,560 --> 01:15:03,436 En je moet het geheugen vrij voordat het programma is afgelopen. 1405 01:15:03,436 --> 01:15:05,370 OK, dat is alles voor mij. 1406 01:15:05,370 --> 01:15:07,900 Sorry, Rob. 1407 01:15:07,900 --> 01:15:07,950 Bedankt. 1408 01:15:07,950 --> 01:15:09,878 >> [Applaus] 1409 01:15:09,878 --> 01:15:12,679 >> LUCAS: Elke laatste vragen voordat Rob komt? 1410 01:15:12,679 --> 01:15:13,138 Nee? 1411 01:15:13,138 --> 01:15:13,597 Yeah? 1412 01:15:13,597 --> 01:15:15,892 >> Publiek: Ik zag het niet deze online. 1413 01:15:15,892 --> 01:15:17,269 Heb je het nog geupload? 1414 01:15:17,269 --> 01:15:19,106 >> LUCAS: Ik denk dat Dave is snel te uploaden. 1415 01:15:19,106 --> 01:15:19,880 >> DAVE: Het zal worden geplaatst. 1416 01:15:19,880 --> 01:15:20,310 >> LUCAS: Het zal online zijn. 1417 01:15:20,310 --> 01:15:21,175 >> Publiek: Het is. 1418 01:15:21,175 --> 01:15:22,090 >> LUCAS: It's up? 1419 01:15:22,090 --> 01:15:23,157 OK. 1420 01:15:23,157 --> 01:15:23,644 Yeah? 1421 01:15:23,644 --> 01:15:27,053 >> PUBLIEK: [onverstaanbaar]? 1422 01:15:27,053 --> 01:15:30,285 >> LUCAS: Ja, moet je bevrijden van alle geheugen die wordt gezet in de hoop. 1423 01:15:30,285 --> 01:15:31,535 >> PUBLIEK: [onverstaanbaar]? 1424 01:15:31,535 --> 01:15:34,518 1425 01:15:34,518 --> 01:15:36,160 >> LUCAS: Ja. 1426 01:15:36,160 --> 01:15:39,980 Elke keer dat je een cultuur malloc, moet je een cultuur vrij hebben 1427 01:15:39,980 --> 01:15:42,640 nadat u stopt met het gebruik van die variabele. 1428 01:15:42,640 --> 01:15:44,800 Dus malloc en gratis zijn altijd samen. 1429 01:15:44,800 --> 01:15:45,410 Hun beste vrienden. 1430 01:15:45,410 --> 01:15:46,720 Yeah. 1431 01:15:46,720 --> 01:15:47,970 Rob? 1432 01:15:47,970 --> 01:15:55,595 1433 01:15:55,595 --> 01:15:56,850 >> ROB: Ik zal snel gaan. 1434 01:15:56,850 --> 01:16:00,466 En ook de video zal worden opgemaakt. 1435 01:16:00,466 --> 01:16:01,716 Ik heb de microfoon op. 1436 01:16:01,716 --> 01:16:24,060 1437 01:16:24,060 --> 01:16:26,230 >> OK, dus week vijf dingen. 1438 01:16:26,230 --> 01:16:27,970 Het eerste wat we hebben is de stack. 1439 01:16:27,970 --> 01:16:33,390 Dus vergeet niet dat er maar een stapel frames per actieve functie oproep. 1440 01:16:33,390 --> 01:16:34,710 We zullen zien dat in een tweede. 1441 01:16:34,710 --> 01:16:37,850 En ook niet vergeten wat er werkelijk gaat in elk stackframe gaan worden 1442 01:16:37,850 --> 01:16:41,880 de lokale variabelen van onze functies de argumenten die worden doorgegeven aan onze 1443 01:16:41,880 --> 01:16:43,880 functies, samen met een partner andere dingen die je echt niet 1444 01:16:43,880 --> 01:16:45,260 zorgen te maken over. 1445 01:16:45,260 --> 01:16:50,950 >> Dus hier is een voorbeeld programma, waar, kennisgeving, de belangrijkste is printfing de terugkeer 1446 01:16:50,950 --> 01:16:52,830 waarde van foo 4. 1447 01:16:52,830 --> 01:16:57,930 foo is gewoon naar de terugkeer waarde van de bar 4 komma 6. 1448 01:16:57,930 --> 01:17:02,380 En de bar gaat om enkele lokale ingesteld variabele n gelijk aan 4 maal 6. 1449 01:17:02,380 --> 01:17:03,920 En dan terug n. 1450 01:17:03,920 --> 01:17:09,130 >> Dus laten we eens kijken naar de stapel hele de feitelijke variant van dit programma. 1451 01:17:09,130 --> 01:17:10,500 Dus er is de bodem van onze stack. 1452 01:17:10,500 --> 01:17:12,620 Vergeet niet dat de stapel opgroeit. 1453 01:17:12,620 --> 01:17:15,370 Dus onderaan het stack, we hebben een stack frame voor main. 1454 01:17:15,370 --> 01:17:17,000 Wanneer het programma start, de belangrijkste altijd zal zijn op de 1455 01:17:17,000 --> 01:17:18,560 bodem van het stack. 1456 01:17:18,560 --> 01:17:20,880 >> En wat is de binnenkant van onze stack frame voor main? 1457 01:17:20,880 --> 01:17:23,810 Dus hoewel er geen lokale variabelen bij de belangrijkste, zoals ik al eerder zei, 1458 01:17:23,810 --> 01:17:29,670 we hebben argc en RGV toegang tot de ruimte binnenzijde van de belangrijkste stack frame. 1459 01:17:29,670 --> 01:17:33,260 Dus main gaat nu bellen met de functie foo. 1460 01:17:33,260 --> 01:17:35,125 En dat betekent dat foo gaat krijgt zijn eigen stack frame. 1461 01:17:35,125 --> 01:17:36,970 >> Dus nu zijn we de binnenkant van de functie foo. 1462 01:17:36,970 --> 01:17:38,610 En wat moet er in gaan foo's stackframe? 1463 01:17:38,610 --> 01:17:41,100 Nou, foo heeft een argument n. 1464 01:17:41,100 --> 01:17:45,440 En n gelijk is aan 4 want dat is wat belangrijkste is het passeren als argument foo's. 1465 01:17:45,440 --> 01:17:48,490 >> Dus nu foo gaat bar noemen. 1466 01:17:48,490 --> 01:17:52,070 Wat is de bar gaat naar binnen te hebben van haar 'stackframe? 1467 01:17:52,070 --> 01:17:55,610 Het is x gelijk aan 4 y gelijk aan zes. 1468 01:17:55,610 --> 01:17:58,540 Dat is niet alles dat we gaan te hebben in de stackframe omdat bar 1469 01:17:58,540 --> 01:18:00,580 heeft ook een lokale variabele n. 1470 01:18:00,580 --> 01:18:03,370 En n we gaan gelijk aan 24 in te stellen. 1471 01:18:03,370 --> 01:18:05,750 >> Dus nu bar gaat terug n. 1472 01:18:05,750 --> 01:18:09,300 Dus bar keert terug naar 24 de stackframe foo. 1473 01:18:09,300 --> 01:18:12,560 En omdat de bar is nu terug, dat betekent dat we knallend het stackframe 1474 01:18:12,560 --> 01:18:14,250 voor bar af van de stapel. 1475 01:18:14,250 --> 01:18:18,430 Dus al het geheugen die bar was geweest gebruikt, is nu uit de stapel. 1476 01:18:18,430 --> 01:18:21,550 >> Nu, foo gaat ook tot 24 terug te keren naar de belangrijkste. 1477 01:18:21,550 --> 01:18:25,470 Dus nu dat foo terugkeert, het geheugen dat foo gebruikte in zijn ' 1478 01:18:25,470 --> 01:18:27,550 stackframe is ook weg. 1479 01:18:27,550 --> 01:18:29,660 En nu, de belangrijkste gaat printf bellen. 1480 01:18:29,660 --> 01:18:31,660 Dus printf is gewoon een andere functie. 1481 01:18:31,660 --> 01:18:35,320 Toen we printf noemen, gaat het om een andere stack frame voor de printf 1482 01:18:35,320 --> 01:18:36,470 functie-oproep. 1483 01:18:36,470 --> 01:18:37,990 >> Wat zijn we passeren printf? 1484 01:18:37,990 --> 01:18:40,090 Dat is wat er aan de hand om te gaan op de stack frame. 1485 01:18:40,090 --> 01:18:44,970 Op zijn minst, we passeren dat percentage i backslash n en 1486 01:18:44,970 --> 01:18:47,180 het argument 24. 1487 01:18:47,180 --> 01:18:50,370 Het is misschien meer hebben in het stapelframe als printf gebeurt te zijn met behulp van enkele 1488 01:18:50,370 --> 01:18:51,200 lokale variabelen. 1489 01:18:51,200 --> 01:18:51,920 We weten het niet. 1490 01:18:51,920 --> 01:18:53,810 >> Maar dat alles gaat in printf's stack frame. 1491 01:18:53,810 --> 01:18:55,740 Het gaat om de printf voeren. 1492 01:18:55,740 --> 01:18:56,830 Dan printf gedaan. 1493 01:18:56,830 --> 01:18:57,820 Het zal terugkeren. 1494 01:18:57,820 --> 01:18:58,960 Tot slot, de belangrijkste is gedaan. 1495 01:18:58,960 --> 01:18:59,860 Belangrijkste zal terugkeren. 1496 01:18:59,860 --> 01:19:02,020 En dan is dit programma geschreven is. 1497 01:19:02,020 --> 01:19:02,480 Yeah? 1498 01:19:02,480 --> 01:19:04,505 >> PUBLIEK: Ziet u [onverstaanbaar] 1499 01:19:04,505 --> 01:19:05,900 argumenten [onverstaanbaar] 1500 01:19:05,900 --> 01:19:06,830 parameters? 1501 01:19:06,830 --> 01:19:09,970 >> ROB: Dus er is een subtiel verschil tussen argumenten en parameters. 1502 01:19:09,970 --> 01:19:14,400 En echt, gemeen spreken, mensen de neiging om gewoon meng ze de hele tijd. 1503 01:19:14,400 --> 01:19:17,550 Maar de parameters zijn de formele noemen van de dingen. 1504 01:19:17,550 --> 01:19:20,180 >> Dus argc en argv zijn de parameters bij de belangrijkste. 1505 01:19:20,180 --> 01:19:23,440 Argumenten zijn wat je eigenlijk passen in die parameters. 1506 01:19:23,440 --> 01:19:28,340 Dus er als ik bel foo van 4, 4 is het argument dat ik passeren in. 1507 01:19:28,340 --> 01:19:31,460 En de parameter n, binnenin foo, neemt de waarde 4 1508 01:19:31,460 --> 01:19:32,880 sinds 4 was het argument. 1509 01:19:32,880 --> 01:19:35,826 >> PUBLIEK: [onverstaanbaar]? 1510 01:19:35,826 --> 01:19:37,880 >> ROB: n is een lokale variabele naar bar. 1511 01:19:37,880 --> 01:19:41,420 1512 01:19:41,420 --> 01:19:44,960 n is nog steeds lokaal naar foo, maar het is een parameter om foo. 1513 01:19:44,960 --> 01:19:48,190 Het is niet een lokale variabele. 1514 01:19:48,190 --> 01:19:48,546 Yeah? 1515 01:19:48,546 --> 01:19:51,180 >> PUBLIEK: [onverstaanbaar]? 1516 01:19:51,180 --> 01:19:55,400 >> ROB: foo is gewoon bellen bar en terug wat bar rendement. 1517 01:19:55,400 --> 01:19:56,786 >> PUBLIEK: [onverstaanbaar]? 1518 01:19:56,786 --> 01:19:59,591 >> ROB: Ja, gewoon om te zien meerdere stack frames. 1519 01:19:59,591 --> 01:20:00,082 Yeah? 1520 01:20:00,082 --> 01:20:03,519 >> PUBLIEK: Waarom werd foo genoemd voordat printf? 1521 01:20:03,519 --> 01:20:05,920 >> ROB: Waarom was foo aangeroepen voordat printf? 1522 01:20:05,920 --> 01:20:10,740 Dus ik zou kunnen hebben, in plaats daarvan, iets gedaan zoals int x gelijk foo van 4 1523 01:20:10,740 --> 01:20:12,980 en vervolgens afgedrukt x. 1524 01:20:12,980 --> 01:20:17,900 Maar ik samen de functie roepen in de printf argument. 1525 01:20:17,900 --> 01:20:23,670 >> Maar merk op dat we kunnen eigenlijk niet de oproep om printf totdat we uitvoeren 1526 01:20:23,670 --> 01:20:25,610 erachter te komen wat foo van 4 is. 1527 01:20:25,610 --> 01:20:27,480 Dus gaan we dit evalueren. 1528 01:20:27,480 --> 01:20:32,504 En maar een keer dat gedaan gaan om terug te komen en te evalueren dit. 1529 01:20:32,504 --> 01:20:32,990 Yeah? 1530 01:20:32,990 --> 01:20:37,364 >> PUBLIEK: Aangezien beide bar [onverstaanbaar] 1531 01:20:37,364 --> 01:20:41,738 waarde, waarom hebben we niet [onverstaanbaar]? 1532 01:20:41,738 --> 01:20:44,400 >> ROB: Ze moeten helemaal int. 1533 01:20:44,400 --> 01:20:46,260 Dat werd niet gevangen dan meerdere passages. 1534 01:20:46,260 --> 01:20:49,010 Dus het moet int bar en int foo aangezien deze beide 1535 01:20:49,010 --> 01:20:50,460 keren terug integers. 1536 01:20:50,460 --> 01:20:54,214 Leegte is alleen als ze niet gaan de werkelijke waarden terugkeren. 1537 01:20:54,214 --> 01:20:54,692 Yeah? 1538 01:20:54,692 --> 01:20:58,038 >> PUBLIEK: Als u een lijn gehad boven het rendement, [onverstaanbaar]? 1539 01:20:58,038 --> 01:21:01,862 1540 01:21:01,862 --> 01:21:03,730 >> ROB: Een lijn boven het rendement? 1541 01:21:03,730 --> 01:21:04,410 >> Publiek: Ja. 1542 01:21:04,410 --> 01:21:10,780 Net als je dat deed printf en [onverstaanbaar], zou het twee keer af te drukken? 1543 01:21:10,780 --> 01:21:12,992 >> ROB: Dus binnenkant van foo? 1544 01:21:12,992 --> 01:21:15,945 Als we een printf hier? 1545 01:21:15,945 --> 01:21:16,750 >> Publiek: Ja. 1546 01:21:16,750 --> 01:21:19,510 >> ROB: Dus als we een printf recht Hier zou het eenmaal drukken. 1547 01:21:19,510 --> 01:21:23,400 Aangezien wij roepen foo keer rechts hier, dan zullen we de printf geraakt. 1548 01:21:23,400 --> 01:21:24,620 Dan zullen we bar noemen. 1549 01:21:24,620 --> 01:21:25,710 En dan zal foo terugkeren. 1550 01:21:25,710 --> 01:21:26,275 En dat is het. 1551 01:21:26,275 --> 01:21:30,985 We alleen ooit tegenkomen de printf eens. 1552 01:21:30,985 --> 01:21:31,482 Yeah? 1553 01:21:31,482 --> 01:21:32,973 >> PUBLIEK: [onverstaanbaar] 1554 01:21:32,973 --> 01:21:37,950 printf bellen foo omdat we eerst bellen printf en dan gaan we voorbij 1555 01:21:37,950 --> 01:21:38,580 de argumenten. 1556 01:21:38,580 --> 01:21:40,960 >> ROB: Dus in theorie, is niet printf bellen foo? 1557 01:21:40,960 --> 01:21:42,220 Dus geen. 1558 01:21:42,220 --> 01:21:47,360 Alleen de volgorde waarin c gaat voeren deze dingen is, voordat we kunnen 1559 01:21:47,360 --> 01:21:49,800 bel een functie alle argumenten om de functie te 1560 01:21:49,800 --> 01:21:51,600 volledig worden geëvalueerd. 1561 01:21:51,600 --> 01:21:53,540 Dus is dit volledig geëvalueerd? 1562 01:21:53,540 --> 01:21:54,610 Ja, het is gewoon een string. 1563 01:21:54,610 --> 01:21:55,480 Het is gewoon een waarde. 1564 01:21:55,480 --> 01:21:57,200 >> Dan moeten we helemaal evalueert deze. 1565 01:21:57,200 --> 01:21:59,720 Zodra dit is gebeurd, nu al haar argumenten worden geëvalueerd. 1566 01:21:59,720 --> 01:22:01,982 En nu kunnen we het maken bellen om printf. 1567 01:22:01,982 --> 01:22:02,478 Yeah? 1568 01:22:02,478 --> 01:22:03,966 >> Publiek: Een vraag. 1569 01:22:03,966 --> 01:22:06,942 Als je een leegte functie, moet je terugkeer puntkomma? 1570 01:22:06,942 --> 01:22:09,910 >> ROB: Je hoeft niet een terugkeer puntkomma als je een leegte functie. 1571 01:22:09,910 --> 01:22:13,370 1572 01:22:13,370 --> 01:22:14,780 OK. 1573 01:22:14,780 --> 01:22:15,830 Dus nu wat hoop spullen. 1574 01:22:15,830 --> 01:22:19,640 Dus hoop is hoe we omgaan met dynamisch geheugenbeheer. 1575 01:22:19,640 --> 01:22:23,100 En direct contrast met de stack die we automatisch zouden noemen 1576 01:22:23,100 --> 01:22:24,100 geheugenbeheer. 1577 01:22:24,100 --> 01:22:27,140 >> Dus op de stapel, je nooit echt hebt te behandelen hoe de lokale variabelen 1578 01:22:27,140 --> 01:22:30,400 worden geduwd en knalde uit alle Deze stack frames en al dat spul. 1579 01:22:30,400 --> 01:22:31,070 U hoeft geen zorgen te maken over het. 1580 01:22:31,070 --> 01:22:32,070 Het is automatisch. 1581 01:22:32,070 --> 01:22:36,990 Dus de hoop is handmatig. 1582 01:22:36,990 --> 01:22:38,070 En de [onverstaanbaar] 1583 01:22:38,070 --> 01:22:41,260 komt deze functies malloc en gratis. 1584 01:22:41,260 --> 01:22:43,550 >> Dus hier is een ander programma. 1585 01:22:43,550 --> 01:22:47,145 Alles wat we aan het doen zijn is mallocing een integer. 1586 01:22:47,145 --> 01:22:49,360 We zijn het opslaan van in ster x. 1587 01:22:49,360 --> 01:22:52,520 Natuurlijk, we moeten controleren om te zien of x is null. 1588 01:22:52,520 --> 01:22:56,400 Dan gaan we gewoon stellen wat x wijst naar 50. 1589 01:22:56,400 --> 01:23:00,350 1590 01:23:00,350 --> 01:23:03,260 Print wat x naar wijst, afdrukken x, en dan vrij x. 1591 01:23:03,260 --> 01:23:08,920 >> Dus hoe is dit eigenlijk gaan kijken als we kijken naar onze stack en heap? 1592 01:23:08,920 --> 01:23:10,950 Dus zullen we opnieuw beginnen. 1593 01:23:10,950 --> 01:23:12,580 De bodem van het stack als voorheen. 1594 01:23:12,580 --> 01:23:15,930 Vergeet niet dat u heap direct verzet zich tegen de stapel? 1595 01:23:15,930 --> 01:23:18,850 Dus we gaan het hebben top van onze hoop daar. 1596 01:23:18,850 --> 01:23:22,590 >> Dus de bodem van het stack, we onze stack frame voor main. 1597 01:23:22,590 --> 01:23:28,000 Het heeft de ruimte voor argc, argv, en we nu een lokale variabele x, die 1598 01:23:28,000 --> 01:23:30,030 is een int ster. 1599 01:23:30,030 --> 01:23:32,240 Dus we gaan herhalen via dit programma. 1600 01:23:32,240 --> 01:23:34,420 Het eerste wat we hebben is een oproep tot malloc. 1601 01:23:34,420 --> 01:23:36,250 >> Dus we maken een oproep tot malloc. 1602 01:23:36,250 --> 01:23:37,100 Malloc is een functie. 1603 01:23:37,100 --> 01:23:38,770 Het gaat om een ​​stackframe krijgen. 1604 01:23:38,770 --> 01:23:40,180 Wat moeten we doorgeven aan malloc? 1605 01:23:40,180 --> 01:23:41,610 Dat gaat naar binnen te gaan van de stack frame. 1606 01:23:41,610 --> 01:23:45,130 We passeren de grootte van n, dat is 4. 1607 01:23:45,130 --> 01:23:49,700 Dus dat wordt doorgegeven aan malloc. 1608 01:23:49,700 --> 01:23:50,910 >> Wat doet malloc doen? 1609 01:23:50,910 --> 01:23:53,820 Het grijpt ons wat ruimte op de heap. 1610 01:23:53,820 --> 01:23:55,320 Dus we gaan naar de heap. 1611 01:23:55,320 --> 01:23:57,990 En we gaan om te grijpen 4 bytes van de hoop. 1612 01:23:57,990 --> 01:24:01,500 Dus laten we gewoon dat een willekeurig adres. 1613 01:24:01,500 --> 01:24:06,680 0x123 Net doen alsof is een adres dat op de heap. 1614 01:24:06,680 --> 01:24:12,300 >> Dus wat is eigenlijk de binnenkant van dat regio van het geheugen op adres Ox123? 1615 01:24:12,300 --> 01:24:13,080 Garbage. 1616 01:24:13,080 --> 01:24:15,270 Dus hebben we niets in het opgeslagen. 1617 01:24:15,270 --> 01:24:18,830 Dus voor zover wij weten, het kan van alles zijn. 1618 01:24:18,830 --> 01:24:20,560 Je moet er niet van uitgaan dat het nul. 1619 01:24:20,560 --> 01:24:23,870 Het is zeer waarschijnlijk niet nul. 1620 01:24:23,870 --> 01:24:26,260 >> Dus nu malloc rendement. 1621 01:24:26,260 --> 01:24:28,020 En wat doen we als malloc terugkeert? 1622 01:24:28,020 --> 01:24:29,800 We stellen wat het rendement. 1623 01:24:29,800 --> 01:24:32,290 We stellen x gelijk is aan wat Het is terug te keren. 1624 01:24:32,290 --> 01:24:33,690 Dus wat is het terug? 1625 01:24:33,690 --> 01:24:38,150 Het is de terugkeer 0x123 want dat is de adres van het geheugenblok dat 1626 01:24:38,150 --> 01:24:40,850 net toegewezen in de heap. 1627 01:24:40,850 --> 01:24:47,160 >> Dus terug 0x123 x gaat nu vastgesteld gelijk aan 0x123 die pictorially, 1628 01:24:47,160 --> 01:24:52,940 we vaak trekken als x met een effectief pijl wijst naar dat blok. 1629 01:24:52,940 --> 01:24:55,820 Maar x is gewoon het opslaan van dat adres. 1630 01:24:55,820 --> 01:24:58,670 Dus nu moeten we controleren of x is null. 1631 01:24:58,670 --> 01:24:59,120 Het is niet null. 1632 01:24:59,120 --> 01:25:02,170 We doen alsof dat malloc gelukt. 1633 01:25:02,170 --> 01:25:04,950 >> Dus nu ster x is gelijk aan 50. 1634 01:25:04,950 --> 01:25:08,450 Dus ster herinnert het betekent ga naar dat adres. 1635 01:25:08,450 --> 01:25:12,700 Dus 0x123 We gaan ga naar dat adres. 1636 01:25:12,700 --> 01:25:14,660 Dus dat brengt ons daar. 1637 01:25:14,660 --> 01:25:16,310 Wat doen we op dat adres? 1638 01:25:16,310 --> 01:25:19,020 We zijn het opslaan van 50. 1639 01:25:19,020 --> 01:25:22,500 >> Dus na deze regel is dat wat dingen gaan uitzien. 1640 01:25:22,500 --> 01:25:24,640 Dus nu is het niet meer garbage daarboven. 1641 01:25:24,640 --> 01:25:28,910 Nu weten we dat 50 is in dat bijzonder adres, omdat 1642 01:25:28,910 --> 01:25:32,410 We stellen het op dat. 1643 01:25:32,410 --> 01:25:32,790 OK? 1644 01:25:32,790 --> 01:25:34,370 Dus nu gaan we om f te drukken. 1645 01:25:34,370 --> 01:25:38,490 >> Dus eerst gaan we ster x drukken. 1646 01:25:38,490 --> 01:25:39,640 Dus wat is ster x? 1647 01:25:39,640 --> 01:25:44,300 Nogmaals, ster x betekent ga naar het wat x wijst. 1648 01:25:44,300 --> 01:25:47,140 Dus x is het opslaan van 0x123 Ga naar dat. 1649 01:25:47,140 --> 01:25:48,490 We krijgen 50. 1650 01:25:48,490 --> 01:25:50,540 Dus printen f dat. 1651 01:25:50,540 --> 01:25:54,900 En dat betekent dat het gaat om af te drukken 50. 1652 01:25:54,900 --> 01:25:56,850 En dan dat terugkeert. 1653 01:25:56,850 --> 01:25:58,340 >> En dan hebben we het tweede printf. 1654 01:25:58,340 --> 01:25:59,370 We zijn nu procent p. 1655 01:25:59,370 --> 01:26:01,680 Als je het niet hebt gezien, dat is hoe je een pointer te drukken. 1656 01:26:01,680 --> 01:26:04,960 Dus we hebben procent i, procent f, en al die reeds. 1657 01:26:04,960 --> 01:26:07,160 Dus procent p, drukt u een pointer. 1658 01:26:07,160 --> 01:26:08,920 >> Dus x is een pointer. 1659 01:26:08,920 --> 01:26:13,440 Dus als we gaan printen x zelf, we afdrukken wat is eigenlijk binnen 1660 01:26:13,440 --> 01:26:19,220 x, waarvan de eerste is 0x123 dus afdruk f gaat om af te drukken 50. 1661 01:26:19,220 --> 01:26:23,620 De tweede druk f gaat om af te drukken 0x123 Yeah? 1662 01:26:23,620 --> 01:26:27,460 >> PUBLIEK: Heb jij procent gebruiken x om een ​​pointer te drukken? 1663 01:26:27,460 --> 01:26:31,200 >> ROB: Dus denk je procent gebruik x om een ​​pointer te drukken? 1664 01:26:31,200 --> 01:26:38,350 Zo kun je maar x procent is gewoon, algemeen, voor als als je wat 1665 01:26:38,350 --> 01:26:40,325 integer en u wilt afdrukken als een hexadecimaal. 1666 01:26:40,325 --> 01:26:43,250 1667 01:26:43,250 --> 01:26:44,880 Dat is gewoon hoe je dat doet. 1668 01:26:44,880 --> 01:26:47,160 >> Overwegende procent d zou afgedrukt als decimaal. 1669 01:26:47,160 --> 01:26:50,310 Dat waren we krijgen procent d. i is gewoon integer. 1670 01:26:50,310 --> 01:26:52,690 procent p specifiek voor de pointers. 1671 01:26:52,690 --> 01:26:54,060 >> Dus x is een pointer. 1672 01:26:54,060 --> 01:26:56,360 We willen procent p. 1673 01:26:56,360 --> 01:26:57,937 Maar procent x zou kunnen werken. 1674 01:26:57,937 --> 01:26:58,414 Yeah? 1675 01:26:58,414 --> 01:26:59,664 >> PUBLIEK: [onverstaanbaar]? 1676 01:26:59,664 --> 01:27:04,138 1677 01:27:04,138 --> 01:27:05,388 >> ROB: Ja. 1678 01:27:05,388 --> 01:27:07,870 1679 01:27:07,870 --> 01:27:13,440 Tenminste voor deze call-- dus niet opnemen in hier. 1680 01:27:13,440 --> 01:27:19,850 Maar deze twee argumenten zijn noodzakelijk binnenkant van deze stackframe 1681 01:27:19,850 --> 01:27:23,040 naast de lokale variabelen printf gebeurt te gebruiken. 1682 01:27:23,040 --> 01:27:27,020 En dan de volgende oproep om nu printf binnenkant van printf stack frame is 1683 01:27:27,020 --> 01:27:33,960 procent p backslash n en wat de waarde van x is, die 0x123. 1684 01:27:33,960 --> 01:27:34,425 Yeah? 1685 01:27:34,425 --> 01:27:35,675 >> PUBLIEK: [onverstaanbaar]? 1686 01:27:35,675 --> 01:27:38,145 1687 01:27:38,145 --> 01:27:40,880 >> ROB: Het zal iets te printen dat ziet er zo uit. 1688 01:27:40,880 --> 01:27:41,846 >> PUBLIEK: [onverstaanbaar]. 1689 01:27:41,846 --> 01:27:44,510 >> ROB: het drukt het dus in de adresbalk van vorm. 1690 01:27:44,510 --> 01:27:47,003 Het ziet eruit als een adres. 1691 01:27:47,003 --> 01:27:47,494 Yeah? 1692 01:27:47,494 --> 01:27:49,458 >> PUBLIEK: [onverstaanbaar]? 1693 01:27:49,458 --> 01:27:51,075 >> ROB: Waarom is het wat? 1694 01:27:51,075 --> 01:27:52,920 >> PUBLIEK: [onverstaanbaar]? 1695 01:27:52,920 --> 01:27:55,240 >> ROB: Waarom is dit pointer 4 bytes? 1696 01:27:55,240 --> 01:27:58,500 Dus er zijn een hele hoop van 0's voor deze. 1697 01:27:58,500 --> 01:28:03,740 Dus het is echt 0x0000000123. 1698 01:28:03,740 --> 01:28:06,510 Op een 64-bits systeem, zou er een hele hoop meer nullen. 1699 01:28:06,510 --> 01:28:11,410 1700 01:28:11,410 --> 01:28:11,900 Yeah? 1701 01:28:11,900 --> 01:28:13,150 >> PUBLIEK: [onverstaanbaar]. 1702 01:28:13,150 --> 01:28:17,290 1703 01:28:17,290 --> 01:28:21,130 >> ROB: Dus de eerste printf gaat print-- 1704 01:28:21,130 --> 01:28:21,980 >> PUBLIEK: [onverstaanbaar]. 1705 01:28:21,980 --> 01:28:24,420 >> ROB: Ja, het gaat om af te drukken x wat wijst. 1706 01:28:24,420 --> 01:28:27,030 1707 01:28:27,030 --> 01:28:29,070 Star zegt wat is dit ding wijst. 1708 01:28:29,070 --> 01:28:30,300 Pak het. 1709 01:28:30,300 --> 01:28:31,455 Dus wat is het verwijzen naar? 1710 01:28:31,455 --> 01:28:31,850 50. 1711 01:28:31,850 --> 01:28:32,410 Pak het. 1712 01:28:32,410 --> 01:28:33,390 Dat is wat we gaan om af te drukken. 1713 01:28:33,390 --> 01:28:37,020 Overwegende dat de volgende, we zijn gewoon afdrukken x zelf. 1714 01:28:37,020 --> 01:28:38,850 Wat is de binnenkant van f? 1715 01:28:38,850 --> 01:28:43,710 0x123. 1716 01:28:43,710 --> 01:28:44,500 OK. 1717 01:28:44,500 --> 01:28:46,620 >> En dan, ten slotte, hebben we de vrije. 1718 01:28:46,620 --> 01:28:48,040 Wat moeten we overgaan tot gratis? 1719 01:28:48,040 --> 01:28:49,470 We passeren x. 1720 01:28:49,470 --> 01:28:52,380 Die tijd heb ik eigenlijk getoond in de stack frame. 1721 01:28:52,380 --> 01:28:56,370 >> Dus we passeren van de waarde 0x123 vrij. 1722 01:28:56,370 --> 01:28:59,070 Dus nu gratis weet, oke, Ik moet gaan naar de heap 1723 01:28:59,070 --> 01:29:00,050 en gratis dat geheugen. 1724 01:29:00,050 --> 01:29:03,920 Het wordt niet meer gebruikt, wat is op het adres 0x123. 1725 01:29:03,920 --> 01:29:07,010 >> Zo vrij gaat los dat van de hoop. 1726 01:29:07,010 --> 01:29:09,490 Nu is onze hoop is weer leeg. 1727 01:29:09,490 --> 01:29:11,120 We hebben geen geheugen lekken. 1728 01:29:11,120 --> 01:29:12,940 Nu vrij zal terugkeren. 1729 01:29:12,940 --> 01:29:16,130 Merk op dat x is nog 0x123. 1730 01:29:16,130 --> 01:29:18,240 Maar dat is nu niet geldig geheugen. 1731 01:29:18,240 --> 01:29:21,220 1732 01:29:21,220 --> 01:29:23,986 We moeten niet langer dereferentie x. 1733 01:29:23,986 --> 01:29:24,440 Yeah? 1734 01:29:24,440 --> 01:29:27,240 >> PUBLIEK: Is return 0 overbodig? 1735 01:29:27,240 --> 01:29:28,290 >> ROB: Is returen 0 overbodig? 1736 01:29:28,290 --> 01:29:31,110 Ja. 1737 01:29:31,110 --> 01:29:33,950 We zetten gewoon dat er vanwege we hebben een terugkeer een voor lucht. 1738 01:29:33,950 --> 01:29:36,830 Dus het is net als, ja, laat onder meer de return 0. 1739 01:29:36,830 --> 01:29:37,310 Yeah? 1740 01:29:37,310 --> 01:29:38,560 >> PUBLIEK: [onverstaanbaar]? 1741 01:29:38,560 --> 01:29:42,110 1742 01:29:42,110 --> 01:29:45,580 >> ROB: Dus na free x, wat gebeurt er als we proberen om dereferentie de wijzer? 1743 01:29:45,580 --> 01:29:47,240 Het is mogelijk dat er niets mis gaat. 1744 01:29:47,240 --> 01:29:49,330 Het is mogelijk dat we nog steeds 50. 1745 01:29:49,330 --> 01:29:53,590 >> Het is mogelijk, ook, dat dat het geheugen is nu gebruikt voor iets anders. 1746 01:29:53,590 --> 01:29:57,140 Dus het is onbepaald gedrag. 1747 01:29:57,140 --> 01:30:00,772 En ongedefinieerde iets betekent kan gebeuren. 1748 01:30:00,772 --> 01:30:01,250 Yeah? 1749 01:30:01,250 --> 01:30:02,500 >> PUBLIEK: [onverstaanbaar]? 1750 01:30:02,500 --> 01:30:07,942 1751 01:30:07,942 --> 01:30:10,830 >> ROB: Nee, dus als je toewijzen x naar iets anders. 1752 01:30:10,830 --> 01:30:15,870 Dus als hier hebben we gezegd x gelijk malloc iets anders-- 1753 01:30:15,870 --> 01:30:17,100 malloc grootte event-- 1754 01:30:17,100 --> 01:30:20,180 dan is dat originele blok geheugen wordt niet vrijgegeven. 1755 01:30:20,180 --> 01:30:21,490 En wij hebben officieel kwijt. 1756 01:30:21,490 --> 01:30:23,150 Dat is een geheugenlek. 1757 01:30:23,150 --> 01:30:25,090 We hebben alle verwijzingen verloren dat geheugenblok. 1758 01:30:25,090 --> 01:30:26,827 Dus er is geen manier kunnen we ooit bevrijden. 1759 01:30:26,827 --> 01:30:32,074 1760 01:30:32,074 --> 01:30:36,630 OK, dus dan terug 0 middel gedaan. 1761 01:30:36,630 --> 01:30:37,900 >> Oke, dus stack overflow. 1762 01:30:37,900 --> 01:30:39,320 Wat is het idee hier? 1763 01:30:39,320 --> 01:30:41,210 Dus vergeet niet, is hoop naar beneden gaat. 1764 01:30:41,210 --> 01:30:43,480 Stack gaat omhoog. 1765 01:30:43,480 --> 01:30:48,000 Dus dit was het voorbeeld van lezing, Ik denk dat, waar de belangrijkste is gewoon om 1766 01:30:48,000 --> 01:30:51,380 noemen deze functie foo, die gaat zichzelf recursief bellen over en 1767 01:30:51,380 --> 01:30:52,320 opnieuw. 1768 01:30:52,320 --> 01:30:55,370 >> Dus stack frames gaan werken precies hetzelfde. 1769 01:30:55,370 --> 01:30:58,130 Dus we gaan om te beginnen met de belangrijkste de onderste stapel frame. 1770 01:30:58,130 --> 01:31:02,000 Dan belangrijkste gaat foo noemen, die gaat een stackframe krijgen. 1771 01:31:02,000 --> 01:31:04,260 >> Dan foo gaat foo noemen weer, die gaat krijgen 1772 01:31:04,260 --> 01:31:05,500 een andere stack frame. 1773 01:31:05,500 --> 01:31:08,270 En dan opnieuw, en opnieuw, en opnieuw, en weer tot, uiteindelijk, we lopen 1774 01:31:08,270 --> 01:31:09,190 in de heap. 1775 01:31:09,190 --> 01:31:11,990 Dus dit is hoe we een stack overflow. 1776 01:31:11,990 --> 01:31:14,910 En op dit punt, je Seg fout. 1777 01:31:14,910 --> 01:31:17,335 Of je zou echt seg fout voordat dit punt, maar ja. 1778 01:31:17,335 --> 01:31:19,660 >> PUBLIEK: Is kern dump de hetzelfde als seg fout? 1779 01:31:19,660 --> 01:31:26,140 >> ROB: Zo zie je segmentatie schuld kern gedumpt. 1780 01:31:26,140 --> 01:31:28,760 Je krijgt een core dump wanneer je Seg fout. 1781 01:31:28,760 --> 01:31:32,580 En het is als een dump van alle inhoud van je huidige geheugen, zodat 1782 01:31:32,580 --> 01:31:36,670 dat je kunt proberen en te identificeren waarom je Seg verweten. 1783 01:31:36,670 --> 01:31:37,135 Yeah? 1784 01:31:37,135 --> 01:31:38,385 >> PUBLIEK: [onverstaanbaar]? 1785 01:31:38,385 --> 01:31:40,855 1786 01:31:40,855 --> 01:31:45,460 >> ROB: Dus een segmentation fault middel er is een stack overflow. 1787 01:31:45,460 --> 01:31:47,060 Dus niet per se. 1788 01:31:47,060 --> 01:31:49,880 Een segmentatie fout betekent dat je bent raken geheugen wijze 1789 01:31:49,880 --> 01:31:50,880 moet je niet zijn. 1790 01:31:50,880 --> 01:31:54,750 Dus een manier dat zoiets gebeurt is, wanneer je stack overflow, we beginnen te raken 1791 01:31:54,750 --> 01:31:58,736 geheugen zodanig dat we niet moeten zijn. 1792 01:31:58,736 --> 01:31:59,208 Yeah? 1793 01:31:59,208 --> 01:32:00,458 >> PUBLIEK: [onverstaanbaar]? 1794 01:32:00,458 --> 01:32:03,456 1795 01:32:03,456 --> 01:32:05,830 >> ROB: Dus binnen van een oneindige lus. 1796 01:32:05,830 --> 01:32:08,770 Als, dit is als een recursieve oneindige lus en dus een ander krijgen we 1797 01:32:08,770 --> 01:32:09,770 stackframe elke keer. 1798 01:32:09,770 --> 01:32:13,540 Maar binnen van bijvoorbeeld een oneindige terwijl een-- 1799 01:32:13,540 --> 01:32:16,390 goed, laten we het nog niet eens af te drukken F-- 1800 01:32:16,390 --> 01:32:17,040 iets doen. 1801 01:32:17,040 --> 01:32:18,390 Whatever. 1802 01:32:18,390 --> 01:32:20,610 >> We zijn niet van plan te zijn om een andere stack frame. 1803 01:32:20,610 --> 01:32:22,530 We gaan gewoon looping houden meer dan deze ene instructie. 1804 01:32:22,530 --> 01:32:23,920 De stapel groeit niet. 1805 01:32:23,920 --> 01:32:27,290 Het is het feit dat elke recursieve oproep geeft ons een stapel frame. 1806 01:32:27,290 --> 01:32:31,231 Daarom krijgen we een stack overflow. 1807 01:32:31,231 --> 01:32:31,728 Yeah? 1808 01:32:31,728 --> 01:32:38,189 >> PUBLIEK: Dus als je tegen het krijgen while lus en dan [onverstaanbaar]? 1809 01:32:38,189 --> 01:32:42,000 >> ROB: Dus als binnenkant van de while loop er was een printf, je nog zou 1810 01:32:42,000 --> 01:32:42,790 niet seg fout. 1811 01:32:42,790 --> 01:32:46,090 Ik heb gewoon geen zin om dingen te verwarren. 1812 01:32:46,090 --> 01:32:46,610 Het zou loop. 1813 01:32:46,610 --> 01:32:48,225 Je zou een enkele stack krijgen Frame voor de printf. 1814 01:32:48,225 --> 01:32:49,580 >> Dan printf zou terugkeren. 1815 01:32:49,580 --> 01:32:50,280 Dan weer zou je lus. 1816 01:32:50,280 --> 01:32:51,460 Je zou een enkele stack krijgen Frame voor de printf. 1817 01:32:51,460 --> 01:32:52,850 Het zou terugkeren. 1818 01:32:52,850 --> 01:32:54,060 Single stack frame. 1819 01:32:54,060 --> 01:33:00,215 Dus je krijgt niet deze oneindige opstapelen stack frames. 1820 01:33:00,215 --> 01:33:03,185 >> PUBLIEK: [onverstaanbaar]? 1821 01:33:03,185 --> 01:33:04,040 >> ROB: Ja. 1822 01:33:04,040 --> 01:33:09,360 Dus deze stack overflow gebeurt omdat geen van deze 1823 01:33:09,360 --> 01:33:11,600 oproepen tot foo terugkeren. 1824 01:33:11,600 --> 01:33:15,250 Dus als we terugkeren, dan zouden we beginnen te verliezen stack frames. 1825 01:33:15,250 --> 01:33:17,870 En dan zouden we niet stack overflow. 1826 01:33:17,870 --> 01:33:20,070 En dat is waarom je een base case nodig voor uw persoonlijke functies. 1827 01:33:20,070 --> 01:33:22,992 1828 01:33:22,992 --> 01:33:23,479 Yeah? 1829 01:33:23,479 --> 01:33:27,375 >> PUBLIEK: Is de potentiële omvang en de stack voor heap hetzelfde voor 1830 01:33:27,375 --> 01:33:29,880 alle programma's? 1831 01:33:29,880 --> 01:33:31,910 >> ROB: Ongeveer. 1832 01:33:31,910 --> 01:33:35,090 Is de potentiële omvang van de stack en de hoop hetzelfde voor alle programma's? 1833 01:33:35,090 --> 01:33:37,180 Ruwweg. 1834 01:33:37,180 --> 01:33:40,080 Er is enige randomisering waarbij de stapel begint en 1835 01:33:40,080 --> 01:33:42,400 waarbij de heap begint. 1836 01:33:42,400 --> 01:33:45,870 Als je toevallig een heleboel hebben globale variabelen en dingen, zou je 1837 01:33:45,870 --> 01:33:49,520 weg te nemen van wat ruimte voor uw heap. 1838 01:33:49,520 --> 01:33:54,060 >> Op een 64-bits systeem, u vrijwel oneindige geheugen. 1839 01:33:54,060 --> 01:33:55,820 Er is gewoon zo veel. 1840 01:33:55,820 --> 01:33:59,250 Tussen 32 bits en 64 bits, dat is een significant verschil. 1841 01:33:59,250 --> 01:34:02,350 >> Je gaat een heleboel meer te krijgen stack en heap ruimte op een 64-bit 1842 01:34:02,350 --> 01:34:05,810 systeem, want er is gewoon meer adressen die ze kunnen gebruiken. 1843 01:34:05,810 --> 01:34:09,360 Maar individueel systeem, zal het ruwweg evenveel stack 1844 01:34:09,360 --> 01:34:10,785 en hoop ruimte. 1845 01:34:10,785 --> 01:34:13,635 1846 01:34:13,635 --> 01:34:15,530 Oke. 1847 01:34:15,530 --> 01:34:18,220 >> Dus laatste ding is compilatie. 1848 01:34:18,220 --> 01:34:19,810 Dus je moet dit proces te leren kennen. 1849 01:34:19,810 --> 01:34:22,240 Er zijn vier grote stappen. 1850 01:34:22,240 --> 01:34:24,400 Dus de eerste moet men zijn gemakkelijk te onthouden. 1851 01:34:24,400 --> 01:34:25,085 Pre-processing. 1852 01:34:25,085 --> 01:34:28,390 Het heeft de prefix vooraf daarin. 1853 01:34:28,390 --> 01:34:32,080 Dus het gaat voor alles. 1854 01:34:32,080 --> 01:34:34,000 >> Het ding om te onthouden is de hash. 1855 01:34:34,000 --> 01:34:37,250 Dus hash definieert en hash bevat in al deze. 1856 01:34:37,250 --> 01:34:39,560 Dat zijn alle pre-processor richtlijnen. 1857 01:34:39,560 --> 01:34:42,030 Dit zijn de dingen die de pre-processor zorgt. 1858 01:34:42,030 --> 01:34:43,680 >> Dus wat doet een pre-processor doen? 1859 01:34:43,680 --> 01:34:44,850 Het is echt een dom ding. 1860 01:34:44,850 --> 01:34:49,380 Al is het in staat zijn al deze kopiëren en knippen en plakken operaties. 1861 01:34:49,380 --> 01:34:51,790 >> Dus hash bevat standaard i0 dot h. 1862 01:34:51,790 --> 01:34:52,990 Wat is dat nou? 1863 01:34:52,990 --> 01:34:56,610 Het grijpen van de standaard i0 dot h dienen en te plakken in de top 1864 01:34:56,610 --> 01:34:58,960 waar het zegt hash bevat standaard i0 dot h. 1865 01:34:58,960 --> 01:35:02,480 >> En elke hash definiëren dat we hebben gezien, wat is dat? 1866 01:35:02,480 --> 01:35:06,730 Het kopiëren van de waarde die de hash gedefinieerd wordt gedefinieerd als en plakken dat 1867 01:35:06,730 --> 01:35:08,500 waar u de waarde. 1868 01:35:08,500 --> 01:35:13,400 Dus de preprocessor doet gewoon echt eenvoudige tekst-gebaseerde bewerkingen. 1869 01:35:13,400 --> 01:35:15,870 Het doet niets slim. 1870 01:35:15,870 --> 01:35:18,920 Dus al het andere is ingewikkelder. 1871 01:35:18,920 --> 01:35:22,970 >> Dus nu dat preprocessor is gedaan, we eigenlijk samen te stellen. 1872 01:35:22,970 --> 01:35:24,320 Dus wat doet het compileren betekenen? 1873 01:35:24,320 --> 01:35:27,310 We gaan nu van C-code naar assembly code. 1874 01:35:27,310 --> 01:35:27,570 Yeah? 1875 01:35:27,570 --> 01:35:28,820 >> PUBLIEK: [onverstaanbaar]? 1876 01:35:28,820 --> 01:35:32,390 1877 01:35:32,390 --> 01:35:34,220 >> ROB: Ja, we gevangen dat. 1878 01:35:34,220 --> 01:35:36,880 1879 01:35:36,880 --> 01:35:38,660 Dus samenstellen. 1880 01:35:38,660 --> 01:35:40,310 We gaan van c naar assembly. 1881 01:35:40,310 --> 01:35:42,470 Dus dit is een taalverandering. 1882 01:35:42,470 --> 01:35:45,240 Zelf het samenstellen betekent gaande van een hogere taal 1883 01:35:45,240 --> 01:35:47,340 lager taal. 1884 01:35:47,340 --> 01:35:50,720 >> En c een hogere programmeertaal tegenover assembly. 1885 01:35:50,720 --> 01:35:52,320 Wat is de montage? 1886 01:35:52,320 --> 01:35:56,440 De instructies die zijn, vrij veel, gemaakt voor uw CPU. 1887 01:35:56,440 --> 01:35:59,130 Maar uw computer nog steeds doet niet begrijpen assemblage. 1888 01:35:59,130 --> 01:36:01,570 Hij begrijpt alleen enen en nullen. 1889 01:36:01,570 --> 01:36:06,160 Dus de volgende stap is het samenstellen van die brengt ons uit deze instructies dat 1890 01:36:06,160 --> 01:36:08,760 je CPU begrijpt en eigenlijk vertaalt deze naar 1891 01:36:08,760 --> 01:36:10,820 de enen en nullen. 1892 01:36:10,820 --> 01:36:13,570 >> Dus C tot assemblage naar binair. 1893 01:36:13,570 --> 01:36:15,870 Maar ik wil niet nog een uitvoerbaar zijn. 1894 01:36:15,870 --> 01:36:19,550 Dus denk aan de CS50 bibliotheek. 1895 01:36:19,550 --> 01:36:23,070 Wij hebben u een binaire voor deze CS50 bibliotheek, die GetString heeft 1896 01:36:23,070 --> 01:36:24,400 en getInt en zo. 1897 01:36:24,400 --> 01:36:25,700 >> Maar de CS50 library-- 1898 01:36:25,700 --> 01:36:27,650 in en van itself-- is niet uitvoerbaar. 1899 01:36:27,650 --> 01:36:29,570 Het hoeft niet een belangrijke functie. 1900 01:36:29,570 --> 01:36:32,230 Het is gewoon een stelletje binaire die u kunt gebruiken. 1901 01:36:32,230 --> 01:36:41,730 Dus linking is hoe brengen we samen alle Deze verschillende binaire bestanden 1902 01:36:41,730 --> 01:36:43,110 in een werkelijke uitvoerbaar. 1903 01:36:43,110 --> 01:36:45,900 Een die je kunt typen dot slash een punt uit. 1904 01:36:45,900 --> 01:36:51,660 >> Dus dit is als het bestand dat u schreef, - ongeacht uw programma is-- 1905 01:36:51,660 --> 01:36:53,620 Ceaser dot c. 1906 01:36:53,620 --> 01:36:55,100 Maar nu is het samengesteld omlaag naar binair. 1907 01:36:55,100 --> 01:36:56,480 Dus Ceaser dot o. 1908 01:36:56,480 --> 01:36:59,620 En dit is onze CS50 bibliotheken binaire. 1909 01:36:59,620 --> 01:37:02,284 En ze worden gecombineerd in een enkel uitvoerbaar. 1910 01:37:02,284 --> 01:37:02,758 Yeah? 1911 01:37:02,758 --> 01:37:04,008 >> PUBLIEK: [onverstaanbaar]? 1912 01:37:04,008 --> 01:37:08,800 1913 01:37:08,800 --> 01:37:12,710 >> ROB: Dus eerst opnemen, onthouden, de hash bevatten is eigenlijk een 1914 01:37:12,710 --> 01:37:13,810 pre-processor stap. 1915 01:37:13,810 --> 01:37:14,750 Maar dat is apart. 1916 01:37:14,750 --> 01:37:20,730 Als je geen enkele functie gebruiken die zijn buiten uw enkel bestand dan, 1917 01:37:20,730 --> 01:37:26,100 nee, je hoeft niet om iets te linken omdat je alles. 1918 01:37:26,100 --> 01:37:30,310 >> Dat gezegd hebbende, printf wordt gekoppeld. 1919 01:37:30,310 --> 01:37:32,820 Als je ooit gebruik printf, dat is iets dat moet worden gekoppeld 1920 01:37:32,820 --> 01:37:35,740 omdat je niet schrijven dat. 1921 01:37:35,740 --> 01:37:39,530 En in feite printf automatisch gekoppeld. 1922 01:37:39,530 --> 01:37:42,760 Je weet hoe op de opdrachtregel of wanneer u typt te maken, zie je het hebt 1923 01:37:42,760 --> 01:37:46,690 dash l CS50, dat verband heeft in de CS50 bibliotheek? 1924 01:37:46,690 --> 01:37:49,070 Printf, en dat soort dingen, gaat automatisch worden gekoppeld. 1925 01:37:49,070 --> 01:37:51,730 1926 01:37:51,730 --> 01:37:53,930 Andere vragen over iets? 1927 01:37:53,930 --> 01:37:56,280 >> PUBLIEK: [onverstaanbaar]? 1928 01:37:56,280 --> 01:37:58,300 >> ROB: Linking? 1929 01:37:58,300 --> 01:38:03,450 We hebben een hele hoop verschillende binaire bestanden. 1930 01:38:03,450 --> 01:38:06,410 Dit is de canonieke voorbeeld dat we gebruiken is CS50 bibliotheek. 1931 01:38:06,410 --> 01:38:09,960 We hebben samengesteld en aan u gegeven de binaire voor deze CS50 bibliotheek. 1932 01:38:09,960 --> 01:38:12,410 >> U wilt GetString gebruiken in uw programma. 1933 01:38:12,410 --> 01:38:14,750 Dus je gaat en gebruiken GetString. 1934 01:38:14,750 --> 01:38:19,700 Maar zonder mijn binaire code voor GetString, wanneer u uw code te compileren 1935 01:38:19,700 --> 01:38:23,140 naar beneden, kun je eigenlijk niet uitvoeren van uw programma, omdat GetString String is 1936 01:38:23,140 --> 01:38:25,080 nog niet volledig gedefinieerd. 1937 01:38:25,080 --> 01:38:29,220 >> Het is pas wanneer je een link in mijn binaire dat bevat GetString dat nu alle 1938 01:38:29,220 --> 01:38:31,130 recht, kan ik eigenlijk voeren GetString. 1939 01:38:31,130 --> 01:38:32,330 Mijn dossier volledig is. 1940 01:38:32,330 --> 01:38:34,208 En ik kan dit uit te voeren. 1941 01:38:34,208 --> 01:38:34,697 Yeah? 1942 01:38:34,697 --> 01:38:37,631 >> PUBLIEK: Is het linken omzetten de binaire naar uitvoerbaar? 1943 01:38:37,631 --> 01:38:42,032 Dus zelfs als je geen andere hebben bibliotheken, zou het nog steeds 1944 01:38:42,032 --> 01:38:44,477 moet vertalen de [onverstaanbaar]? 1945 01:38:44,477 --> 01:38:48,640 >> ROB: Dus een uitvoerbaar nog in binair. 1946 01:38:48,640 --> 01:38:51,750 Het is gewoon een combinatie van een hele stelletje binaries. 1947 01:38:51,750 --> 01:38:55,124 1948 01:38:55,124 --> 01:38:56,591 >> PUBLIEK: Dank je wel. 1949 01:38:56,591 --> 01:38:58,560 >> ROB: Geen probleem. 1950 01:38:58,560 --> 01:38:59,540 Een andere vragen? 1951 01:38:59,540 --> 01:39:02,001 Anders zijn we helemaal klaar. 1952 01:39:02,001 --> 01:39:02,690 Oke. 1953 01:39:02,690 --> 01:39:02,990 Bedankt. 1954 01:39:02,990 --> 01:39:03,590 >> [Applaus] 1955 01:39:03,590 --> 01:39:04,490 >> PUBLIEK: Dank je wel. 1956 01:39:04,490 --> 01:39:05,740 >> ROB: Ja. 1957 01:39:05,740 --> 01:39:06,582