1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [4. nädalal Jätkub] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Harvardi Ülikool] 3 00:00:04,240 --> 00:00:07,290 [See on CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> See on CS50, ja see on lõpuks 4. nädalal. 5 00:00:11,290 --> 00:00:14,030 Nii et häid uudiseid ja halbu uudiseid. 6 00:00:14,030 --> 00:00:26,240 Loengut pole vaja esmaspäeval, pole probleemi seadma järgmisel nädalal. [Õpilased cheering] 7 00:00:26,240 --> 00:00:28,680 Sa ei meeldi, kuhu see viib. 8 00:00:28,680 --> 00:00:31,590 Aga meil on selle asemel järgmisel kolmapäeval, 9 00:00:31,590 --> 00:00:37,740 ja seal on ka ühe ainekava 1 Reede loeng järgmisel reedel, et saaksime püsida graafikus. 10 00:00:37,740 --> 00:00:40,580 Aga kõik saab filmitud nagu tavaliselt, nii ei muretseks. 11 00:00:40,580 --> 00:00:44,100 >> Ja seoses viktoriin 0 Mida me teeme poole nädala lõpus 12 00:00:44,100 --> 00:00:47,140 on postitada käigus kodulehte cs50.net selgitus 13 00:00:47,140 --> 00:00:50,160 : millist ootused teil peaks olema, kui tegemist on esimese viktoriini. 14 00:00:50,160 --> 00:00:55,100 Üldiselt on see valikvastustega, õige-vale, Lühike vastus, lühike kodeerimine probleeme. 15 00:00:55,100 --> 00:00:57,360 Sa ei kavatse oodata, et rakendada võrdväärne 16 00:00:57,360 --> 00:01:00,030 probleem, et sa näeksid pset, mille jaoks teil on arvuti 17 00:01:00,030 --> 00:01:03,240 ja siluri jms, kuid on olemas ka väike kodeerimine probleeme. 18 00:01:03,240 --> 00:01:06,900 >> Ja tõepoolest, parim teejuht saada tunnet, mida CS50 viktoriinid on nagu 19 00:01:06,900 --> 00:01:09,180 on minna cs50.net, minge Viktoriinid link, 20 00:01:09,180 --> 00:01:11,920 ja te näete möödunud mitu aastat väärt viktoriine. 21 00:01:11,920 --> 00:01:16,600 Lihtsalt aru, et õppekava ei ole alati olnud sama aja jooksul. 22 00:01:16,600 --> 00:01:18,510 Mõnikord lisame, mõnikord lahutada, 23 00:01:18,510 --> 00:01:20,670 nii et kui te näete mõningaid teema üks neist vana viktoriinid 24 00:01:20,670 --> 00:01:25,380 et sul pole aimugi, mida ta räägib, on see kas, et me ei katke 25 00:01:25,380 --> 00:01:27,210 või et me ei kata seda. 26 00:01:27,210 --> 00:01:31,110 Aga kujul ülevaateid, see pühapäev, esmaspäev ja teisipäev 27 00:01:31,110 --> 00:01:34,770 samuti muidugi hõlmavast istungil pühapäeva õhtul - 28 00:01:34,770 --> 00:01:37,500 aeg ja koht tehakse teatavaks käigus koduleht - 29 00:01:37,500 --> 00:01:40,120 teil kõigil on võimalus vaadata koos muidugi õpetuse stipendiaatide 30 00:01:40,120 --> 00:01:44,830 materjali käesoleval aastal nii lõik ja kui täis klass, 31 00:01:44,830 --> 00:01:48,400 ja need on filmitud nagu tavaliselt samuti. 32 00:01:48,400 --> 00:01:53,380 >> Hea küll. Niisiis ilma pikema jututa, ühe märkuse läbimise / mitteläbimise ja lisada / tilk. 33 00:01:53,380 --> 00:01:57,980 Võib-olla olete näinud mu märgib eile õhtul, ja see on tõesti vaid mõned täiendavat kindlustunnet 34 00:01:57,980 --> 00:02:01,250 et kui te olete nende hulgas eriti vähem mugav või kusagil vahepeal 35 00:02:01,250 --> 00:02:04,870 ja te ei tunne natuke rohkem oma peaga, 36 00:02:04,870 --> 00:02:08,430 aru, et on tõesti täiesti normaalne, ja seal on rohkelt tugistruktuur paigas, 37 00:02:08,430 --> 00:02:13,530 millest üks tööaega olid kavatsuste kohta parandada veelgi ühe minu e-posti eile õhtul, 38 00:02:13,530 --> 00:02:16,520 ja aru ka, et valik nagu läbimise / mitteläbimise klassi niimoodi 39 00:02:16,520 --> 00:02:21,540 tegelikult on mõeldud mehhanismi nüristama on muidugi niimoodi, 40 00:02:21,540 --> 00:02:24,200 nii et jälle, kui sa veedad need 10, 15, 20 tundi 41 00:02:24,200 --> 00:02:28,160 lihtsalt üritavad mõned pset tööle ja sa tead, et sa oled 90-95% teed seal 42 00:02:28,160 --> 00:02:32,100 kuid sa ei leia mõned kuradi bug, mis läbimise / mitteläbimise mudel, mis on omamoodi korras. 43 00:02:32,100 --> 00:02:36,230 >> Idee on selles, et see mehhanism saab siis minna keskenduda oma teistele psets 44 00:02:36,230 --> 00:02:39,530 või magada või mis iganes see on, et te soovite keskenduda. 45 00:02:39,530 --> 00:02:43,390 Nii mõistame, et teil on kuni tuleval teisipäev - tehniliselt 5. esmaspäev, 46 00:02:43,390 --> 00:02:50,840 aga see on puhkus, nii tuleval teisipäev - minna läbimise / mitteläbimise et sorteeritud või vastupidi. 47 00:02:50,840 --> 00:02:54,450 Ja kui sa oled tõesti järsak ja mõtled kukutades kokku, 48 00:02:54,450 --> 00:02:56,440 palun mind kätte pärast loengu või tilk mulle märkuse. 49 00:02:56,440 --> 00:02:59,990 Meile meeldiks vähemalt jututuba enne kui pakkumise Adieu. 50 00:02:59,990 --> 00:03:03,470 Hea küll. Nii et me hakkasid abirattad ära viimast korda. 51 00:03:03,470 --> 00:03:06,030 Eelkõige oleme keskendunud string. 52 00:03:06,030 --> 00:03:09,740 String on midagi, mis on välja kuulutatud CS50 raamatukogu, 53 00:03:09,740 --> 00:03:14,340 konkreetselt, et fail nimega cs50.h mis me hakkame vaatama käesoleval ja järgmisel nädalal. 54 00:03:14,340 --> 00:03:17,250 Aga string on tõesti ainult lihtsustamine midagi 55 00:03:17,250 --> 00:03:20,980 mis on veidi rohkem arcanely kirjeldatud kui char *. 56 00:03:20,980 --> 00:03:24,090 Char me oleme tuttavad. See on lihtsalt üks sümbol. 57 00:03:24,090 --> 00:03:28,010 Aga * alates esmaspäevast tähistatakse mida? >> [Üliõpilane] pointer. 58 00:03:28,010 --> 00:03:31,290 Pointer. Ja mis pointer? >> [Üliõpilane] aadress. 59 00:03:31,290 --> 00:03:33,420 >> See on nagu aadress, asukohta mälus. 60 00:03:33,420 --> 00:03:35,910 Mis aadress või asukoht või mälu? 61 00:03:35,910 --> 00:03:40,290 Jällegi, kõik meist on sülearvutid kaarik või 2 GB muutmälu tõenäoliselt nendel päevadel, 62 00:03:40,290 --> 00:03:44,160 ja mis tähendab, et olete miljardit eurot ehk 2 miljardit baiti väärt mälu. 63 00:03:44,160 --> 00:03:46,240 Ja see ei ole tegelikult oluline, mida ta füüsiliselt välja näeb, 64 00:03:46,240 --> 00:03:51,220 aga võtta usus, et saate arv Kõik üksikute baitide et oma sülearvuti on - 65 00:03:51,220 --> 00:03:54,580 see on bait 0, see on bait 1, see on bait 2 miljardit - 66 00:03:54,580 --> 00:03:56,100 ja see on täpselt see, mida arvuti teeb. 67 00:03:56,100 --> 00:04:00,030 Kui eraldada ruumi ühe märgi, näiteks 68 00:04:00,030 --> 00:04:02,480 see on ilmselt elada kuskil arvuti mälu, 69 00:04:02,480 --> 00:04:05,860 ja võibolla see on bait number 12345, 70 00:04:05,860 --> 00:04:08,470 ja see on kusagil siin arvuti mälu. 71 00:04:08,470 --> 00:04:12,630 Ja aadress seejärel, et märk on 12345. 72 00:04:12,630 --> 00:04:16,140 >> Nüüd, nädal 0 kuni nüüd siiani ei ole me tõesti hoolib 73 00:04:16,140 --> 00:04:19,170 Kui mälu asju hoitakse, sest me tavaliselt kasutada sümboleid, 74 00:04:19,170 --> 00:04:22,540 muutujad ja massiivid tegelikult saada meie andmed. 75 00:04:22,540 --> 00:04:24,950 Aga kui esmaspäeval ja seda enam täna, sa oled nüüd seisab ees 76 00:04:24,950 --> 00:04:27,710 kõik rohkem väljendusrikas võimekuse kirjalikult programmid 77 00:04:27,710 --> 00:04:31,330 tõesti manipuleerida arvuti mälu aga näed, 78 00:04:31,330 --> 00:04:33,720 nii hea eesmärgil ja halb, 79 00:04:33,720 --> 00:04:39,620 vead on väga levinud tulemus siinkohal õppimist see kraam. 80 00:04:39,620 --> 00:04:42,460 Aga mida see tegelikult tähendab, et char *? 81 00:04:42,460 --> 00:04:46,140 Lähme edasi tagasi - ja me tuleme tagasi Binky nagu lubati täna. 82 00:04:46,140 --> 00:04:48,670 Lähme lihtsa näite siit. 83 00:04:48,670 --> 00:04:53,060 Las ma salvestada see fail compare.c, ja las ma saaksin malli koodi siin 84 00:04:53,060 --> 00:05:00,490 seega sisaldavad stdio.h, lubage mul anda ka ise hulka cs50.h. Ma suumida seal üleval. 85 00:05:00,490 --> 00:05:05,850 Lubage mul alustada kirjalikult peamised int, main (void), ja nüüd ma tahan teha midagi sellist: 86 00:05:05,850 --> 00:05:13,520 printf ("Anna mulle stringi:") ja siis ma kasutan string s saab getString 87 00:05:13,520 --> 00:05:16,750 saada stringi kasutaja, siis ma lähen küsida kasutajalt teisele. 88 00:05:16,750 --> 00:05:21,870 ("Anna mulle veel stringi:") ja ma lähen paluda neil kaudu getString saada, et. 89 00:05:21,870 --> 00:05:27,020 Ma nimetan seda t sest t tuleb pärast s ja s on kena nimi stringi, kui see on päris üldine. 90 00:05:27,020 --> 00:05:30,030 Nii getString, ja nüüd ma lihtsalt tahan teha terve mõistuse kontrolli ja ma ütlen 91 00:05:30,030 --> 00:05:39,770 if (s == t) siis ma lihtsalt ütlen kasutaja printf ("Sa kirjutasid sama asja! \ n"); 92 00:05:39,770 --> 00:05:45,520 muidu ma lähen välja printida midagi ("tipitud midagi! \ n") 93 00:05:45,520 --> 00:05:48,460 või mis iganes lause on. Nii et midagi sellist. 94 00:05:48,460 --> 00:05:52,200 Siis nagu tavaliselt, ma naasen 0, mis lihtsalt tähendas, et midagi halba ei juhtunud, 95 00:05:52,200 --> 00:05:54,400 ja ma lähen edasi minna ja kompileerida ja käivitada see programm. 96 00:05:54,400 --> 00:05:56,540 >> Aga esmaspäeval me jooksime selle programmi, 97 00:05:56,540 --> 00:06:00,420 ja tegelikult öeldi, et TERE ei ole tere ja nägemist ei ole hüvasti. 98 00:06:00,420 --> 00:06:03,140 Käitumist nägime oli natuke rohkem niimoodi. 99 00:06:03,140 --> 00:06:11,450 Lubage mul minna minu allikas kataloog, suurendada siin ja teeme teeb võrrelda. 100 00:06:11,450 --> 00:06:14,570 Koostanud okei. Ma jooksen võrrelda. Anna mulle string: Tere. 101 00:06:14,570 --> 00:06:16,300 Anna mulle veel string: Tere. 102 00:06:16,300 --> 00:06:18,000 Sa kirjutasid midagi! 103 00:06:18,000 --> 00:06:22,650 Noh, las ma proovin midagi lihtsamat nagu 50, 50. Sa kirjutasid midagi! 104 00:06:22,650 --> 00:06:25,740 tere, tere. Nii selgelt, midagi siin toimub. 105 00:06:25,740 --> 00:06:28,440 Aga mis oli selgituseks, miks? 106 00:06:28,440 --> 00:06:33,850 Ilmselt rida 12 on täiesti düsfunktsionaalne. 107 00:06:34,300 --> 00:06:39,430 Mis on põhiline probleem siin? Jah. >> [Üliõpilane] See võrdleb aadresse. 108 00:06:39,430 --> 00:06:41,850 Jah, täpselt. See on tegelikult võrrelda aadressid 109 00:06:41,850 --> 00:06:44,580 kus tere ja HELLO hoitakse. 110 00:06:44,580 --> 00:06:48,290 See ei ole võrreldes tähed Tere jälle ja jälle, 111 00:06:48,290 --> 00:06:52,370 sest, mis tegelikult juhtus, kõik see aeg oleme kasutanud getString - 112 00:06:52,370 --> 00:06:56,130 See tahvel on jälle meie arvuti mälu, 113 00:06:56,130 --> 00:07:00,100 ja ütleme, et ma kutsun getString pärast kuulutatakse muutuja s. 114 00:07:00,100 --> 00:07:01,930 Mis minu mälu välja näeb? 115 00:07:01,930 --> 00:07:07,070 Olgem omavoliliselt öelda, et s näeb välja selline. See on ruut. 116 00:07:07,070 --> 00:07:09,040 Ja päris palju tahes ajal olen tõmmatud tükk mälu ekraanil 117 00:07:09,040 --> 00:07:12,860 kas see on 32 bitti olen joonistus väljakud niimoodi, sest tõepoolest aparaat, 118 00:07:12,860 --> 00:07:17,380 pointer, aadress, on 32 bitti. See on sama nagu int. 119 00:07:17,380 --> 00:07:19,420 See võib erineda, sõltuvalt arvutisüsteemi. 120 00:07:19,420 --> 00:07:24,630 Neile, kes on ähmaselt tuttav asjaolu, et Mac või PC on 64 bitti, 121 00:07:24,630 --> 00:07:28,120 et tegelikult tähendab, et arvuti kasutab 64-bitist suunanäitajaks, 122 00:07:28,120 --> 00:07:33,730 64-bit aadressid, ja nende hulgast plussid, mis on oma arvutid 123 00:07:33,730 --> 00:07:35,560 võib olla palju rohkem RAM kui Läinud. 124 00:07:35,560 --> 00:07:39,240 Pikk lugu lühike, tagasi samal päeval, kui arvuteid kasutatakse ainult 32 bitti 125 00:07:39,240 --> 00:07:42,740 esindada aadressid, suurim arv baite võid esindama 126 00:07:42,740 --> 00:07:46,280 sel juhul oli mis siis, kui sul on 32 bitti? 127 00:07:46,280 --> 00:07:49,590 Nii et 4 miljardit õigus, sest 2 32 on 4 miljardit eurot. 128 00:07:49,590 --> 00:07:51,370 See number on korduvate käigus. 129 00:07:51,370 --> 00:07:55,240 >> Nii et kui sul on ainult 32 bitti, kõige rohkem võite loota, et on umbes 4 miljardit eurot. 130 00:07:55,240 --> 00:07:58,750 Aga see oli põhimõtteline piiramine arvutid kuni paar aastat tagasi 131 00:07:58,750 --> 00:08:01,180 sest kui saad ainult loota koguni 4 miljardit 132 00:08:01,180 --> 00:08:05,270 see ei ole oluline, kui teil osta 8 GB RAM või isegi 5 GB RAM; 133 00:08:05,270 --> 00:08:07,780 sa ei saa loota, et kõrge, nii et see oli kasutu. 134 00:08:07,780 --> 00:08:11,430 Sa võid siseneda ainult esimese 3 või 4 GB arvuti mälu. 135 00:08:11,430 --> 00:08:14,410 See on vähem küsimus nüüd, ja saab osta MacBook Plussid ja Dells 136 00:08:14,410 --> 00:08:17,680 8 GB RAM või isegi enam nendel päevadel. 137 00:08:17,680 --> 00:08:24,100 Aga kui ma eraldama lihtsalt selles programmis pointer, pointer nimetatakse s, 138 00:08:24,100 --> 00:08:28,370 See võib tunduda see ekraanile sest tõepoolest peame koor tagasi see kiht. 139 00:08:28,370 --> 00:08:33,520 Hoian öeldes string, kuid alates esmaspäevast, string on tõesti char *, 140 00:08:33,520 --> 00:08:35,590 aadress mõned iseloomu. 141 00:08:35,590 --> 00:08:39,280 Võtame et koolitus ratta maha, kuigi me jätkuvalt kasutada getString nüüd. 142 00:08:39,280 --> 00:08:42,600 Nii et ma olen deklareeritud s, ja see on patakas mälu, 32 bitti. 143 00:08:42,600 --> 00:08:47,370 Mis siin mälu vaikimisi? >> [Kuuldamatu õpilase vastus] 144 00:08:47,370 --> 00:08:50,040 Mis see on? >> [Üliõpilane] prügi. >> Prügi. Täpselt. 145 00:08:50,040 --> 00:08:54,610 Kui te programmeerija ei pane väärtus muutuja, kes teab, mis see on? 146 00:08:54,610 --> 00:08:57,990 Mõnikord sa õnnelik ja see on 0, mis on selline ilus, puhas vaikeväärtus, 147 00:08:57,990 --> 00:09:00,310 kuid nagu me nägime esmaspäeval, mõnikord on see täiesti mõttetu, 148 00:09:00,310 --> 00:09:04,130 mõned tõesti suur positiivne või negatiivne arv, mis tuli kuhu? 149 00:09:05,350 --> 00:09:07,010 Jah. >> [Üliõpilane] funktsiooni enne. >> Jah. 150 00:09:07,010 --> 00:09:10,170 >> Sageli funktsioon, mis sai kutsutakse enne sest mäletan, 151 00:09:10,170 --> 00:09:13,920 kui helistate funktsiooni mälu, nad võtavad rohkem ja rohkem ruumi alt üles, 152 00:09:13,920 --> 00:09:17,040 ja niipea kui tagastab funktsioon, et mälu saab taaskasutada 153 00:09:17,040 --> 00:09:20,890 poolt järgmine mees, et saab nimetada, kes kasutab oma sama tükk mälu. 154 00:09:20,890 --> 00:09:23,450 Ja kui olete lahkunud prügi seal, eelmised väärtused, 155 00:09:23,450 --> 00:09:28,190 me võib ekslikult s, millel mingi väärtus, kui tegelikult me ​​ei ole panna midagi seal. 156 00:09:28,190 --> 00:09:30,960 Nii et meie mälu sel hetkel näeb välja selline. 157 00:09:30,960 --> 00:09:36,030 Nüüd paremas servas rida 7 me nõuame getString, 158 00:09:36,030 --> 00:09:40,150 mis me oleme teinud nüüd nädalaid, kuid mida on getString tegelikult teeme? 159 00:09:40,150 --> 00:09:43,350 GetString kirjutada CS50 töötajad on vähe intelligentne 160 00:09:43,350 --> 00:09:46,500 aastal, et niipea, kui kasutaja hakkab tippimisklahvid ja vaatamiste Sisesta, 161 00:09:46,500 --> 00:09:50,010 GetString arvud, kui palju klahvivajutusi tegin kasutaja hitt, 162 00:09:50,010 --> 00:09:53,360 kui palju märke on mul vaja eraldada RAM. 163 00:09:53,360 --> 00:09:55,660 Ja kui see RAM on pärit, kes teab? 164 00:09:55,660 --> 00:09:58,930 See on kusagil arvuti 2 gigabaiti või tühi-tähi mälu. 165 00:09:58,930 --> 00:10:05,200 Aga oletame, et arvuti leida ruumi sõna HELLO siin. 166 00:10:05,200 --> 00:10:08,710 Sõna Ma sisestasin oli H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 Ja kui me tõmbame seda märgijada, me võiksime teha seda niimoodi. 168 00:10:13,510 --> 00:10:17,860 Aga mul on vaja teha 1 pildi asi. Mis kuulub lõpus igal stringi C? 169 00:10:17,860 --> 00:10:20,710 Null iseloomu, mis me kirjutame kui \ 0. 170 00:10:20,710 --> 00:10:23,980 See on tehniliselt number 0, kuid längkriips teeb kõik selgemaks 171 00:10:23,980 --> 00:10:28,150 et see on sõna otseses mõttes number 0, täisarv 0; 172 00:10:28,150 --> 00:10:32,440 see ei ole, näiteks quote-Tsitaat lõppeb 0 et võite tippida klaviatuuri. 173 00:10:32,440 --> 00:10:33,940 Nii et see on tere. 174 00:10:33,940 --> 00:10:36,350 >> Ja mida me ütleme esmaspäeval, et funktsioon nagu getString 175 00:10:36,350 --> 00:10:39,580 tegelikult tagasi kõik need nädalat? 176 00:10:39,580 --> 00:10:43,960 See ei tule string iseenesest, sest see ei ole tegelikult on tähendus 177 00:10:43,960 --> 00:10:47,710 kuna stringid ei ole. Nad on omamoodi väljamõeldis sisse CS50 raamatukogu. 178 00:10:47,710 --> 00:10:51,300 Mis on tõesti string, tehniliselt rohkem? >> [Üliõpilane] See on esimene märk. 179 00:10:51,300 --> 00:10:55,950 Täpselt. See on lihtsalt aadressi esimene märk, et kasutaja sisestatud sisse 180 00:10:55,950 --> 00:11:02,810 Nii et kui minu sõna HELLO lõpeb see üles baidi number 123 ja seejärel baidi number 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, ja nii edasi, kui ma lihtsalt number minu baiti 0 püsti, 182 00:11:08,320 --> 00:11:12,650 mis tegelikult getString on tagasi on sõna otseses number 123. 183 00:11:12,650 --> 00:11:19,270 Mis siis saab panna s on number 123, mitte täht H, ei sõna HELLO, 184 00:11:19,270 --> 00:11:23,130 lihtsalt aadress, kust ma leiaks esimene täht tere. 185 00:11:23,130 --> 00:11:26,500 Aga see ei tundu piisavalt. Küsisin teilt string, mitte iseloomu. 186 00:11:26,500 --> 00:11:32,970 Niisiis, kuidas me või arvuti tean, et ELLO tüüpi tulevad koos H? 187 00:11:35,760 --> 00:11:37,460 Mis on omamoodi leping meil? Jah. 188 00:11:37,460 --> 00:11:40,100 [Üliõpilane] See hoiab ütleb ise, et leida mõned rohkem märke. >> Täpselt. 189 00:11:40,100 --> 00:11:44,570 >> Seal on see inimese-arvuti kokkuleppega, mille kohaselt juhul, kui teil on tegemist stringid, 190 00:11:44,570 --> 00:11:49,410 muidu tuntud nüüd char tähed, sa lihtsalt pead välja mõtlema 191 00:11:49,410 --> 00:11:54,350 kus lõpuks iga stringi elu on teel tõesti ainult itereerimise üle selle jaoks silmus, 192 00:11:54,350 --> 00:11:57,820 samas silmus, mis iganes, nii et kui leiad stringi lõpuni 193 00:11:57,820 --> 00:12:02,160 nüüd saab järeldada, et, oh, terve sõna oli tere. 194 00:12:02,160 --> 00:12:04,820 Neile, kellel eelnev programmeerimise kogemus tunneksid Java 195 00:12:04,820 --> 00:12:09,880 võid lihtsalt helistada. pikkus ja teistes keeltes võite helistada pikkus vms. 196 00:12:09,880 --> 00:12:14,060 Ongi, sest on palju keeli, eriti asju nimetatakse objektorienteeritud keeltest, 197 00:12:14,060 --> 00:12:18,580 pikkus on midagi sellist kapseldatud sees tükk andmed ise, 198 00:12:18,580 --> 00:12:24,000 meelega me kapseldatud sümbolid ja nimed ja maja sees õpilane esmaspäeval. 199 00:12:24,000 --> 00:12:28,700 Aga C on palju madalam. Puuduvad objektide või klassid, kui olete kuulnud neid tingimusi enne. 200 00:12:28,700 --> 00:12:31,490 Kõik, mida tõesti on mälu aadresse. 201 00:12:31,490 --> 00:12:35,540 Nii et see on omamoodi vanamoodne viis esindavad huvitav andmestruktuurid. 202 00:12:35,540 --> 00:12:38,760 Sul on algusväärtus nagu aadress esimene märk 203 00:12:38,760 --> 00:12:42,340 ja siis lihtsalt suvalise konventsiooni, et kõik on nõus järgima. 204 00:12:42,340 --> 00:12:46,420 Niisiis, kuidas on stringi pikkus rakendatud, tegime ettepaneku? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, mis mõned teist on nüüd kasutatud paar korda. See on päris lihtne, eks? 206 00:12:51,360 --> 00:12:53,060 See on nagu 2 rida koodi. 207 00:12:53,060 --> 00:12:56,140 See on päris palju loop mingisugune, äkki täiendava kohaliku muutuja. 208 00:12:56,140 --> 00:13:00,540 Aga strlen lihtsalt peab võtma kursor ja seejärel hakata otsima \ 0. 209 00:13:00,540 --> 00:13:05,190 >> Ja niipea, kui ta leiab, saab naasta koguarv samme, et see on tehtud, et string. 210 00:13:05,190 --> 00:13:07,150 Nii saame sellest järeldada, mis juhtub järgmisena. 211 00:13:07,150 --> 00:13:11,850 Oletame siis Kinnitan t nagu ma olen seda teinud rea 10. 212 00:13:11,850 --> 00:13:14,280 See on mingi prügi väärtus. Kes teab esialgu? 213 00:13:14,280 --> 00:13:18,490 Aga paremal servas line 10 Ma helistan getString uuesti. 214 00:13:18,490 --> 00:13:20,050 Kes teab, kus see jõuab? 215 00:13:20,050 --> 00:13:23,830 Olgem omavoliliselt öelda, et operatsioonisüsteem leitud ruumi ta viis siin. 216 00:13:23,830 --> 00:13:28,610 Satun juhuslikult Tüüp H-E-L-L-O uuesti, 217 00:13:28,610 --> 00:13:31,260 ja nii saame teha samasugune pilt. 218 00:13:31,260 --> 00:13:34,290 Kuid tõsiasi, et ma olen joonistatakse see pilt on tahtliku 219 00:13:34,290 --> 00:13:37,720 sest see on erinev HELLO kui see üks. 220 00:13:37,720 --> 00:13:43,920 Nii et siin võib see olla kohas 456, see on 457, ja nii edasi. 221 00:13:43,920 --> 00:13:47,170 Mis siis saab panna kus küsimärk kord oli? 222 00:13:47,170 --> 00:13:50,190 Sellisel juhul 456. 223 00:13:50,190 --> 00:13:53,540 Me picking neid numbreid suvaliselt, sest tegelikult pärast tänast 224 00:13:53,540 --> 00:13:57,110 me ju ei hooli nii palju, mida aadressi midagi on. 225 00:13:57,110 --> 00:14:02,690 Kõik me hoolime on, et me ei suuda välja selgitada aadress mõned tükk andmed nagu tere. 226 00:14:02,690 --> 00:14:07,100 >> Nii et tõesti, mida enamik inimesi ei infotehnoloogia rääkides mälu aadressid 227 00:14:07,100 --> 00:14:10,210 ja räägime viiteid täpsemalt 228 00:14:10,210 --> 00:14:14,220 mitte vaeva figuring 123 - who cares kus see värk tegelikult on, 229 00:14:14,220 --> 00:14:17,440 me lihtsalt tean, et see on mingil numbriline aadress - 230 00:14:17,440 --> 00:14:22,180 me lihtsustada maailma ja lihtsalt öelda, et s on suunatud sellele iseloomu 231 00:14:22,180 --> 00:14:25,080 ja t on suunatud sellele iseloomu. 232 00:14:25,080 --> 00:14:27,430 Ja asjaolu, et see on nool on üsna tahtlik 233 00:14:27,430 --> 00:14:31,610 sest sõna otseses mõttes nüüd s on osutavad H ja t on osutavad teistele H 234 00:14:31,610 --> 00:14:34,720 sest lõpus päeval, see ei ole oluline milliseid aadress on 235 00:14:34,720 --> 00:14:40,240 kuid see asi, et meil on võime väljendada sellele aadressile mõned tükk kood. 236 00:14:40,240 --> 00:14:42,730 Me ei ole tõesti manipuleerida need aadressid lihtsalt veel 237 00:14:42,730 --> 00:14:47,770 nii et me näeme, kus me saame hüüda, ja omamoodi asju teha suunanäitajaks, 238 00:14:47,770 --> 00:14:52,030 kuid nüüd rida 12 sõna otseses mõttes Milliseid väärtusi me võrrelda 239 00:14:52,030 --> 00:14:55,500 vastavalt sellele uudisele vastavalt 12? 240 00:14:56,570 --> 00:15:01,290 Me ütleme on 123 võrdne võrdne 456? Ja see on kindlasti nii ei ole. 241 00:15:01,290 --> 00:15:05,320 Ja ka kontseptuaalselt, see pointer ei ole kindlasti sama, see 242 00:15:05,320 --> 00:15:09,500 sest sa helistasid getString kaks korda, ja getString ei püüa olla super tark, 243 00:15:09,500 --> 00:15:12,470 ta ei püüa mõista, oh, sa kirjutasid HELLO 5 minutit tagasi; 244 00:15:12,470 --> 00:15:15,090 lubage mul anda teile sama pointer kui ma andsin sulle enne, 245 00:15:15,090 --> 00:15:18,450 see lihtsalt eraldab uus patakas mälu iga kord, kui seda nimetada. 246 00:15:18,450 --> 00:15:20,350 >> Niisiis, kuidas me probleemi lahendada? 247 00:15:20,350 --> 00:15:24,270 Kui kõrgemat Ma tahan võrrelda stringe Tere ja Tere - 248 00:15:24,270 --> 00:15:28,680 Ma ei hooli vihjeid - kuidas ma saan minna vastates küsimusele, 249 00:15:28,680 --> 00:15:31,980 ei tarbijagrupp sama asi? Mis on vajalik siin? Jah. 250 00:15:31,980 --> 00:15:35,200 [Üliõpilane] Kasutage funktsiooni. >> Saan kasutada funktsiooni karbist. 251 00:15:35,200 --> 00:15:38,170 Oskan kasutada funktsiooni nimetatakse strcmp, s-t-r-c-m-P, 252 00:15:38,170 --> 00:15:41,190 lihtsalt lühendatud versiooni öeldes string võrrelda. 253 00:15:41,190 --> 00:15:45,070 Ja kui me läheme sinna, näiteks võrrelda 2, mis on üks tänapäeva jaotusmaterjale, 254 00:15:45,070 --> 00:15:46,690 Ma täpselt seda. 255 00:15:46,690 --> 00:15:51,750 Hoidsin kõik muu samaks rida 1 kuni 26 või nii, 256 00:15:51,750 --> 00:15:54,360 ja nüüd märgata selles osas on muutunud natuke. 257 00:15:54,360 --> 00:15:57,690 Olgem ignoreerida rida 28 hetkel ja keskenduda ainult see üks. 258 00:15:57,690 --> 00:16:00,410 Mida me ütleme esmaspäeval, et str Võrdle ei? 259 00:16:00,410 --> 00:16:05,200 Ta tegeleb protsessi võttes 2 suunanäitajaks, s ja t sel juhul, 260 00:16:05,200 --> 00:16:08,480 omamoodi praktiliselt pannes oma sõrme need 2 tähte, 261 00:16:08,480 --> 00:16:11,530 ja mida ta peab tegema, on midagi samas loop või jaoks silmus, 262 00:16:11,530 --> 00:16:16,050 ja ta ütleb on need samad? Kui nii, siis liigutab sõrmi või viiteid edasi. 263 00:16:16,050 --> 00:16:17,970 Kas need samad, need samad, need samad, 264 00:16:17,970 --> 00:16:22,710 need samad, need samad? Ja ooh, ma olen lõpus stringi nii s ja t. 265 00:16:22,710 --> 00:16:26,780 Ma ei ole leidnud vastuolusid. Jah, need stringid on ühesugused. 266 00:16:26,780 --> 00:16:31,940 Ja mida see str võrrelda tulu kui 2 stringid on sama, ilmselt? Null. 267 00:16:31,940 --> 00:16:35,900 Nii et 0 on hea sel juhul, sest kui ta tagastab -1 või +1, 268 00:16:35,900 --> 00:16:40,560 see tähendab, et te lihtsalt juhtub tulema enne t tähestikuliselt või pärast t. 269 00:16:40,560 --> 00:16:43,760 Ja miks see oleks kasulik omada funktsioon, mis ütleb teile, mida string tuleb enne 270 00:16:43,760 --> 00:16:46,720 või pärast esitamine sõnaraamatus? 271 00:16:46,720 --> 00:16:48,740 [Üliõpilane] Otsimine. >> Otsimine ja sorteerimine. 272 00:16:48,740 --> 00:16:51,730 >> Nii saab teha asju nagu binaarne otsing või mull sorteerida või ühendada sorteeri 273 00:16:51,730 --> 00:16:53,230 kus pead võrrelda asju. 274 00:16:53,230 --> 00:16:56,420 Siiani oleme omamoodi lõigata mõned nurgad ja ainult rääkisime sorteerimine 275 00:16:56,420 --> 00:16:59,430 kontekstis numbreid, sest see on tore ja lihtne rääkida, 276 00:16:59,430 --> 00:17:02,430 kuid võite kindlasti võrrelda stringe, õun ja banaan, 277 00:17:02,430 --> 00:17:05,349 sest kui õun on teada, et tulevad enne banaan samamoodi 278 00:17:05,349 --> 00:17:09,319 saate liikuda stringid ringi mälu nagu Rob tegi ühendamise sorteerida video 279 00:17:09,319 --> 00:17:15,880 ja me tegime siin laval valik omamoodi, sisestamise järgi, ja mull sorteerida. 280 00:17:15,880 --> 00:17:18,710 Nii et kui me saame seda? Proovime seda. 281 00:17:18,710 --> 00:17:23,980 Olgem omamoodi unustage, et õppetund hetk ja proovige nüüd ja kopeerida 1.c teha järgmist. 282 00:17:23,980 --> 00:17:26,800 Kooskõlas 21 Ma räägin prindi midagi, 283 00:17:26,800 --> 00:17:28,520 siis ma saan stringi kasutaja, 284 00:17:28,520 --> 00:17:30,690 siis Ma kontrollin seda. 285 00:17:30,690 --> 00:17:33,620 Me pole tõesti läinud see harjumus veel, kuid olgem nüüd seda teha. 286 00:17:33,620 --> 00:17:40,990 Olgem tegelikult koor tagasi see kiht. See on tõesti char *. See mees on tõesti char *. 287 00:17:40,990 --> 00:17:45,690 Nii et mida see tähendab, et tuleb kontrollida, kas s == NULL? 288 00:17:45,690 --> 00:17:48,380 Selgub, et kui te helistate funktsiooni nagu getString 289 00:17:48,380 --> 00:17:51,540 või üldisemalt küsige arvuti teile mõned mälu, 290 00:17:51,540 --> 00:17:53,030 midagi võiks valesti minna. 291 00:17:53,030 --> 00:17:56,630 Sa võiksid olla hull ja küsi arvuti teratavu mälu 292 00:17:56,630 --> 00:18:01,780 küsides triljoneid baiti mälu, et lihtsalt ei eksisteeri arvuti, 293 00:18:01,780 --> 00:18:05,130 kuid getString ja muid funktsioone vaja mingi võimalus karjuma sa 294 00:18:05,130 --> 00:18:06,820 kui olete küsinud liiga palju. 295 00:18:06,820 --> 00:18:10,450 Ja kuidas getString see on, kui te olete palunud rohkem mälu 296 00:18:10,450 --> 00:18:14,250 kui on olemas arvuti, isegi kui see on super, super väikese tõenäosusega 297 00:18:14,250 --> 00:18:17,730 sest keegi meist ei kavatse kirjutada triljonit tähemärki ja vajuta Enter, 298 00:18:17,730 --> 00:18:21,980 kuid väikese tõenäosusega kuigi see võib olla, ma tahan veel näha seda igaks juhuks, 299 00:18:21,980 --> 00:18:26,120 ja eriline väärtus, et getString, vastus, ja muid funktsioone tulu 300 00:18:26,120 --> 00:18:30,630 kui midagi on valesti läinud on NULL kõik mütsid. 301 00:18:30,630 --> 00:18:36,520 >> Ja mis on NULL? NULL just nii juhtub esindama pointer. See on mälu aadress 0. 302 00:18:36,520 --> 00:18:40,800 Maailm otsustas, et omavoliliselt, kui see on minu arvuti mälu - sa tead, mida? - 303 00:18:40,800 --> 00:18:46,260 me ei kavatse varastada vaid 1 bait iga arvuti mällu ja see on asukoha 0. 304 00:18:46,260 --> 00:18:49,560 Me anname ta hüüdnime NULL, ja me ei kavatse lubada 305 00:18:49,560 --> 00:18:52,660 et me tegelikult ei pane tegelikke andmeid seal 306 00:18:52,660 --> 00:18:56,770 sest me lihtsalt suvaliselt vaja erilist väärtust, 0, teise nimega NULL, 307 00:18:56,770 --> 00:19:00,230 et saaksime kisa kasutajate kui midagi läheb valesti. 308 00:19:00,230 --> 00:19:03,590 Muidu sa ei pruugi teada ei 0 tähendab panna midagi siin 309 00:19:03,590 --> 00:19:05,490 või see tähendab midagi läks valesti? 310 00:19:05,490 --> 00:19:09,190 Me peame kõik ühel meelel, et NULL tähenda midagi tagastati, 311 00:19:09,190 --> 00:19:11,700 mingit tegelikku aadressi tagastati. 312 00:19:11,700 --> 00:19:15,210 Nüüd, siin ma lihtsalt võtta minu inimeste konventsiooni ma tagasi 1 alates peamised 313 00:19:15,210 --> 00:19:17,040 kui midagi läheb valesti. 314 00:19:17,040 --> 00:19:20,650 Ongi, sest peamine tagasipöördumist konventsioon on naasta 0, kui hea, 315 00:19:20,650 --> 00:19:22,990 1 või mõnda muud väärtust kui halb. 316 00:19:22,990 --> 00:19:28,200 Aga getString ja ühtegi funktsiooni, mis tegeleb mälu tagastab null, kui midagi läheb halvasti. 317 00:19:28,200 --> 00:19:33,480 >> Okei. Nii et kahjuks rida 27, super lihtne, kuigi see on, ei ole kuidagi võimalik kopeerida string. 318 00:19:33,480 --> 00:19:35,740 Miks? Me näeme seda järgmiselt. 319 00:19:35,740 --> 00:19:40,120 Ma väites rida 27 tuleb teha koopia s ja nimetades seda t. 320 00:19:40,120 --> 00:19:45,790 Nii et ma ei palu kasutaja jaoks 2 stringid seekord; Ma lihtsalt ütlen väärtust s 321 00:19:45,790 --> 00:19:47,870 tuleks kehtestada t samuti. 322 00:19:47,870 --> 00:19:52,890 Nii et nüüd lihtsalt näidata, kuidas murtud see on rida 29 aastast mida ma teen? 323 00:19:52,890 --> 00:19:56,980 Esimene Ma kontrollin, kas pikkus t on suurem kui 0. 324 00:19:56,980 --> 00:19:59,330 Seal on mõned string seal. Kasutaja sisestatud midagi sisse 325 00:19:59,330 --> 00:20:03,410 Mis on line 32 teed, ilmselt? 326 00:20:03,410 --> 00:20:08,910 [Kuuldamatu õpilase vastus] >> Õigus. Võite selline see tulenema, mida ma ütlesin seda teeb. 327 00:20:08,910 --> 00:20:13,200 Aga tehniliselt, mida see teeb? t [0] näitab, mida? 328 00:20:13,200 --> 00:20:15,140 [Üliõpilane] 0. iseloomu. >> [Malan] 0. iseloomu. 329 00:20:15,140 --> 00:20:19,620 Või rohkem inimese moodi, esimene märk t, mis iganes see on, H ehk antud juhul. 330 00:20:19,620 --> 00:20:24,990 Ja toupper teeb mida ta ütleb. See suurtäheks 0. iseloomu t ja see muudab ta. 331 00:20:24,990 --> 00:20:28,430 Nii et see tähendab võtta 0. iseloomu t, oleks suureks, 332 00:20:28,430 --> 00:20:30,320 ja pane see tagasi, et samas kohas. 333 00:20:30,320 --> 00:20:35,540 Nii et kui ma tüüpi tere väiketähtedega, see peaks muutuma väiketähti h kuni kapitali H. 334 00:20:35,540 --> 00:20:41,400 Probleem on aga selles, et liinid 35 ja 36, ​​mida ma olen umbes vaja on välja trükkida meie jaoks s ja t. 335 00:20:41,400 --> 00:20:43,120 Ja mis on sinu aimdus? 336 00:20:43,120 --> 00:20:47,250 Mida ma tegelikult näeme, kui ma trükitud tere kõik väiketähed? 337 00:20:47,250 --> 00:20:52,280 Mis hakka trükitud? >> [Kuuldamatu õpilase vastus] >> Mis see on? 338 00:20:52,280 --> 00:20:58,360 [Üliõpilane] Big H ja ülejäänud väikesed. >> Suur H ja ülejäänud väikesed, mis s või t? 339 00:20:58,360 --> 00:21:03,170 [Üliõpilane] Nii. >> Nii. Täpselt. Nii et vaatame, mis siin toimub. 340 00:21:03,170 --> 00:21:08,380 >> Lubage mul minna ja koostada selle. See on copy1, nii et copy1. Hea küll. 341 00:21:08,380 --> 00:21:14,840 Suumimiseks Lubage mul minna ja joosta copy1, Enter, Ütle midagi: tere väiketähtedega. 342 00:21:14,840 --> 00:21:19,570 See kapitaliseeritud koopia, aga see ilmselt kapitaliseeritud originaal samuti, 343 00:21:19,570 --> 00:21:22,070 sest see, mida nüüd juhtub see lugu? 344 00:21:22,070 --> 00:21:27,030 Kooskõlas 27 ma tegelikult ei tundu olevat kopeerimine stringi, 345 00:21:27,030 --> 00:21:30,450 aga isegi kui te intuitiivselt on loota, et olla juhul, 346 00:21:30,450 --> 00:21:33,680 kui sa mõtled seda pilti, mis tegelikult ma teinud olen? 347 00:21:33,680 --> 00:21:35,410 Pool pilt on sama. 348 00:21:35,410 --> 00:21:39,390 Nii et anna minna ajas tagasi, nii et t ei ole veel lugu. 349 00:21:39,390 --> 00:21:43,160 S võib esineda lugu, kuid olgem väiketähtedeks tere seekord. 350 00:21:43,160 --> 00:21:46,710 Nii et lubage mul kinnitada, mida ma tegelikult kirjutada logida 351 00:21:46,710 --> 00:21:51,280 Sel juhul on meil siin h-e-l-l-o. 352 00:21:51,280 --> 00:21:58,050 Me teha seda märgijada, panen eraldaja read siin ja mu \ 0. 353 00:21:58,050 --> 00:22:05,980 Nii et see on koht, kus me oleme niipea kui rida 1 kuni 24-ish, anda või võtta, on täidetud. 354 00:22:05,980 --> 00:22:07,800 See on pilt minu mälu. 355 00:22:07,800 --> 00:22:10,800 Kui ma saan rida 27, mis juhtub? 356 00:22:10,800 --> 00:22:14,730 Nagu enne, ma saan osuti, mis ma joonistan kuna see ruut. 357 00:22:14,730 --> 00:22:19,740 Seda nimetatakse t. Ja mis on selle väärtus vaikimisi? Kes teab? Mõned prügi väärtus. 358 00:22:19,740 --> 00:22:22,060 >> Nii et ma abstraktne, et ära nagu küsimärk. 359 00:22:22,060 --> 00:22:27,670 Ja niipea kui paremal pool rida 27 hukatakse, mida ma panna sees t? 360 00:22:27,670 --> 00:22:30,770 Sama asi, mis on s. 361 00:22:30,770 --> 00:22:34,120 Nii et kui me hetkeks eemaldada võtmiseks nool ja me ütleme, 362 00:22:34,120 --> 00:22:40,330 oh, see on mälu koormus aadress 123, kui te ütlete, t muutub s, semikoolon, 363 00:22:40,330 --> 00:22:42,700 sa sõna otseses mõttes panna 123 siin. 364 00:22:42,700 --> 00:22:45,200 Nüüd, kui me sellist lihtsustada meie maailma jälle pilte, 365 00:22:45,200 --> 00:22:48,750 mida olen teinud, on lihtsalt lisatud teine ​​nool oma maailma 366 00:22:48,750 --> 00:22:52,910 mis on suunatud T-st sama täpne jada. 367 00:22:52,910 --> 00:22:59,730 Nii et kui real 31 ja 32 ma tegelikult minna umbes muuta t [0] 368 00:22:59,730 --> 00:23:05,580 Mis on t [0] ilmselt sünonüüm nüüd? s [0] 369 00:23:05,580 --> 00:23:07,030 Nii ongi kõik, mis seal toimub. 370 00:23:07,030 --> 00:23:09,900 Ja kuigi selline tundub natuke madal ja kauge 371 00:23:09,900 --> 00:23:12,760 ja selline tunne ehk intuitiivselt see oleks lihtsalt töötas - 372 00:23:12,760 --> 00:23:15,410 Olen teinud koopiaid asjad enne ja see lihtsalt toimis - 373 00:23:15,410 --> 00:23:18,590 kui sa tegelikult mõelda, mida string tõesti on, see char *. 374 00:23:18,590 --> 00:23:21,700 Noh, mis see on? See on aadress mõned iseloomu. 375 00:23:21,700 --> 00:23:24,930 Siis võib-olla on mõttekam, et kui sa püüad teha midagi 376 00:23:24,930 --> 00:23:29,220 super pealtnäha lihtne niimoodi, kõik mida sa teed on kopeerimine mälu aadressi. 377 00:23:29,220 --> 00:23:32,530 Sa tegelikult ei tee midagi koos string ise. 378 00:23:32,530 --> 00:23:37,500 Nii et isegi kui sa ei tea, kuidas oleks seda probleemi kood, 379 00:23:37,500 --> 00:23:45,080 kõrge tase, kontseptuaalselt, mida me peame tegema, et muuta ta ärakirja s, ilmselt? 380 00:23:46,670 --> 00:23:48,820 Jah. >> [Üliõpilane] Anna uude asukohta? >> Täpselt. 381 00:23:48,820 --> 00:23:50,800 >> Me peame andma t uhiuue asukohta. 382 00:23:50,800 --> 00:23:55,230 Me peame kuidagi luua maailma, kus me saame uue tüki mälu, 383 00:23:55,230 --> 00:24:00,090 mis lihtsalt Selguse mõttes ma joonistan õigus alla selle ühe, kuid see ei pea seal olema. 384 00:24:00,090 --> 00:24:04,880 Aga see peab olema sama suur, nii et ma tõmban neid vertikaalpunktist samas kohas. 385 00:24:04,880 --> 00:24:09,720 See on hea, kui see kõik prügi esialgu. Kes teab, mis seal kirjas oli? 386 00:24:09,720 --> 00:24:13,850 Aga 1. etapp saab olema mulle nii palju mälu kui mul on vaja 387 00:24:13,850 --> 00:24:18,630 sobitada koopia tere, siis nuputada, kuidas kopeerida h siin, e siin, 388 00:24:18,630 --> 00:24:20,390 l siin ja nii edasi. 389 00:24:20,390 --> 00:24:24,880 Aga see juba peaks tunda veidi ilmne, isegi kui mõned andmed on veel abstraktne. 390 00:24:24,880 --> 00:24:28,690 Selleks, et kopeerida selle stringi sellesse, see on lihtsalt loop või samas loop 391 00:24:28,690 --> 00:24:31,580 või midagi, mis sinust on saanud kõik rohkem tuttav. 392 00:24:31,580 --> 00:24:35,970 Nii et proovime seda. Lubage mul minna copy2.c. 393 00:24:35,970 --> 00:24:43,270 Aastal copy2.c meil peaaegu sama programmi va rida 27. 394 00:24:43,270 --> 00:24:47,260 See paistab pisut keeruline, kuid kui me jaotada see jaokaupa, 395 00:24:47,260 --> 00:24:48,950 vasakul pool on sama. 396 00:24:48,950 --> 00:24:52,790 Char * t loob see asi mälu, kuigi küsimärk 397 00:24:52,790 --> 00:24:54,680 sest me ei tea, mis seal on vaikimisi. 398 00:24:54,680 --> 00:24:57,920 Paremal servas me nüüd kasutusele uus funktsioon, malloc, 399 00:24:57,920 --> 00:25:00,640 mälu eraldada, anna mulle mälu, 400 00:25:00,640 --> 00:25:06,900 ja see ilmselt võtab mitu argumenti, kuidas paljud asjad Sulgudes? 401 00:25:09,660 --> 00:25:12,130 Kuulsin murmurings 1 ja 2, kuid see on vaid 1. 402 00:25:12,130 --> 00:25:15,320 Pole mingit koma, mis tähendab, seal on ainult 1 asi sulgudesse. 403 00:25:15,320 --> 00:25:17,720 Kuigi seal on teised sulud, lubage mul rõhutada 404 00:25:17,720 --> 00:25:21,460 mis seal sees äärepoolseimate sulgudes, ja see on see väljend: 405 00:25:21,460 --> 00:25:25,880 (Strlen (s) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Nii et kui me tegelikult selle läbi mõtlema, see ütleb mulle pikkus s. 407 00:25:29,190 --> 00:25:34,440 Miks ma küll, lisada 1 peale pikkus? >> [Kuuldamatu õpilase vastus] 408 00:25:34,440 --> 00:25:40,200 Täpselt. Me vajame ruumi see kutt saba, kuues märk, mis ei ole Eesti mõistes 409 00:25:40,200 --> 00:25:42,250 kuid see on eriline programmilise tähendusega. 410 00:25:42,250 --> 00:25:46,800 >> Seega peame + 1 mis sest strlen naaseb inimese ootus pikkus, 411 00:25:46,800 --> 00:25:50,890 tere või 5, see ei anna teile täiendavaid null iseloomu. 412 00:25:50,890 --> 00:25:52,980 Nii et ma käsitsi lisada seda + 1. 413 00:25:52,980 --> 00:25:56,060 Ja siis see, * suurus (char), me pole seda varem näinud. 414 00:25:56,060 --> 00:25:57,480 See ei ole tehniliselt funktsioon. 415 00:25:57,480 --> 00:26:04,150 See on eriline märksõna, mis lihtsalt annab teada suurus on umbes andmetüüp arvutis 416 00:26:04,150 --> 00:26:06,980 sest tegelikult, mõned meist on 32-bit arvutid. 417 00:26:06,980 --> 00:26:10,900 Mul on päris vana arvuti kodus, ja see kasutab vaid 32 bitti esindama suunanäitajaks. 418 00:26:10,900 --> 00:26:13,900 Ja nii kui ma tegin suurus andmetüüp, oleks 32 bitti. 419 00:26:13,900 --> 00:26:18,300 Aga kui ma kasutan oma uue fancy arvuti, ma võiks saada tagasi väärtuse 64 bitti 420 00:26:18,300 --> 00:26:20,510 midagi nagu aadress. 421 00:26:20,510 --> 00:26:25,400 Nii et antud juhul lihtsalt olema super ohutu, me ei kavatse kõva kood midagi - 422 00:26:25,400 --> 00:26:28,740 Noh, mis on suurus char vastavalt sellele, mida me oleme öelnud siiani? 423 00:26:28,740 --> 00:26:34,450 Me oleme päris palju öelnud suuliselt, et see on 1 bait, ja see on päris palju tõsi kogu laevas. 424 00:26:34,450 --> 00:26:37,000 Aga jälle, eeldused kipuvad olema halb. 425 00:26:37,000 --> 00:26:40,850 Nad viivad lollakas tarkvara kui inimesed kasutavad oma tarkvara, kuidas sa ei kavatse. 426 00:26:40,850 --> 00:26:44,750 Nii et olgem abstraktne see ära ja lihtsalt rohkem üldmõistena öelda 427 00:26:44,750 --> 00:26:46,830 Ma vajan seda palju mäluhulka 428 00:26:46,830 --> 00:26:50,210 ja iga tüki mälu peaks olema samaväärne suurus iseloomu, 429 00:26:50,210 --> 00:26:54,870 mis on tegelikult võrdne 1 antud juhul, aga see on üldisem viis kirjalikult seda. 430 00:26:54,870 --> 00:27:00,460 Nii et kui sõna on tere, kui palju baite ei malloc ilmselt eraldada tere? 431 00:27:00,460 --> 00:27:04,980 [Üliõpilane] Kuus. >> Kuus. Täpselt nii palju kui meil on küsimärke ekraanil. 432 00:27:04,980 --> 00:27:07,800 Ja siis võtta arvan, et nüüd põhineb teie arusaam getString 433 00:27:07,800 --> 00:27:12,790 mida see malloc ilmselt tagasi? >> [Üliõpilane] aadress. 434 00:27:12,790 --> 00:27:17,020 Aadress mida? Esimese tüki mälu. 435 00:27:17,020 --> 00:27:20,670 >> Meil pole aimugi, mis seal on, sest mõned muud ülesanded 436 00:27:20,670 --> 00:27:23,010 oleks võinud kasutada seda mälu varem. 437 00:27:23,010 --> 00:27:28,380 Aga malloc, nagu getString, tagastab aadress esimest baiti mälu 438 00:27:28,380 --> 00:27:30,540 et ta on kõrvale otsida. 439 00:27:30,540 --> 00:27:38,380 Kuid mida ta ei tee, on sisestada see tühi längkriipsuga null iseloomu 440 00:27:38,380 --> 00:27:43,030 sest selgub saate malloc eraldada midagi: ints, stringid, massiivid 441 00:27:43,030 --> 00:27:45,700 ujukid, üliõpilane struktuure. 442 00:27:45,700 --> 00:27:47,750 Võite kasutada malloc täiesti üldiselt. 443 00:27:47,750 --> 00:27:51,470 See ei huvita või pead teadma, mida sa eraldades mälu. 444 00:27:51,470 --> 00:27:55,810 Seega oleks ennatlik jaoks malloc panna \ 0 445 00:27:55,810 --> 00:27:58,340 aasta lõpus iga tüki mälu see annab teile 446 00:27:58,340 --> 00:28:02,620 sest see \ 0 asi on lihtsalt kokkuleppeliselt stringid. 447 00:28:02,620 --> 00:28:06,310 See ei ole kasutatud ints, see ei kasutatud ujukid, see ei ole kasutatud õpilastele. 448 00:28:06,310 --> 00:28:11,730 Ja nii gotcha koos malloc on see, et koorem on täielikult teie programmeerija 449 00:28:11,730 --> 00:28:16,790 meeles pidada, kui palju baite olete eraldatud ja mitte kunagi kasutada loop 450 00:28:16,790 --> 00:28:21,570 või samas loop ja minna varem piiri patakas mälu olete saanud. 451 00:28:21,570 --> 00:28:23,540 Teisisõnu, niipea kui mälu eraldada, 452 00:28:23,540 --> 00:28:28,510 sa ei saa küsida operatsioonisüsteemi, oh, muide, kui suur patakas mälu see oli? 453 00:28:28,510 --> 00:28:32,080 See on täiesti su meeles, kui sa pead seda summat. 454 00:28:32,080 --> 00:28:34,330 >> Nii et vaatame, kuidas ma minna seda kasutada mälu. 455 00:28:34,330 --> 00:28:38,430 Vastavalt 28 ja 29, miks ma sellega tegelen? 456 00:28:39,850 --> 00:28:42,260 Lihtsalt kogu meelerahu kontrolli. 457 00:28:42,260 --> 00:28:45,110 Igaks juhuks midagi läks valesti, ma küsida mõned hull mälu 458 00:28:45,110 --> 00:28:48,690 või ma olen nii palju asju arvutis, et seal lihtsalt ei ole piisavalt mälu, 459 00:28:48,690 --> 00:28:51,780 midagi sellist, ma vähemalt soovite kontrollida null. 460 00:28:51,780 --> 00:28:55,260 Tegelikult enamik arvuteid annab teile illusiooni, et iga programmi 461 00:28:55,260 --> 00:28:57,080 saab kasutada kogu oma RAM, 462 00:28:57,080 --> 00:29:00,740 Aga isegi nii, kui kasutaja liigid mõned hull pikk jada ehk sellepärast, et nad on paha poiss 463 00:29:00,740 --> 00:29:03,440 ja nad tegelikult üritavad krahhi programmi või sissemurdmist see, 464 00:29:03,440 --> 00:29:07,300 soovite vähemalt kontrollida tagastatav väärtus malloc ja kas see võrdub null. 465 00:29:07,300 --> 00:29:11,630 Ja kui ei, lähme lihtsalt loobuda kohe, sest ma ei tea, mida teha sel juhul. 466 00:29:11,630 --> 00:29:13,950 Kuidas kopeerida string? Seal on vähe võimalusi seda teha. 467 00:29:13,950 --> 00:29:18,850 On tn kopeerida funktsioone C, kuid see on super lihtne, et teeme seda vanal heal moel. 468 00:29:18,850 --> 00:29:23,110 >> Esiteks lubage mul selgitada, mida pikkus s. 469 00:29:23,110 --> 00:29:26,930 Ma oleks võinud panna see silmus, kuid selle asemel ma lihtsalt pane see siia selgust. 470 00:29:26,930 --> 00:29:30,610 Nii n nüüd salvestab pikkus algse stringi, mis on ilmselt 5. 471 00:29:30,610 --> 00:29:35,290 Siis minu jaoks silmus ma itereerimise 0 kohta kuni n, 472 00:29:35,290 --> 00:29:40,940 ja iga iteratsiooni Ma panen s [i] sees t [i]. 473 00:29:40,940 --> 00:29:45,060 Nii et ma tähendas minu 2 sõrme osutavad stringid enne. 474 00:29:45,060 --> 00:29:49,260 Kuna see loop kordab meeldib see, ma lähen tuleb kopeerimine h sisse siin 475 00:29:49,260 --> 00:29:52,890 e sisse siin, ma arvesse siin, sest see on s on see t. 476 00:29:52,890 --> 00:29:58,770 Ja siis viimaks, reas 35 miks ma sellega tegelen? 477 00:29:58,770 --> 00:30:03,770 Mul on vaja veenduda, et ma lõpetades string t. 478 00:30:03,770 --> 00:30:06,170 Ja ma tegin selle nii olema super selge. 479 00:30:06,170 --> 00:30:09,510 Aga ettepanekuid, keegi, kui sa saaksid, teistmoodi seda teha. 480 00:30:09,510 --> 00:30:13,930 Ma tõesti ei vaja rida 35. Seal on veel üks võimalus seda teha. 481 00:30:13,930 --> 00:30:18,880 Jah. >> [Kuuldamatu õpilase vastus] >> Ütle seda valjemini. 482 00:30:18,880 --> 00:30:20,960 [Üliõpilane] Väiksem või võrdne. >> Täpselt. 483 00:30:20,960 --> 00:30:24,450 Me võiksime lihtsalt öelda, väiksem või võrdne n, mis üldiselt on halb 484 00:30:24,450 --> 00:30:28,190 sest peaaegu alati, kui me läheme üles võrdub asi Me loodame 485 00:30:28,190 --> 00:30:30,000 me minna 1 samm liiga kaugele. 486 00:30:30,000 --> 00:30:32,170 Kuid pidage meeles, mitu baiti tegime eraldada? 487 00:30:32,170 --> 00:30:37,210 Me eraldatud strlen s, nii et 5 + 1 kokku 6. 488 00:30:37,210 --> 00:30:39,980 Nii et sel juhul me võiksime teha midagi sellist 489 00:30:39,980 --> 00:30:46,450 nii et me kopeerimine ei ole lihtsalt tere ka \ 0 päris lõpus. 490 00:30:46,450 --> 00:30:49,860 Teise saaksime kasutada funktsiooni nimetatakse tn koopia, strcpy, 491 00:30:49,860 --> 00:30:51,700 kuid see ei oleks pooltki nii lõbus. 492 00:30:51,700 --> 00:30:54,000 Aga see on kõik see all kapuuts. 493 00:30:54,000 --> 00:30:56,050 Siis lõpuks, me teeme sama asja nagu enne. 494 00:30:56,050 --> 00:31:01,620 Ma lõikama t ja siis ma väita, et originaal näeb välja selline ja koopia näeb välja selline. 495 00:31:01,620 --> 00:31:08,570 Nii et proovime seda nüüd. Lubage mul minna siin. Tee copy2. Me suurendada ja joosta copy2. 496 00:31:08,570 --> 00:31:13,840 Ma lähen kirjuta tere väiketähtedega, ning tõepoolest saan väiketähtedeks tere kui originaal 497 00:31:13,840 --> 00:31:16,930 kuid kapitali Tere jaoks koopia. 498 00:31:16,930 --> 00:31:20,300 Aga ma ei teinud veel. Mul on vaja teha 1 viimane asi siin. 499 00:31:20,300 --> 00:31:28,000 46 ja 47 on selgelt vabastades mälu, kuid mida see tegelikult tähendab? 500 00:31:28,000 --> 00:31:33,250 Mida ma teen, kas sa arvad, mida helistaja liini 46 ja rida 47? 501 00:31:33,250 --> 00:31:38,900 Milline mõju, mis on? Jah. 502 00:31:38,900 --> 00:31:43,140 [Kuuldamatu õpilase vastus] >> Täpselt. 503 00:31:43,140 --> 00:31:46,380 >> Sa lihtsalt ütlen operatsioonisüsteem, hei, tänu selle mälu. 504 00:31:46,380 --> 00:31:48,320 Nüüd saad kasutada seda kellelegi teisele. 505 00:31:48,320 --> 00:31:50,790 Ja siin on suurepärane näide prügi väärtusi. 506 00:31:50,790 --> 00:31:55,430 Olen lihtsalt kasutada seda mälu üles kirjutada sõna tere 2 kohti, 507 00:31:55,430 --> 00:31:57,490 siin, siin, siin ja siin. 508 00:31:57,490 --> 00:32:00,910 Nii et see on h-e-l-l-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Aga siis ma kutsun rida 46 ja rida 47, ja sa tead, mis juhtub seal nii pildil? 510 00:32:06,960 --> 00:32:10,010 Tegelikult, oota, see pilt on vana. 511 00:32:10,010 --> 00:32:12,550 Kui me teeme koopia, see kutt on tegelikult juhtides siin, 512 00:32:12,550 --> 00:32:16,110 niiet eemaldada numbrid ja lihtsalt abstraktne ära nii meie nooled uuesti. 513 00:32:16,110 --> 00:32:19,370 Mis juhtub see pilt, kui ma helistada tasuta? 514 00:32:19,370 --> 00:32:22,750 [Kuuldamatu õpilase vastus] >> Isegi mitte. 515 00:32:22,750 --> 00:32:29,510 Kui ma nimetan tasuta s ja t - selline trikk küsimus - see pilt ei muutu üldse 516 00:32:29,510 --> 00:32:33,880 sest helistaja id ja kutsudes t lihtsalt ütleb operatsioonisüsteemi, 517 00:32:33,880 --> 00:32:39,010 hei, võite kasutada seda mälu uuesti, kuid see ei muuda seda tühjaks 518 00:32:39,010 --> 00:32:41,840 või mõne erilise iseloomu, see ei muuda seda, 519 00:32:41,840 --> 00:32:47,350 see ei muuda h või e või l või L või o kas koht midagi muud. 520 00:32:47,350 --> 00:32:51,610 Seoses pilt, niipea kui sa helistada tasuta, midagi ei muutu. 521 00:32:51,610 --> 00:32:56,570 Ja seal on päritolu prügi väärtusi, sest kui ma hiljem selle programmi 522 00:32:56,570 --> 00:33:01,010 küsida operatsioonisüsteemi jaoks rohkem mälu getString või malloc või midagi sellist 523 00:33:01,010 --> 00:33:04,900 ja operatsioonisüsteemi ütleb, kindel, Mul on 12 baiti mälu lihtsalt vabanenud, 524 00:33:04,900 --> 00:33:08,080 kasutada neid, mida sa lähed antakse? 525 00:33:08,080 --> 00:33:10,830 Sa lähed antakse patakas mälu, et meil oleksid tavaliselt teha 526 00:33:10,830 --> 00:33:13,700 küsimärki, kuid millised on need küsimärgid? 527 00:33:13,700 --> 00:33:17,000 Nad juhtub olema h-e-l-l-o, t-e-l-l-o. 528 00:33:17,000 --> 00:33:20,940 Need on meie uus prügi väärtused niipea kui vabaneb, et mälu. 529 00:33:20,940 --> 00:33:22,750 >> Seal on reaalses maailmas mõjuta siin ka. 530 00:33:22,750 --> 00:33:24,720 See juhtub pistmist RAM, kuid arvutis 531 00:33:24,720 --> 00:33:26,720 tegelikult teha sama plaat. 532 00:33:26,720 --> 00:33:30,620 Me räägime sellest eelkõige tulevikus lahendamist, mis keskendub ekspertiisi. 533 00:33:30,620 --> 00:33:36,170 Aga mis tegelikult juhtub, kui teil on mõned tundlikke töölaual faili 534 00:33:36,170 --> 00:33:39,600 või mõned pealiskaudsed JPEG ja lohistage see oma prügikast, 535 00:33:39,600 --> 00:33:44,390 mis juhtub, kui lohistate see prügikasti või prügikasti? 536 00:33:44,390 --> 00:33:47,240 Sa teadsid, mida ma rääkisin. [Naer] 537 00:33:47,240 --> 00:33:52,370 Mis juhtub, kui sa vedasid neid tõendeid oma prügikasti või prügikasti? 538 00:33:52,370 --> 00:33:55,920 [Kuuldamatu õpilase vastus] 539 00:33:55,920 --> 00:33:58,000 Noh, nii ettevaatlik. Mis juhtub, kui sa seda tegid? 540 00:33:58,000 --> 00:34:01,030 Lühike vastus on midagi, eks? 541 00:34:01,030 --> 00:34:04,790 Pealiskaudsed või tundlik fail on ikka lihtsalt istub seal kuskil kõvakettal. 542 00:34:04,790 --> 00:34:07,940 Enamik meist vähemalt on mõistnud, et teil on vaja tühjendada oma prügikasti 543 00:34:07,940 --> 00:34:10,429 või oma prügikasti tegelikult kustutada faile. 544 00:34:10,429 --> 00:34:13,440 Ja tõepoolest, kui sa paremklõps või kontrolli kliki oma prügikast 545 00:34:13,440 --> 00:34:15,580 või vali Fail Tühjenda prügikast või mis iganes 546 00:34:15,580 --> 00:34:21,420 ja sa tegelikult tühjendada prügikasti või prügikasti, mis tegelikult juhtub siis see pilt? 547 00:34:22,810 --> 00:34:25,969 Rohkem midagi. Nii et midagi tegelikult juhtub kettal. 548 00:34:25,969 --> 00:34:30,880 >> Ja kui me lihtsalt ajutiselt põikama ja kirjutada - Ma teen lihtsalt kasutada taga seda. 549 00:34:30,880 --> 00:34:34,639 Nii et nüüd lugu muutub alates RAM, mis on koht, kus programmid on olemas 550 00:34:34,639 --> 00:34:39,250 samas näed neid, kettale, mis on koht, kus neid hoitakse pikaajalise 551 00:34:39,250 --> 00:34:42,920 isegi kui võim läheb, nüüd - ja me tuleme selle juurde tagasi tulevikus - 552 00:34:42,920 --> 00:34:46,380 olgem lihtsalt teeselda, et see tähendab kõvaketas sees arvuti 553 00:34:46,380 --> 00:34:50,110 sest juba järgmisel päeval nad varem ümmargusi kettaid, palju nagu disketid. 554 00:34:50,110 --> 00:34:55,130 Nii et kui sul on mõned tundlikud Exceli faili, see võib võtta kuni see patakas mälu 555 00:34:55,130 --> 00:34:59,770 arvuti kettale, ja ma lihtsalt joonistus sama meelevaldne 1s ja 0.. 556 00:34:59,770 --> 00:35:03,970 Kui lohistate faili niimoodi oma prügikasti või prügikasti, 557 00:35:03,970 --> 00:35:07,750 sõna otseses mõttes midagi juhtub, sest Apple ja Microsoft on lihtsalt otsustanud 558 00:35:07,750 --> 00:35:10,450 prügikast ja prügikasti on tõesti ainult ajutine kohatäide. 559 00:35:10,450 --> 00:35:14,710 Ehk lõpuks OS tühjenda see teid, kuid tavaliselt, ta ei tee midagi, 560 00:35:14,710 --> 00:35:17,090 vähemalt seni, kuni sa oled tõesti vähe ruumi. 561 00:35:17,090 --> 00:35:20,870 >> Samas, kui sa lähed tühja prügikasti või tühi prügikasti, 562 00:35:20,870 --> 00:35:23,460 Samamoodi ei juhtu midagi, et see pilt. 563 00:35:23,460 --> 00:35:28,590 Kõik, mis juhtub, on mujal arvutis, seal on mingi tabel. 564 00:35:28,590 --> 00:35:35,400 See on omamoodi nagu väike cheat sheet, mis ütleb, et, ütleme, resume.doc, 565 00:35:35,400 --> 00:35:40,920 nii oma CV Microsoft Word fail elasid saabus 123 kõvakettal, 566 00:35:40,920 --> 00:35:43,710 ei mälus ja RAM, kuid kõvakettal, 567 00:35:43,710 --> 00:35:49,050 ja teie pealiskaudsed JPEG elu 456, ja teie Exceli faili elab 789 või kus iganes. 568 00:35:49,050 --> 00:35:53,640 Kui kustutate faile tegelikult tühjendamist prügikasti või prügikasti, 569 00:35:53,640 --> 00:35:59,530 see pilt ei muutu. 0. ja 1s kõvakettal ei lähe kuhugi. 570 00:35:59,530 --> 00:36:03,930 Aga see tabel, et see väike andmebaasi kehvasti, ei muutusi. 571 00:36:03,930 --> 00:36:08,750 Kui kustutate oma CV, see on justkui kustutatakse teatud mõttes 572 00:36:08,750 --> 00:36:12,790 kuid kõik arvuti ei ei unusta, kui see asi elab kõvakettal. 573 00:36:12,790 --> 00:36:17,870 0. ja 1s, et kirjutada oma CV või mõni neist ülejäänud failid on veel puutumata. 574 00:36:17,870 --> 00:36:21,960 >> Nii et kui sa tegid seda kogemata, seal on veel nullist 575 00:36:21,960 --> 00:36:25,800 et saate taastada oma andmed, kasutades Norton Utilities või mõned kommertstarkvara 576 00:36:25,800 --> 00:36:29,810 kelle eesmärk elus on leida 0. ja 1s, mis on omamoodi jäänud orvuks, 577 00:36:29,810 --> 00:36:33,300 unustatud siin aga lahkus siit, nii et võite saada oma andmed tagasi. 578 00:36:33,300 --> 00:36:38,410 Või kohtuekspertiisi uurijatele politsei või FBI tegelikult võtta kõvaketas 579 00:36:38,410 --> 00:36:42,550 ja tegelikult otsida mustreid 0. ja 1s mis näevad välja nagu JPEG, näeb Exceli faili, 580 00:36:42,550 --> 00:36:46,400 ja taastada neid niimoodi isegi kui arvuti on unustanud neid seal. 581 00:36:46,400 --> 00:36:49,820 Nii et ainus viis tõesti kustutada andmeid, nii saame arutada ka tulevikus, 582 00:36:49,820 --> 00:36:54,190 on võsa või pühkida fail või kõvakettale - 583 00:36:54,190 --> 00:36:56,540 Sa ei saa tõesti vabaneda 0. ja 1s 584 00:36:56,540 --> 00:36:59,440 sest muidu sa alustada GB kõvaketas 585 00:36:59,440 --> 00:37:02,380 ja sa lõpuks koos megabaidi kõvakettale, kui te pidevalt olid kustutamine 586 00:37:02,380 --> 00:37:04,380 sõna otseses mõttes, 0. ja 1s. 587 00:37:04,380 --> 00:37:06,310 Mida sa teeksid, kui sa tõesti tahtsid, et katta oma lugusid 588 00:37:06,310 --> 00:37:10,510 ja peamine probleem on see, et seal on ikka 0. ja 1s kettal? 589 00:37:10,510 --> 00:37:14,930 Ma näen kedagi gesticulating et teil oleks füüsiliselt murda seade. See töötab. 590 00:37:14,930 --> 00:37:19,600 [Naer] Aga kui see on mingi kallis lahendus, mida oleks mõistlikum? 591 00:37:19,600 --> 00:37:23,270 Jah. >> [Üliõpilane] ülekirjutamine neid. >> Ülekirjutamine neile mida? >> [Üliõpilane] Muud andmed. 592 00:37:23,270 --> 00:37:29,070 Muud andmed. Sa võid kirjutada oma ketta 0s või 1s või kõik 0s, kõik 1s. 593 00:37:29,070 --> 00:37:31,230 >> Ja see on tõesti see, mida mõned tarkvara teeb. 594 00:37:31,230 --> 00:37:33,570 Sa võid osta tarkvara või isegi saada tasuta tarkvara 595 00:37:33,570 --> 00:37:36,610 ja isegi ehitatud Mac OS nendel päevadel, vähem Windows, 596 00:37:36,610 --> 00:37:38,660 on võime kindlalt kustutada. 597 00:37:38,660 --> 00:37:41,960 Tegelikult, kui soovite kõik kulgema koju täna kui teil on Mac ja seda, 598 00:37:41,960 --> 00:37:45,740 kui sul on mõned asjad oma prügikast, mida saate teha Secure Empty Trash, 599 00:37:45,740 --> 00:37:47,610 mis teeb täpselt seda. 600 00:37:47,610 --> 00:37:53,350 Selle asemel, et lihtsalt kustuta failid siin, see ei kustuta 0. ja 1s siin, 601 00:37:53,350 --> 00:38:01,240 Pigem on see lihtsalt muudab neid kõiki, näiteks kuni 0. ja dot, dot, dot. 602 00:38:01,240 --> 00:38:05,330 Nii et üks sinu tulevik psets tegelikult olla tahtlikult andmete taastamine - 603 00:38:05,330 --> 00:38:08,430 fotode, et oleme võtnud inimesi, kohti ja asju ülikoolilinnakus 604 00:38:08,430 --> 00:38:12,810 mille teeme kohtuekspertiisi pilt Digikaamera mälukaart, 605 00:38:12,810 --> 00:38:17,120 mis on täpselt sama mõte - ja sul on ärgitada tegelikult leida 606 00:38:17,120 --> 00:38:20,160 mustreid, mis esindavad JPEG kõvakettal, 607 00:38:20,160 --> 00:38:23,610 meelega, et endine õpilane, kelle e-posti Lugesin paar nädalat tagasi tegin 608 00:38:23,610 --> 00:38:25,860 tagasi oma õe fotod. 609 00:38:25,860 --> 00:38:30,300 Miks me ei võta 5-minutilise pausi siin, ja me koondada rohkem mälu. 610 00:38:33,030 --> 00:38:38,610 Nii et siin on koht, kus asjad veidi Hallutsinatsioone, kuid see on väga võimas samm 611 00:38:38,610 --> 00:38:40,480 poole mõista seda enam. 612 00:38:40,480 --> 00:38:42,900 Siin on programm nimega pointers.c. 613 00:38:42,900 --> 00:38:45,430 See on üks tänapäeva proovi kood. 614 00:38:45,430 --> 00:38:51,280 Pane tähele, et paar esimest rida, 19 kuni 22, kõik me teeme on midagi getString 615 00:38:51,280 --> 00:38:54,460 ja tagasituleku aadress, talletades seda s. 616 00:38:54,460 --> 00:38:58,380 Edaspidi jaoks pset isegi 3, kui soovite, kuid pset 4 ja edasi 617 00:38:58,380 --> 00:39:01,030 kus saab hakata võtma neid abirattad maha ennast, 618 00:39:01,030 --> 00:39:04,030 ei ole põhjust teeselda, et stringide eksisteeri enam. 619 00:39:04,030 --> 00:39:07,030 See on kindlasti okei lihtsalt alustada öeldes, char *. 620 00:39:07,030 --> 00:39:12,610 >> Nagu kõrvale, online-viited ja raamatud, mida võib sageli näha tähe kõrval muutuja. 621 00:39:12,610 --> 00:39:15,600 Sa võid isegi näha ruumid ümber mõlemal pool. 622 00:39:15,600 --> 00:39:17,680 Kõik need on funktsionaalselt õige. 623 00:39:17,680 --> 00:39:21,180 Praegu küll, me standardiseerida selline lähenemine teha super selge 624 00:39:21,180 --> 00:39:24,000 et char * on nagu öelda iseloomu pointer. 625 00:39:24,000 --> 00:39:25,680 See on andmetüüp. 626 00:39:25,680 --> 00:39:28,730 Ja siis muutuja nimi on s sel juhul. 627 00:39:28,730 --> 00:39:31,180 Nii oleme saanud string ja oleme otsustanud kutsuda seda s. 628 00:39:31,180 --> 00:39:35,180 Ja siis siin all märgata, et ma teen tegelikult natuke petmine. 629 00:39:35,180 --> 00:39:39,080 Seda nimetatakse pointer aritmeetika, mis on omamoodi super lihtne. 630 00:39:39,080 --> 00:39:41,790 See tähendab lihtsalt liita ja lahutada numbreid suunanäitajaks. 631 00:39:41,790 --> 00:39:43,660 Aga see tegelikult toimib. 632 00:39:43,660 --> 00:39:49,170 See programm ilmselt trükib stringid S 1 märk igale reale nii, et lõpptulemus - 633 00:39:49,170 --> 00:39:54,920 Just nii me võib rikkuda, kui see läheb, siis suunanäitajaks, joosta suunanäitajaks, lubage mul suumimiseks 634 00:39:54,920 --> 00:39:58,940 Nüüd lubage mul kirjuta midagi tere ja tüüp Sisesta 635 00:39:58,940 --> 00:40:01,080 ja ta prindib 1 märk rea kohta. 636 00:40:01,080 --> 00:40:04,730 Kuni hetk tagasi, me oleks seda teinud koos square bracket märke. 637 00:40:04,730 --> 00:40:09,760 Meil oleks loop ja me tahaks teha printf s [i] ja me tahaks seda uuesti ja uuesti ja uuesti 638 00:40:09,760 --> 00:40:11,950 längkriipsuga n lõpus igal real. 639 00:40:11,950 --> 00:40:16,800 Aga see programm on erinev. See programm kasutab sõna otseses mõttes, aritmeetika. 640 00:40:16,800 --> 00:40:18,860 Mis siis siin toimub? 641 00:40:18,860 --> 00:40:24,720 Esiteks, enne seda silmus isegi hukatakse, mida, et asi selge oleks, on s tegelikult? 642 00:40:24,720 --> 00:40:27,270 S on? >> [Üliõpilane] aadress. >> Aadress. 643 00:40:27,270 --> 00:40:32,980 >> Ja see on aadress, kui tegemist tere, esimene märk, et sõna, mis h. 644 00:40:32,980 --> 00:40:37,370 Nii s on see konkreetne näide, aadress h. 645 00:40:37,370 --> 00:40:41,850 Nii et mida see tähendab teha s + i? 646 00:40:41,850 --> 00:40:46,280 Noh, ma algab 0 selles jaoks silmus. Me oleme seda teinud mitu korda. 647 00:40:46,280 --> 00:40:49,760 Ma ei kavatse minna kuni stringi pikkusena, ilmselt. 648 00:40:49,760 --> 00:40:53,950 Nii et esimese iteratsiooni see silmus, ma ilmselt 0. 649 00:40:53,950 --> 00:41:01,740 Nii et see väljend ütleb s + i - pigem s +0--see on ilmselt lihtsalt s. 650 00:41:01,740 --> 00:41:04,320 Mis on * on siin? 651 00:41:04,320 --> 00:41:08,530 Nüüd me kasutame täht veidi teistmoodi. 652 00:41:08,530 --> 00:41:13,080 Lubage mul minna ja vabaneda t, sest me oleme valmis rääkima t ja koopiad s. 653 00:41:13,080 --> 00:41:15,540 Nüüd me lihtsalt tahame rääkida lugu kaasates s. 654 00:41:15,540 --> 00:41:20,090 Ja nii praegu, pärast string-tüüpi, meie maailm välja üsna nagu see oli enne 655 00:41:20,090 --> 00:41:26,630 lihtsalt s ladustamiseks aadress h ja üldisemalt osutades string tere. 656 00:41:26,630 --> 00:41:33,170 Kui ma nüüd tegema rida nagu * (id + i), proovime seda. 657 00:41:33,170 --> 00:41:40,140 Nii * (id + i). Lubage mul seda lihtsustada, sest see on 0, nii et see on * (id +0). 658 00:41:40,140 --> 00:41:43,790 Noh, oota natuke. Lihtsam edasi. See on * (id). 659 00:41:43,790 --> 00:41:47,020 Noh, nüüd sulgudes on tobe, nii et nüüd lähme lihtsalt teha * s. 660 00:41:47,020 --> 00:41:50,540 Nii esimese iteratsiooni see silmus, et rida, mis on esile tõstetud, 26, 661 00:41:50,540 --> 00:41:53,650 on päris palju vastab trükkimiseks. 662 00:41:53,650 --> 00:41:56,040 Mis on andmetüübi * s? 663 00:41:56,040 --> 00:42:00,770 Seoses sellega, sest täht juhtub olema kõrval on iseenesest 664 00:42:00,770 --> 00:42:04,930 aga täpsemalt, sest me ei ole enam kuulutatakse s, 665 00:42:04,930 --> 00:42:09,730 me ei looda muutuja enam, ei ole mainitud char * kooskõlas 26. 666 00:42:09,730 --> 00:42:14,280 seal ei mainita märksõna string, me oleme lihtsalt kasutades muutuja nimega s, 667 00:42:14,280 --> 00:42:19,650 Selgub nüüd täht on veidi teistsugune ja küll segane tähenduses. 668 00:42:19,650 --> 00:42:26,590 * S tähendab siin minna aadress s ja prindi iganes seal. 669 00:42:26,590 --> 00:42:33,750 Nii s on siin, * s on - omamoodi nagu rennid ja redelid, järgige nool - siin. 670 00:42:33,750 --> 00:42:35,850 Nii et see on * s. 671 00:42:35,850 --> 00:42:39,060 >> Mis siis saab trükitud esimese iteratsiooni et loop rida 26? 672 00:42:39,060 --> 00:42:42,170 Ma printida% c, mis on kohatäide iseloomu, 673 00:42:42,170 --> 00:42:48,520 siis \ n uus rida. * (Id + i), kus i on 0 on lihtsalt see. 674 00:42:48,520 --> 00:42:53,670 Mis siis char ma paigutama% c jaoks? H. 675 00:42:53,670 --> 00:42:56,900 Järgmise iteratsiooni loop - saate tõenäoliselt näha, kui see läheb - 676 00:42:56,900 --> 00:43:01,350 järgmise iteratsiooni i on ilmselt 1, nii et see tähendab s +1, 677 00:43:01,350 --> 00:43:05,580 ja siis nüüd ma ei pea sulgudes sest nüüd täht peab ütlema 678 00:43:05,580 --> 00:43:08,620 mine mälu aadress s +1. 679 00:43:08,620 --> 00:43:14,170 Mis on s? Anna minna ajas tagasi ja öelda, et see nool nüüd ei ole tegelikult seda meile mingit teenet. 680 00:43:14,170 --> 00:43:18,450 Vaatame täpsemalt öelda, et see on hoidmiseks number 123 681 00:43:18,450 --> 00:43:25,110 sest alguses see string Tere, see on aadress 123, see on 124, ja nii edasi. 682 00:43:25,110 --> 00:43:30,550 Nii et teist iteratsiooni kui ma räägin s +1, see on nagu öelda 123 1, 683 00:43:30,550 --> 00:43:35,340 muidu tuntud 124, mis siis char saab trükkida teist iteratsiooni? 684 00:43:35,340 --> 00:43:37,850 E kell mälu Aadress 124. 685 00:43:37,850 --> 00:43:44,440 Siis + jälle, 125, 126, 127, ja see ahel õnneks peatub enne kui saame siin 686 00:43:44,440 --> 00:43:49,040 sest ma kasutan strlen veenduda, et ma ei lähe liiga kõrge. 687 00:43:49,040 --> 00:43:50,810 Nii et ka see on see. 688 00:43:50,810 --> 00:43:55,000 Jällegi, see on lihtsalt nii, nagu oleksime teinud nädal tagasi. 689 00:43:55,000 --> 00:43:59,200 Las ma kirjutan seda rida allpool, kuigi me ei taha teha mõlemat. 690 00:43:59,200 --> 00:44:02,500 See on identne nüüd sellele. 691 00:44:02,500 --> 00:44:08,310 >> Nii et kuigi s on string, nagu me oleme oodanud seda nädalat, s on tõesti char *. 692 00:44:08,310 --> 00:44:13,270 Nii et kui me tahame olla super anal, see on tõesti õige, et kirjutada eripära 693 00:44:13,270 --> 00:44:17,490 kell nda asukohta kasutades neid numbreid aadressid ja see täht operaator, 694 00:44:17,490 --> 00:44:20,470 kuid ausalt öeldes, see on lihtsalt nii palju puhtam. Nii et see ei ole halb. 695 00:44:20,470 --> 00:44:26,720 Mingit põhjust peatus teha rida 27 siin, kuid 26 on praktiliselt samad, 696 00:44:26,720 --> 00:44:31,570 ja see on funktsionaalselt sama täpselt põhjuseid, et me arutame siiani. 697 00:44:31,570 --> 00:44:33,650 Ja lõpuks, 29 on lihtsalt hea tava. 698 00:44:33,650 --> 00:44:38,420 Üleskutse tasuta s tähendab, et nüüd sa annad tagasi mälu getString andis teile 699 00:44:38,420 --> 00:44:41,630 sest taas, nagu ma mainisin Esmaspäev, getString nädalaid 700 00:44:41,630 --> 00:44:44,180 on kasutusele bug oma kood. 701 00:44:44,180 --> 00:44:46,490 Sinu kood nädalat on olnud mälu lekked 702 00:44:46,490 --> 00:44:49,970 mille olete küsinud getString mälu, kuid sa pole kunagi olnud anda see tagasi. 703 00:44:49,970 --> 00:44:53,410 Ja see oli teadlikult valitud meile pedagoogiliselt 704 00:44:53,410 --> 00:44:55,880 sest see on lihtsalt liiga palju mõelda varakult. 705 00:44:55,880 --> 00:44:57,710 Aga nüüd meil on vaja rohkem sümmeetria. 706 00:44:57,710 --> 00:45:00,830 Kui te küsite arvuti mälu, nagu seda tehakse getString, 707 00:45:00,830 --> 00:45:02,820 nagu see on ilmselt jaoks malloc, 708 00:45:02,820 --> 00:45:07,970 peate nüüd pset 4 aastast ka tasuta sellist mälu. 709 00:45:07,970 --> 00:45:11,650 Teade see erineb öeldes int n. 710 00:45:11,650 --> 00:45:15,040 Sa ei pea vabastama, sest sa ei helistanud getString 711 00:45:15,040 --> 00:45:16,890 ja sa ei helistanud malloc. 712 00:45:16,890 --> 00:45:20,610 >> Ja isegi kui sa helistasid GetInt kui me lõpuks näha, 713 00:45:20,610 --> 00:45:25,520 GetInt ei jätku mälu, sest te võib tegelikult läbida umbes täisarvud 714 00:45:25,520 --> 00:45:29,430 ja ujukid ja tähed just nii me oleme seda teinud mitu nädalat. 715 00:45:29,430 --> 00:45:33,960 Stringid, kuigi on eriline, sest tegelikult nad ahel mitu tähemärki. 716 00:45:33,960 --> 00:45:37,450 Nii et nad on lihtsalt erinevad sümbolid ja ujukid ja ints jms. 717 00:45:37,450 --> 00:45:39,980 Aga me tuleme tagasi, et enne pikk. 718 00:45:39,980 --> 00:45:44,920 Kõik küsimused siis selle alguses viiteid? Jah. 719 00:45:44,920 --> 00:45:49,690 [Kuuldamatu õpilane küsimus] 720 00:45:49,690 --> 00:45:51,440 Ah, väga hea küsimus. 721 00:45:51,440 --> 00:45:55,790 Üks väheseid asju, C tegelikult teeb teid, mis on mugav, 722 00:45:55,790 --> 00:46:00,110 on see nuputab teile, milline suurus on andmetüüp 723 00:46:00,110 --> 00:46:03,060 ja siis teeb sellist korrutamine teile. 724 00:46:03,060 --> 00:46:06,610 See on oluline, kui tegemist on sümbolid, kuna peaaegu alati char on 1 bait, 725 00:46:06,610 --> 00:46:08,150 nii see lihtsalt toimib. 726 00:46:08,150 --> 00:46:11,220 Aga huvides arutelu, kui sa olid tegelikult trükkimine täisarvud 727 00:46:11,220 --> 00:46:15,500 ja sa tahad välja printida mingi väärtus on, mis osutavad täisarv, 728 00:46:15,500 --> 00:46:20,720 sa samamoodi ei ole vaja teha + 4 * i lihtsalt sellepärast, int on 4 baiti. 729 00:46:20,720 --> 00:46:25,780 Pointer aritmeetika tähendab, et C ja kompilaator teha kõik, et matemaatika teile. 730 00:46:25,780 --> 00:46:29,190 Kõik, mida selleks hoolivad on loendamise omamoodi inimeste mõttes. Jah. 731 00:46:29,190 --> 00:46:35,200 [Üliõpilane] Kui teil kuulutada stringi sees jaoks silmus, kas sul on vaba ta hiljem? 732 00:46:35,200 --> 00:46:36,760 Hea küsimus. 733 00:46:36,760 --> 00:46:41,390 >> Kui te deklareeritud stringi sees jaoks silmus, sa pead vabastama hiljem? 734 00:46:41,390 --> 00:46:47,520 Teil on vaja ainult vaba mälu, et sa jagada koos getString või malloc. 735 00:46:47,520 --> 00:46:53,110 Nii et kui sa just öelda midagi sellist - las ma panen looksulg nüüd nii kõik kood on seotud. 736 00:46:53,110 --> 00:46:58,580 Kui sa tegid midagi, kuigi buggily, nagu see, char * t = s, 737 00:46:58,580 --> 00:47:03,450 sa ei pea tasuta t sest t ei sisalda ühtegi viidet malloc või getString. 738 00:47:03,450 --> 00:47:08,960 Kui aga sa tegid seda, getString, siis jah, siis oleks vaja tasuta t. 739 00:47:08,960 --> 00:47:14,350 Ja tegelikult sinu ainus võimalus seda teha on nüüd sees see ahel, et sama küsimust ulatus 740 00:47:14,350 --> 00:47:16,060 et me oleme arutanud ka varem. 741 00:47:16,060 --> 00:47:18,830 Muidu oleksid sa eraldamise mälu, eraldades mälu, eraldades mälu, 742 00:47:18,830 --> 00:47:21,230 ja lõpus programm, sest sa oled väljaspool selle kontuuri, 743 00:47:21,230 --> 00:47:24,240 t ei ole, aga sa ei öelnud operatsioonisüsteemi 744 00:47:24,240 --> 00:47:26,750 et sa ei pea, et mälu enam. 745 00:47:26,750 --> 00:47:30,430 Ja enne ammu, pset 4 või 5 me varustada teid programmi nimega Valgrind, 746 00:47:30,430 --> 00:47:34,160 mis on sarnase sisuga GDB, et ta sai mõnevõrra kauge liides, 747 00:47:34,160 --> 00:47:35,750 kuid tema eesmärk elus on teid aidata. 748 00:47:35,750 --> 00:47:39,380 Ja Valgrind on programm, mis tulevikus otsida teie programmid 749 00:47:39,380 --> 00:47:42,550 otsin mälu lekib, kas alates getString või malloc, 750 00:47:42,550 --> 00:47:47,800 mis me hakkame kasutama kõiki rohkem kui me lõpetama CS50 raamatukogu nii palju. 751 00:47:47,800 --> 00:47:53,030 Me lõpuks on nüüd omamoodi sõnavara ja omamoodi vaimne mudel teoreetiliselt 752 00:47:53,030 --> 00:47:55,170 mille lahendamiseks purustatud programm. 753 00:47:55,170 --> 00:47:59,410 >> Nii et selles purustatud programm, swap töötab sees swap, 754 00:47:59,410 --> 00:48:05,280 kuid ta ei ole kunagi tegelikult töötatud peamised sest peamine möödus x ja y, tagasikutsumine, 755 00:48:05,280 --> 00:48:07,260 ja need kiideti poolt väärtused, kui nii võib öelda. 756 00:48:07,260 --> 00:48:09,330 Koopiad neist anti vahetada. 757 00:48:09,330 --> 00:48:12,520 Aasta lõpuks swap, ja b tõepoolest on vahetatud, 758 00:48:12,520 --> 00:48:16,120 aga muidugi x ja y, kui me arutasime esmaspäeval, ei olnud. 759 00:48:16,120 --> 00:48:19,940 Nii et ma teen ettepaneku roheline siin, et see on tegelikult lahendus siin. 760 00:48:19,940 --> 00:48:22,640 Ja tegelikult, las ma liikuda mu tähte lihtsalt olla järjekindel 761 00:48:22,640 --> 00:48:24,440 kuigi jällegi, funktsionaalselt see ei ole oluline. 762 00:48:24,440 --> 00:48:28,730 Tulevikus nädalat me selgitame, miks ja millal see asi. 763 00:48:28,730 --> 00:48:30,600 Nii roheline nüüd on lahendus. 764 00:48:30,600 --> 00:48:33,700 Ausalt öeldes tundub kogu palju Messier, sest mul on kõik need tähed. 765 00:48:33,700 --> 00:48:35,380 Lubage mul rõhutada ühte asja. 766 00:48:35,380 --> 00:48:40,040 Ülemisel real siin, kus ta ütleb int * ja int * b 767 00:48:40,040 --> 00:48:42,820 on põhimõtteliselt teeb sama asja, sest see on alati. 768 00:48:42,820 --> 00:48:47,070 Seda kuulutatakse 2 argumendid või parameetreid vahetada, 769 00:48:47,070 --> 00:48:49,940 millest esimene on int osuti nimega, 770 00:48:49,940 --> 00:48:53,100 millest teine ​​on int osuti nimega b. 771 00:48:53,100 --> 00:48:55,770 Ainuke asi mis on uus siinkohal on asjaolu, et seal on täht seal. 772 00:48:55,770 --> 00:48:59,340 >> Mida see tähendab? Ei ole int, b ei ole int. 773 00:48:59,340 --> 00:49:04,100 On aadress int ja b on aadress erinevate int. 774 00:49:04,100 --> 00:49:06,980 Alla siin on see, kus ma tunnistan C saab segane. 775 00:49:06,980 --> 00:49:09,790 Nüüd me kasutame staar, kuid see on erinev tähendus selles kontekstis. 776 00:49:09,790 --> 00:49:13,150 Sest me ei kuulutatakse suunanäitajaks, sest me oleme siin üleval, 777 00:49:13,150 --> 00:49:15,500 siin me oleme viite mahavõtmine asju. 778 00:49:15,500 --> 00:49:21,520 Nii tehniliselt, star selles kontekstis esimese, teise ja kolmanda rea ​​sees swap 779 00:49:21,520 --> 00:49:24,560 Kas dereference operaator, mis tähendab lihtsalt sinna minna. 780 00:49:24,560 --> 00:49:27,400 Nii nagu mu sõrme järgneb noolt h, 781 00:49:27,400 --> 00:49:31,100 * Mingil juhul minna sellele aadressile ja leia mind int, et on olemas. 782 00:49:31,100 --> 00:49:34,250 * B vahenditega minna aadress ja andke mulle, mida on seal. 783 00:49:34,250 --> 00:49:40,730 Nii et olgem ekraanigraafika pilt esmaspäevast kasutab nüüd virna raamid 784 00:49:40,730 --> 00:49:43,130 põhja millest üks saab olema peamine, 785 00:49:43,130 --> 00:49:47,600 ülemine millest üks saab olema swap, 786 00:49:47,600 --> 00:49:50,880 nii et meie maailm välja, just nagu Esmaspäev, niimoodi. 787 00:49:50,880 --> 00:49:53,620 Siin on patakas mälu, et peamine on kavatse kasutada. 788 00:49:53,620 --> 00:49:56,520 >> Meenuta alates esmaspäevast, et programm lihtsalt oli 2 muutujad, 789 00:49:56,520 --> 00:50:01,930 üks nn x ja üks nn y, ja hoidsin numbrid 1 ja 2 sinna. 790 00:50:01,930 --> 00:50:06,580 Nüüd, kui ma kutsun vahetada nagu ma tegin esmaspäeval, 791 00:50:06,580 --> 00:50:11,000 Varem, kui ma kasutasin punane versioon sellest programmist, mis näeb välja selline, 792 00:50:11,000 --> 00:50:17,470 Ma sain 2 parameetrite a ja b, ja mis me siis kirjutage siia ja siin? 793 00:50:17,470 --> 00:50:21,160 Lihtsalt 1 ja 2, sõna otseses mõttes kopeerib x ja y. 794 00:50:21,160 --> 00:50:23,070 Täna me seda muuta. 795 00:50:23,070 --> 00:50:28,510 Täna lähitulede asemel sisse ints ja b läheme edasi 2 aadressid. 796 00:50:28,510 --> 00:50:34,290 Need aadressid juhtuma juhtida tähelepanu ints, kuid need aadressid ei ole Ints ise. 797 00:50:34,290 --> 00:50:37,330 Nad on aadresse. See on nagu postiaadress asemel. 798 00:50:37,330 --> 00:50:40,580 Nüüd peame lihtsalt annan endale veidi täpsemalt ekraanil. 799 00:50:40,580 --> 00:50:43,250 See on minu arvuti mälu nagu see on olnud kogu päeva. 800 00:50:43,250 --> 00:50:45,120 Nüüd tuleb mõned suvalise numeratsiooniplaani. 801 00:50:45,120 --> 00:50:50,580 Nii et ütleme lihtsalt, lihtsalt juhus, et see on mälu aadress 123, 124. 802 00:50:50,580 --> 00:50:55,660 Ütleme nii, et see on 125, see on 126, ja nii edasi, aga see on täiesti meelevaldne. 803 00:50:55,660 --> 00:50:58,590 Vajame ainult natuke nummerdamise skeemi minu mälu. 804 00:50:58,590 --> 00:51:04,030 Nii et nüüd, kui ma tegelikult läbida x ja y, ma ei kavatse läbida x ja y; 805 00:51:04,030 --> 00:51:08,400 Ma lähen läbima postiaadress, kui nii võib öelda, x ja y 806 00:51:08,400 --> 00:51:11,870 nii et mida saab ladustada siin ja siin ei ole 1 ja 2, 807 00:51:11,870 --> 00:51:16,030 aga kui näete minu väike tekst, mis saab edasi siin ja siin? 808 00:51:16,030 --> 00:51:23,340 [Kuuldamatu õpilase vastus] >> Täpselt. 123 saab panna siin ja 124 saab panna siin. 809 00:51:23,340 --> 00:51:28,910 >> Nüüd, kuna ma kasutasin star selles väga esimene rida viis siin üleval, 810 00:51:28,910 --> 00:51:34,340 minu programm lihtsalt teab, et 123 ja 124, kuigi nad ilmselt täisarvud 811 00:51:34,340 --> 00:51:40,160 et iga inimese võib märgata, tuleks neid tõlgendada aadressid, numbriline aadresse. 812 00:51:40,160 --> 00:51:43,250 Nad ei ole ja ise ints, nad aadressid, 813 00:51:43,250 --> 00:51:46,120 ja see on, sest ma ei ole selgelt panna tähed sinna. 814 00:51:46,120 --> 00:51:51,360 Nüüd on minu esimene, teine ​​ja kolmas rida tegelik kood, mis juhtub siin? 815 00:51:51,360 --> 00:51:53,380 Joonistame ülejäänud pilt. 816 00:51:53,380 --> 00:51:56,980 THK on lihtsalt nagu see oli esmaspäeval. Midagi erilist tmp. 817 00:51:56,980 --> 00:52:03,060 See on lihtsalt kohalik 32 bitti muutuja, ja sees, et ma olen ilmselt ladustamiseks väärtus *. 818 00:52:03,060 --> 00:52:08,580 Nüüd, kui ma just ütlesin tmp =, mida ma panna siia? >> [Üliõpilane] 123. 819 00:52:08,580 --> 00:52:10,370 123. Aga see pole see, mida ma teen. 820 00:52:10,370 --> 00:52:13,670 Ma ütlen tmp = *. Star vahenditega sinna minna. 821 00:52:13,670 --> 00:52:19,370 Nii et siin on, 123. Kuidas ma sinna minna? Teeskle, nagu seal nool. 822 00:52:19,370 --> 00:52:24,460 Noh, seal on, 1. Mis siis saab salvestatud tmp, ilmselt? Just 1. 823 00:52:24,460 --> 00:52:29,620 Nii et teiste sõnadega, tmp on *, * mingil juhul minna aadressile, mis on praegu, 824 00:52:29,620 --> 00:52:31,320 mis on ilmselt 123. 825 00:52:31,320 --> 00:52:33,910 >> Okei, siin me oleme asukoht 123, näen number 1, 826 00:52:33,910 --> 00:52:35,670 nii et ma panen number 1 seal. 827 00:52:35,670 --> 00:52:39,020 Nüüd mida ma pean tegema kooskõlas 2 * = * b? 828 00:52:39,020 --> 00:52:44,570 See üks on natuke rohkem kaasatud, sest nüüd, mis on? See on 123. 829 00:52:44,570 --> 00:52:50,220 Nii * on kus? Parem, kui ma olin varem. Nii et mine sinna. Okei. 830 00:52:50,220 --> 00:52:53,420 Nüüd lõpuks, ja siis lõpuks see hakkab mõtet, loodetavasti 831 00:52:53,420 --> 00:53:00,280 * B tähendab, mis see B? 124. Nii et ma pean sinna minema, mis on 2. 832 00:53:00,280 --> 00:53:03,430 Mida ma panen siis kus? 833 00:53:03,430 --> 00:53:10,100 2 läheb siia, sest * b läheb *. Nii et ma teen seda. 834 00:53:10,100 --> 00:53:13,120 Ja sa võid juba näha, võib-olla, et me oleme nii palju lähemal 835 00:53:13,120 --> 00:53:17,710 lahendada see loll, lihtne probleem õigesti esimest korda 836 00:53:17,710 --> 00:53:20,920 sest nüüd on meil veel mälestus, mis x oli, 837 00:53:20,920 --> 00:53:23,230 meil on 2 eksemplari küll, y, 838 00:53:23,230 --> 00:53:25,850 kuid rida 3 nüüd ütleb * b. 839 00:53:25,850 --> 00:53:31,080 Nii et siin on b. * B vahenditega sinna minna. Nii et kui on asukoht 124? 840 00:53:31,080 --> 00:53:35,560 See on ilmselt siin. Mida ma küll siia paneme? Ilmselt tmp. 841 00:53:35,560 --> 00:53:39,600 Nii et nüüd ma teen seda. Nii et mul on 1 siin ja 2 siin. 842 00:53:39,600 --> 00:53:43,560 Ja nüüd, mida see kõik, 123, 124, ja 1? 843 00:53:43,560 --> 00:53:47,910 Niipea kui swap naaseb, seda mälu on sama hea kui kadunud 844 00:53:47,910 --> 00:53:51,070 sest niipea kui swap naaseb, operatsioonisüsteemi 845 00:53:51,070 --> 00:53:54,190 on tasuta kasutada, et mälu tulevikus uuesti. 846 00:53:54,190 --> 00:53:58,870 Ainult peamine mällu allosas see nn korstna pulgad ümber. 847 00:53:58,870 --> 00:54:01,470 >> Ja nii me lõpuks ometi nüüd tööversioon. 848 00:54:01,470 --> 00:54:06,310 Lubage mul minna swap.c ja märkate järgmist. 849 00:54:06,310 --> 00:54:11,280 Ülaosas programmi ma muutsin prototüüp tuleb int * ja int * b. 850 00:54:11,280 --> 00:54:15,000 Nii et ainus asi, mida ma muuta minna punane, mis oli halb, et roheline, mis on hea, 851 00:54:15,000 --> 00:54:17,350 on Lisasin need tähed täna. 852 00:54:17,350 --> 00:54:21,520 Aga siis siia alla vahetada ise pidin kopeerida, kleepida, mis oli lihtsalt slaidil. 853 00:54:21,520 --> 00:54:24,140 Mul on täht siin, star siin - mis sobib prototüüp - 854 00:54:24,140 --> 00:54:27,930 ja siis kõik need asjad on nüüd tähte välja arvatud tmp 855 00:54:27,930 --> 00:54:30,680 sest kasutada ajutise muutuja, pole midagi uut. 856 00:54:30,680 --> 00:54:33,040 Ma pean lihtsalt ajutine ladustamine int. 857 00:54:33,040 --> 00:54:34,820 Nii et me ei pea täht seal. 858 00:54:34,820 --> 00:54:39,310 Me peame lihtsalt täht, et saaksime piiriülese selline meelevaldne piir 859 00:54:39,310 --> 00:54:42,900 vahel need 2 kaadrit minu arvuti mällu. 860 00:54:42,900 --> 00:54:45,630 Aga üks asi on muuta, ja sa võisid glimpsed juba. 861 00:54:45,630 --> 00:54:48,810 Mida muud on, ilmselt on nüüd muutunud? >> [Üliõpilane] ja x. 862 00:54:48,810 --> 00:54:53,270 >> Jah, nii 25 on viimane rida koodi mul on vaja muuta see töötaks. 863 00:54:53,270 --> 00:54:58,360 Nädal tagasi ja isegi esmaspäeval rida 25 nägi välja selline, swap x ja y, 864 00:54:58,360 --> 00:55:02,020 ja see oli lihtsalt katki, sest kui sa ütled swap (x, y) 865 00:55:02,020 --> 00:55:05,660 Lubate eksemplari x ja y vahetada, siis ta teeb oma asja, 866 00:55:05,660 --> 00:55:09,080 kuid sa kunagi tõepoolest muutub x ja y ise. 867 00:55:09,080 --> 00:55:12,880 Nii et isegi kui sa pole kunagi näinud seda ette sümbol koos ampersand kodeeritud, 868 00:55:12,880 --> 00:55:15,860 võtke lihtsalt oletus. Mis ampersand teha, ilmselt? 869 00:55:15,860 --> 00:55:17,890 [Üliõpilane] võtab aadress. >> Võtab aadress. 870 00:55:17,890 --> 00:55:21,160 Nii-märk ütleb mulle aadressi x. 871 00:55:21,160 --> 00:55:25,590 Kes teab, kus see on? See juhtub olema 123. Mind ei huvita. Lihtsalt anna mulle aadress x. 872 00:55:25,590 --> 00:55:28,340 Ja y tähendab, anna mulle aadress y. 873 00:55:28,340 --> 00:55:34,450 Ja sel hetkel lugu on täiesti kooskõlas pilt me ​​juhtis hetk tagasi. 874 00:55:34,450 --> 00:55:38,310 >> Nii et ma tunnistama suunanäitajaks, kindlasti minu jaoks kui ma alustasin õppimist see, 875 00:55:38,310 --> 00:55:40,570 olid kindlasti üks raskemaid asju pakkima minu meelest ümber. 876 00:55:40,570 --> 00:55:43,760 Aga aru, eriti kui me hoiame mängides selliseid asju, 877 00:55:43,760 --> 00:55:48,030 kui sa jaotada see, et need super lihtne omamoodi intellektuaalselt ebahuvitav probleeme 878 00:55:48,030 --> 00:55:52,270 vaid liigub numbrid ümber, vastus palju segadust viiteid 879 00:55:52,270 --> 00:55:56,590 tõesti saab nendest saadud väga lihtne mehaanika. 880 00:55:56,590 --> 00:55:59,070 Siin on aadress. Mine sinna, kus täht. 881 00:55:59,070 --> 00:56:03,830 Või vastupidi, siin on märk. Joonis välja, mida aadressi tegelikult on. 882 00:56:03,830 --> 00:56:06,270 Hea küll. 883 00:56:06,270 --> 00:56:09,000 Nii et kui on kõik see mälu tuleb? 884 00:56:09,000 --> 00:56:12,360 Oleme juhtinud seda pilti paar korda ja ma hoida paljutõotav me tuleme tagasi selle, 885 00:56:12,360 --> 00:56:14,920 kuid siin on esindatud arvuti mälu 886 00:56:14,920 --> 00:56:17,420 mis on veidi rohkem märgistatud kui meie kriiditahvel on siin. 887 00:56:17,420 --> 00:56:21,590 Tekstiosa tipus näitab, mida seoses oma programmi? 888 00:56:21,590 --> 00:56:26,090 [Kuuldamatu õpilase vastus] >> Vabandust? Ütle uuesti. 889 00:56:26,090 --> 00:56:28,660 [Üliõpilane] tegelik programm. >> Tegelik programm. 890 00:56:28,660 --> 00:56:32,430 >> Nii et 0. ja 1s et olete koostanud pärast kirjutamist C koodi ja siis töötab rõkkama 891 00:56:32,430 --> 00:56:35,910 ja teeniva 0. ja 1s otsad käsile tõmmatud seal mälu 892 00:56:35,910 --> 00:56:38,570 sest kui te topeltklõps ikoonil Mac või PC 893 00:56:38,570 --> 00:56:43,010 või käivita käsuga nagu Mario oma kiire, teie 0. ja 1s kettalt 894 00:56:43,010 --> 00:56:45,700 saada laaditakse mällu, nii et arvuti saab manipuleerida neid 895 00:56:45,700 --> 00:56:47,540 ja täidab neid kiiremini. 896 00:56:47,540 --> 00:56:50,880 Nii käivitub andmed ja uninitialized andmed, siis me ei räägi palju neid, 897 00:56:50,880 --> 00:56:52,420 kuid need on vaid globaalsed muutujad. 898 00:56:52,420 --> 00:56:54,710 Käivitub tähendab globaalsed muutujad, mis sa andsid väärtused; 899 00:56:54,710 --> 00:56:59,300 uninitialized tähendab globaalsed muutujad, et sa ei anna veel väärtusi. 900 00:56:59,300 --> 00:57:01,900 Siis on need keskkonnamuutujaid mis ma täiesti siputan kätt, 901 00:57:01,900 --> 00:57:04,860 kuid nad on olemas ja et kauplustes asjad oma kasutajanime 902 00:57:04,860 --> 00:57:08,090 ja muud sorti madalama taseme üksikasju. 903 00:57:08,090 --> 00:57:12,880 Aga juiciest tükki oma mälu kujunduse on see asi, mida nimetatakse korstnat ja hunnik. 904 00:57:12,880 --> 00:57:17,470 Stack jälle, et oleks selge, on mälu, mida kasutatakse siis, kui ülesandeid kutsutakse, 905 00:57:17,470 --> 00:57:19,710 kui on kohalike muutujate 906 00:57:19,710 --> 00:57:22,120 ja kui on parameetrid on möödas umbes. 907 00:57:22,120 --> 00:57:24,490 Kõik see juhtub pinu. 908 00:57:24,490 --> 00:57:29,570 Hunnik me ei rääkinud, kuid teen oletuse, kes kasutab hunnik. 909 00:57:31,120 --> 00:57:32,690 Lihtsalt erinevad patakas mälu. 910 00:57:32,690 --> 00:57:36,620 See juhtub tuleb tõdeda tipus, kuid see on meelevaldne pildiline konventsiooni. 911 00:57:36,620 --> 00:57:41,670 Kes ilmselt kasutanud mälu hunnik nädalaid? 912 00:57:41,670 --> 00:57:44,830 See on tehniliselt sa vaid kaudselt. >> [Üliõpilane] getString. 913 00:57:44,830 --> 00:57:47,950 GetString ja malloc. Nii et siin on põhimõtteline erinevus. 914 00:57:47,950 --> 00:57:51,300 >> Sa tead, et viimase paari nädala jooksul, et kui teil on vaja mälu, lihtsalt kuulutada muutuja. 915 00:57:51,300 --> 00:57:54,560 Kui teil on vaja palju mälu deklareerida massiivi õigus sees oma funktsioon. 916 00:57:54,560 --> 00:57:59,620 Aga probleem meil hoida silmitsi on, kui te deklareerite muutujad kohapeal sees funktsioone, 917 00:57:59,620 --> 00:58:05,340 niipea kui tagastab funktsioon, mis juhtub mälu ja need muutujad? 918 00:58:05,340 --> 00:58:09,620 Lihtsalt mingi see ei ole enam sinu oma, eks? See lihtsalt kaob mingi kontseptuaalselt. 919 00:58:09,620 --> 00:58:13,950 See on ikka füüsiliselt olemas, muidugi, kuid see ei ole enam teie õigus kasutada. 920 00:58:13,950 --> 00:58:17,160 See on muidugi problemaatiline, kui soovite kirjutada funktsioonid elu 921 00:58:17,160 --> 00:58:20,440 et tegelikult mälu eraldada ja ei anna seda tagasi kohe. 922 00:58:20,440 --> 00:58:24,180 Kohtuasi punktis: getString oma eesmärk elus on, ei tea ette 923 00:58:24,180 --> 00:58:26,390 kui suur on string ma lähen tüüp AT klaviatuur, 924 00:58:26,390 --> 00:58:30,390 aga see ju olema võimalik mälu eraldada hoida David või tere 925 00:58:30,390 --> 00:58:32,860 või terve essee, et kasutaja oleks võinud kirjutada logida 926 00:58:32,860 --> 00:58:35,280 Nii getString on kasutanud malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc seetõttu tuleb kasutada mitte korstna; 928 00:58:38,910 --> 00:58:40,770 selle asemel, et see kasutab see asi nimega hunnik. 929 00:58:40,770 --> 00:58:44,430 On midagi muutunud mälu. See ei ole kiirem või aeglasem või midagi sellist. 930 00:58:44,430 --> 00:58:46,570 See on lihtsalt füüsiliselt teises kohas. 931 00:58:46,570 --> 00:58:50,120 >> Aga reegel on, et mälu, mis on jaotatud hunnik 932 00:58:50,120 --> 00:58:56,180 kunagi ära võtta, kuni te helistada - Take A Guess - tasuta. 933 00:58:56,180 --> 00:59:00,510 Vastupidi, iga mälu te küsite kohta virna lihtsalt välja kuulutades massiivi 934 00:59:00,510 --> 00:59:03,320 või deklareerib muutuja nagu me oleme seda teinud mitu nädalat, 935 00:59:03,320 --> 00:59:05,640 et vaikimisi jõuab pinu. 936 00:59:05,640 --> 00:59:09,550 Ja see töötab suurepäraselt 90% ajast, kuid nende haruldasemate korda 937 00:59:09,550 --> 00:59:12,470 kuhu soovite mälu eraldada ja hoida seda ümber, 938 00:59:12,470 --> 00:59:14,730 siis peate kasutama funktsiooni nagu malloc. 939 00:59:14,730 --> 00:59:19,370 Või oleme kasutanud funktsioon nagu getString, mis omakorda kasutab malloc. 940 00:59:19,370 --> 00:59:23,300 Vaatame, kus see võib murda ja siis kurkistaa Binky. 941 00:59:23,300 --> 00:59:25,820 Me tuleme tagasi, et ka tulevikus. 942 00:59:25,820 --> 00:59:29,270 Siin on super lihtne programm, et esimesed 2 rida teeb? 943 00:59:29,270 --> 00:59:33,460 Inglise keeles, mida need esimesed 2 rida koodi teha sees peamine? 944 00:59:33,460 --> 00:59:35,600 [Kuuldamatu õpilase vastus] 945 00:59:35,600 --> 00:59:37,880 Hoolikas. See ei anna mulle aadress x või y. 946 00:59:37,880 --> 00:59:41,840 [Üliõpilane] annab vihjeid ints. >> Hea. Andke mulle 2 suunanäitajaks täisühikuteni. 947 00:59:41,840 --> 00:59:45,130 Teisisõnu, anna mulle 2 mäluhulka et ma hoida joonistus täna, 948 00:59:45,130 --> 00:59:46,950 kuigi ma kustutada see nüüd, kui ruutu. 949 00:59:46,950 --> 00:59:50,000 Andke mulle 2 mäluhulka üks nn x, üks nn y - 950 00:59:50,000 --> 00:59:54,320 varem ma helistasin neile s ja t - ja mis tüüpi, et patakas mälu? 951 00:59:54,320 --> 00:59:57,160 See saab salvestada aadress. 952 00:59:57,160 --> 00:59:59,110 See on tüüpi int *. 953 00:59:59,110 --> 01:00:01,630 >> Nii aadress int lõpuks elab x, 954 01:00:01,630 --> 01:00:03,860 aadress int lõpuks elab y, 955 01:00:03,860 --> 01:00:08,460 kuid esialgu, mis seal sees on x ja y? Kes teab? Prügi väärtused. 956 01:00:08,460 --> 01:00:10,180 See on midagi pistmist suunanäitajaks. 957 01:00:10,180 --> 01:00:12,720 Kui me ei ole panna midagi seal, kes teab, mis on tegelikult olemas? 958 01:00:12,720 --> 01:00:18,950 Nüüd, x. Mis siin toimub? See on legit nüüd, sest x on osuti. See on int *. 959 01:00:18,950 --> 01:00:21,870 Nii et see tähendab ma saan panna x-aadress mõned patakas mälu. 960 01:00:21,870 --> 01:00:25,120 Mis malloc tagasi? Täiuslik, tagastab aadressid, 961 01:00:25,120 --> 01:00:28,510 aadress Esimene bait on kogu patakas mälu. 962 01:00:28,510 --> 01:00:31,140 Mitu baiti on see ilmselt eraldatakse, näiteks see, et seadet? 963 01:00:31,140 --> 01:00:33,510 Mis suurus int? 4. 964 01:00:33,510 --> 01:00:36,600 Kui te arvate tagasi 1. nädal, see pole super oluline alati meeles pidada, et 965 01:00:36,600 --> 01:00:38,870 kuid sel juhul on kasulik teada, 4 baiti. 966 01:00:38,870 --> 01:00:41,770 Nii et see eraldab kohta hunnik 4 baiti 967 01:00:41,770 --> 01:00:46,110 ja see on tagastades aadress esimene, kes mind meelevaldselt. 968 01:00:46,110 --> 01:00:47,700 Nüüd, mis on x teed? 969 01:00:47,700 --> 01:00:52,200 * X = 42 teeb mida? 970 01:00:52,200 --> 01:00:57,150 Kui siinkohal lugu on meil x, mis näeb välja nagu seda mõned prügi väärtus, 971 01:00:57,150 --> 01:01:04,120 see on nüüd y mõned prügi raha, nüüd rida 3. Olen eraldatud 4 baiti. 972 01:01:04,120 --> 01:01:06,950 See pilt sisuliselt näeb välja selline. 973 01:01:06,950 --> 01:01:12,010 Või täpsemalt, kui see on meelevaldne aadress 123, see on see, mida meie lugu nüüd välja näeb. 974 01:01:12,010 --> 01:01:23,940 * X = 42 tähendab nüüd mida? See tähendab minna aadress 123 ja pane number 42 seal. 975 01:01:23,940 --> 01:01:26,220 Ma ei vaja juhtida need read, sest me ei tee stringid. 976 01:01:26,220 --> 01:01:29,480 >> Ma oleksin pidanud lihtsalt kirjutada seda niimoodi, ja lihtsalt demonstreerimiseks pärast, 977 01:01:29,480 --> 01:01:33,240 42 Nagu int tüüpi kulub palju ruumi, 4 baiti. 978 01:01:33,240 --> 01:01:35,960 Nii et see, mis juhtus seal, kuid seal on probleem nüüd. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Mis juhtub siin? 980 01:01:40,580 --> 01:01:46,470 Probleem on * y meie lihtsustatud maailmas tähendab lihtsalt minna aadressile y. 981 01:01:46,470 --> 01:01:48,590 Mis on y? See on mingi prügi väärtus. 982 01:01:48,590 --> 01:01:53,150 Nii oletame, et prügi väärtus on 5551212, midagi hullu niimoodi. 983 01:01:53,150 --> 01:01:56,750 * Y mingil juhul minna lahendada 5551212. 984 01:01:56,750 --> 01:02:00,450 See on nagu siin. Seda ei ole olemas, näiteks. 985 01:02:00,450 --> 01:02:05,310 Nii * y saab 13 tähenduses Püüan teha 13 siin. Seda ei ole olemas. 986 01:02:05,310 --> 01:02:08,790 Olen ületanud segment tahvli. Mida ma saan? 987 01:02:08,790 --> 01:02:14,930 See krüpteeritud sõnum killustatust süü, sest ma üritan panna mälu 988 01:02:14,930 --> 01:02:19,470 väärtus nagu 13 kohas, mida ei eksisteeri. 989 01:02:19,470 --> 01:02:23,900 Ülejäänud programmi võiks töötada okei, aga kuni selle punkti see ei ole. 990 01:02:23,900 --> 01:02:25,350 Nii et proovime jutustada lugu. 991 01:02:25,350 --> 01:02:27,830 Me tuleme tagasi, et kui me rääkisime hex. 992 01:02:27,830 --> 01:02:30,290 Lähme tagasi selle ja sõlmida see asi nimega Binky, 993 01:02:30,290 --> 01:02:33,710 mis meenutavad on Stanfordi professor istub kodus mängides claymation, 994 01:02:33,710 --> 01:02:36,380 öelda lugu täpselt seda sama programmi. 995 01:02:36,380 --> 01:02:40,580 See on lihtsalt umbes 3 minutit pikk. Siin on meil Binky. 996 01:02:40,580 --> 01:02:45,030 [Mees kõneleja video] Hei Binky, ärka üles. On aeg osuti lõbus. 997 01:02:45,030 --> 01:02:50,080 [Binky] Mis see on? Lugege vihjeid? Oi kui tore! 998 01:02:50,080 --> 01:02:53,700 [Mees kõneleja] Noh, alustada, ma arvan, et me lähed vaja paar suunanäitajaks. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Okei. See kood suurusega 2 suunanäitajaks, mis võib tuua täisarvud. 1000 01:02:57,890 --> 01:03:02,220 [Mees kõneleja] Okei. Noh, ma näen 2 suunanäitajaks, kuid nad ei tundu olevat osutades midagi. 1001 01:03:02,220 --> 01:03:05,550 [Binky] Just nii. Esialgu vihjeid ei viita midagi. 1002 01:03:05,550 --> 01:03:09,270 Asjad viitavad need kutsutakse pointees, ja milles nad üles on eraldi etapis. 1003 01:03:09,270 --> 01:03:12,330 [Mees kõneleja] Oh, ja õigusega. Ma teadsin seda. Pointees eraldi. 1004 01:03:12,330 --> 01:03:15,630 Er, siis kuidas sa jaotada pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Okei. See kood eraldab uus täisarv pointee, ja see osa sätestab x juhtida sellele. 1006 01:03:21,510 --> 01:03:23,500 [Mees kõneleja] Kuule, see näeb parem välja. 1007 01:03:23,500 --> 01:03:26,030 Nii et see midagi. >> [Binky] Okei. 1008 01:03:26,030 --> 01:03:30,300 Tulen dereference osuti x salvestada number 42. viimiseks pointee. 1009 01:03:30,300 --> 01:03:34,410 Seda trikki ma vajan oma võlukeppi ning viite mahavõtmine. 1010 01:03:34,410 --> 01:03:38,610 [Mees kõneleja] Sinu võlukepp on viite mahavõtmine? See on tore. 1011 01:03:38,610 --> 01:03:44,230 [Binky] Seda koodi välja näeb. Ma lihtsalt loodud mitmeid ja ... [Pauku] 1012 01:03:44,230 --> 01:03:46,100 [Mees kõneleja] Hei vaata, seal ta läheb. 1013 01:03:46,100 --> 01:03:50,990 Seejuures dereference kohta x järgmiselt nool juurdepääsu oma pointee, 1014 01:03:50,990 --> 01:03:53,230 sel juhul salvestada 42 seal. 1015 01:03:53,230 --> 01:03:57,630 Hei, proovige see salvestada number 13 läbi teise osuti, y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Okei. Ma lähen siia, et y ja saada number 13 moodustatud 1017 01:04:03,250 --> 01:04:08,360 ja siis võtta võlukepp kohta viite mahavõtmine ja lihtsalt ... [Sumin heli] Vau! 1018 01:04:08,360 --> 01:04:10,980 [Mees kõneleja] Oh hei, mis ei tööta. 1019 01:04:10,980 --> 01:04:14,870 >> Ütle, Binky, ma ei usu viite mahavõtmine y on hea idee 1020 01:04:14,870 --> 01:04:17,880 sest loomise pointee on eraldi etapis 1021 01:04:17,880 --> 01:04:19,850 ja ma ei usu me kunagi tegime seda. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, hea punkt. 1023 01:04:21,770 --> 01:04:26,640 [Mees kõneleja] Jah. Me eraldatud kursor y kuid me ei sea see käsk pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, väga tähelepanelik. 1025 01:04:28,780 --> 01:04:30,690 [Mees kõneleja] Hei, sa näed hea välja seal, Binky. 1026 01:04:30,690 --> 01:04:34,160 Kas sa seda parandada nii, et y osutab sama pointee kui x? >> [Binky] Muidugi. 1027 01:04:34,160 --> 01:04:37,100 Ma kasutan oma võlukeppi ning osuti loovutamisega. 1028 01:04:37,100 --> 01:04:39,070 [Mees kõneleja] Kas see saab olema probleem nagu enne? 1029 01:04:39,070 --> 01:04:40,840 [Binky] Ei, see ei puutu pointees. 1030 01:04:40,840 --> 01:04:44,780 See lihtsalt muutub üks osuti osutada sama asi nagu teine. [Pauku] 1031 01:04:44,780 --> 01:04:48,570 [Mees kõneleja] Oh, ma näen. Nüüd y viitab samas kohas kui x. 1032 01:04:48,570 --> 01:04:51,140 Nii et oota. Nüüd y on fikseeritud. See on pointee. 1033 01:04:51,140 --> 01:04:54,520 Nii et võite proovida võlukepp kohta viite mahavõtmine uuesti saata 13 üle. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Ee, okei. Siin läheb. [Pauku] 1035 01:04:58,130 --> 01:05:01,250 [Mees kõneleja] Hei, vaata seda. Nüüd viite mahavõtmine töötab y. 1036 01:05:01,250 --> 01:05:05,200 Ja kuna viiteid jagavad, et üks pointee, nad mõlemad vt 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Jah, jagamine. Mida iganes. 1038 01:05:06,910 --> 01:05:08,880 >> Nii me siis vahetada kohad nüüd? 1039 01:05:08,880 --> 01:05:11,420 [Mees kõneleja] Oh, vaata, meil aeg otsa saama. >> [Binky] Aga - 1040 01:05:11,420 --> 01:05:13,880 [Mees kõneleja] Pea meeles, 3 pointer eeskirju. 1041 01:05:13,880 --> 01:05:18,630 Number 1, põhistruktuur on see, et teil on osuti ja see toob üle pointee. 1042 01:05:18,630 --> 01:05:23,120 Aga osuti ja pointee on eraldi, ja levinud viga on loodud pointer 1043 01:05:23,120 --> 01:05:25,680 aga unustada, et anda sellele pointee. 1044 01:05:25,680 --> 01:05:29,580 Number 2, osuti viite mahavõtmine algab osuti ja järgis nool üle 1045 01:05:29,580 --> 01:05:31,060 juurdepääsu oma pointee. 1046 01:05:31,060 --> 01:05:34,340 Nagu me kõik teame, see töötab ainult siis kui on pointee, 1047 01:05:34,340 --> 01:05:36,460 millist saab tagasi Reegel number 1. 1048 01:05:36,460 --> 01:05:39,870 Number 3, osuti loovutamise kulub üks osuti ja muudab selle 1049 01:05:39,870 --> 01:05:42,390 osutada sama pointee teise osuti. 1050 01:05:42,390 --> 01:05:45,890 Nii et pärast üleminekut, 2 suunanäitajaks toob välja sama pointee. 1051 01:05:45,890 --> 01:05:47,800 Vahel kutsutakse seda jagada. 1052 01:05:47,800 --> 01:05:50,910 >> Ja see kõik on seda tõesti. Hüvasti nüüd. 1053 01:05:50,910 --> 01:05:55,840 See on Binky. See on CS50. Näeme järgmisel nädalal. [Aplaus] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]