1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Viikko 4, jatkuu] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Harvardin yliopisto] 3 00:00:04,240 --> 00:00:07,290 [Tämä on CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> Tämä on CS50, ja tämä on loppuun viikon 4. 5 00:00:11,290 --> 00:00:14,030 Joten hyviä uutisia ja huonoja uutisia. 6 00:00:14,030 --> 00:00:26,240 Ei luento maanantaina, no problem asettaa ensi viikolla. [Opiskelijat hurraavat] 7 00:00:26,240 --> 00:00:28,680 Et tule pitämään mihin tämä on menossa. 8 00:00:28,680 --> 00:00:31,590 Mutta meillä on tämä sen sijaan ensi keskiviikkona, 9 00:00:31,590 --> 00:00:37,740 ja siellä on myös kohti oppimäärän 1 Perjantaina luento ensi perjantaina, jotta voimme pysyä tiellä. 10 00:00:37,740 --> 00:00:40,580 Mutta kaikki on kuvattu tavalliseen tapaan, joten ei hätää. 11 00:00:40,580 --> 00:00:44,100 >> Ja ottaa huomioon tietovisa 0 teemme näin kohti viikon loppua 12 00:00:44,100 --> 00:00:47,140 on lähettää kurssin kotisivulla cs50.net selitys 13 00:00:47,140 --> 00:00:50,160 millaisen odotuksia sinulla pitäisi olla, kun se tulee ensimmäiseen Quiz. 14 00:00:50,160 --> 00:00:55,100 Yleensä se on monivalinta, tosi-epätosi, lyhyt vastaus, lyhyt koodaus ongelmia. 15 00:00:55,100 --> 00:00:57,360 Et aio odotettavissa toteuttamaan vastaavia 16 00:00:57,360 --> 00:01:00,030 ongelma, että sinulla olisi nähdä PSET, joihin sinulla on tietokone 17 00:01:00,030 --> 00:01:03,240 ja debuggeri ja vastaavat, mutta tulee olemaan pieni koodaus ongelmia. 18 00:01:03,240 --> 00:01:06,900 >> Ja todellakin, paras opas saada tunteen siitä, mitä CS50 tietokilpailuja ovat kuin 19 00:01:06,900 --> 00:01:09,180 on mennä cs50.net, siirry Tietokilpailut linkin, 20 00:01:09,180 --> 00:01:11,920 ja näet aiemmin useita vuosia arvoinen tietokilpailuja. 21 00:01:11,920 --> 00:01:16,600 Vain ymmärtää, että opetussuunnitelma ei ole aina ollut sama vuosien. 22 00:01:16,600 --> 00:01:18,510 Joskus lisäämme, joskus vähentää, 23 00:01:18,510 --> 00:01:20,670 joten jos näet joitakin aiheeseen yksi niistä vanhan tietokilpailuja 24 00:01:20,670 --> 00:01:25,380 että sinulla ei ole aavistustakaan, mitä se puhuu, se on joko että emme peitä se 25 00:01:25,380 --> 00:01:27,210 tai että emme peitä sitä. 26 00:01:27,210 --> 00:01:31,110 Mutta muodossa arvion, sunnuntaina, maanantaina ja tiistaina 27 00:01:31,110 --> 00:01:34,770 sekä kurssin laajuinen katsaus istunnossaan sunnuntai-iltana - 28 00:01:34,770 --> 00:01:37,500 aika ja paikka ilmoitetaan kurssin kotisivulla - 29 00:01:37,500 --> 00:01:40,120 teillä kaikilla on mahdollisuus kerrata kurssin opetuksen kaverit 30 00:01:40,120 --> 00:01:44,830 materiaalia tänä vuonna, niin osassa ja koko luokka, 31 00:01:44,830 --> 00:01:48,400 ja ne tullaan filmattu normaalisti samoin. 32 00:01:48,400 --> 00:01:53,380 >> Selvä. Joten pitemmittä puheitta, yhden kommentin hyväksytty / hylätty ja lisää / pudota. 33 00:01:53,380 --> 00:01:57,980 Olet ehkä nähnyt muistiinpanoja viime yönä, ja tämä on oikeastaan ​​vain joitakin ylimääräisiä rauhoittaa 34 00:01:57,980 --> 00:02:01,250 että jos olet yksi niistä, erityisesti vähemmän mukavaa tai jotakin siltä väliltä 35 00:02:01,250 --> 00:02:04,870 ja et tunne vain hieman yli pään, 36 00:02:04,870 --> 00:02:08,430 ymmärtää, että on todellakin aivan normaalia, ja siellä on runsaasti tukirakenne paikallaan, 37 00:02:08,430 --> 00:02:13,530 joista yksi virka oli aikomus parantaa sitäkin kohden sähköpostiini viime yönä, 38 00:02:13,530 --> 00:02:16,520 ja ymmärtää myös, että vaihtoehto kuin hyväksytty / hylätty ja luokkaan näin 39 00:02:16,520 --> 00:02:21,540 todella on tarkoitus olla mekanismi ottaa reunaan pois tietenkin näin, 40 00:02:21,540 --> 00:02:24,200 joten uudelleen, jos olet menoja nuo 10, 15, 20 tuntia 41 00:02:24,200 --> 00:02:28,160 vain yrittää saada joitakin PSET töihin ja tiedät 90-95% miten siellä 42 00:02:28,160 --> 00:02:32,100 mutta et löydä joitakin pirun bug, on hyväksytty / hylätty malli on eräänlainen kunnossa. 43 00:02:32,100 --> 00:02:36,230 >> Ajatuksena on, että tämä mekanismi voi sitten mennä keskittyä teidän muiden psets 44 00:02:36,230 --> 00:02:39,530 tai nukkua tai mitä se on, että haluat keskittyä. 45 00:02:39,530 --> 00:02:43,390 Joten ymmärtää, että sinulla on vasta ensi tiistaina - teknisesti 5. maanantaina 46 00:02:43,390 --> 00:02:50,840 mutta se on loma, joten tuleva tiistai - siirtyä hyväksytty / hylätty ja lajitellut tai päinvastoin. 47 00:02:50,840 --> 00:02:54,450 Ja jos olet todella jyrkänteeltä ja ajatellut pudottamalla kokonaan, 48 00:02:54,450 --> 00:02:56,440 ota minut kiinni jälkeen luennon tai pudota minulle huomautuksen. 49 00:02:56,440 --> 00:02:59,990 Haluaisimme ainakin chat ennen tarjouksen hyvästi. 50 00:02:59,990 --> 00:03:03,470 Selvä. Niinpä aloimme ottaa apupyörät pois viime kerralla. 51 00:03:03,470 --> 00:03:06,030 Erityisesti olemme keskittyneet merkkijono. 52 00:03:06,030 --> 00:03:09,740 String on jotain, joka on ilmoitettu CS50 kirjastossa, 53 00:03:09,740 --> 00:03:14,340 nimenomaan kyseisen tiedoston nimeltä cs50.h jonka aloitamme tarkastella tällä ja ensi viikolla. 54 00:03:14,340 --> 00:03:17,250 Mutta merkkijono on oikeastaan ​​vain yksinkertaistamista jotain 55 00:03:17,250 --> 00:03:20,980 se hieman arcanely kuvattu char *. 56 00:03:20,980 --> 00:03:24,090 Char olemme tuttuja. Se on vain yksi merkki. 57 00:03:24,090 --> 00:03:28,010 Mutta * kuin maanantaina merkitään mitä? >> [Opiskelija] osoitin. 58 00:03:28,010 --> 00:03:31,290 Osoitin. Ja mikä osoitin? >> [Opiskelija] osoite. 59 00:03:31,290 --> 00:03:33,420 >> Se on kuin osoite, paikkaan muistissa. 60 00:03:33,420 --> 00:03:35,910 Mikä osoite tai sijainti tai muisti? 61 00:03:35,910 --> 00:03:40,290 Jälleen meillä kaikilla on läppäreissä keikka tai 2 gigatavua RAM todennäköisesti näinä päivinä, 62 00:03:40,290 --> 00:03:44,160 ja se tarkoittaa olet miljardi tai 2000000000 tavua edestä muistia. 63 00:03:44,160 --> 00:03:46,240 Ja se ei ole oikeastaan ​​väliä, mitä se fyysisesti näyttää, 64 00:03:46,240 --> 00:03:51,220 mutta ottavat uskon että voit numeroida kaikki yksittäiset tavut että oma kannettava tietokone on - 65 00:03:51,220 --> 00:03:54,580 tämä on tavu 0, tämä on tavu 1, tämä on tavu 2000000000 - 66 00:03:54,580 --> 00:03:56,100 ja se mitä tietokone tekee. 67 00:03:56,100 --> 00:04:00,030 Kun varata tilaa yksittäisen merkin, esimerkiksi 68 00:04:00,030 --> 00:04:02,480 se kuitenkin elää jonnekin tietokoneen muistiin, 69 00:04:02,480 --> 00:04:05,860 ja ehkä se tavun numero 12345, 70 00:04:05,860 --> 00:04:08,470 ja se on jossain täällä tietokoneen muistiin. 71 00:04:08,470 --> 00:04:12,630 Ja osoite sitten tuon merkin on 12345. 72 00:04:12,630 --> 00:04:16,140 >> Nyt viikolla 0 kautta nyt toistaiseksi, emme ole oikeastaan ​​välittänyt 73 00:04:16,140 --> 00:04:19,170 jos muistissa asiat tallennetaan koska me yleensä käyttää symboleja, 74 00:04:19,170 --> 00:04:22,540 muuttujia, ja taulukot todella saada meidän tietoja. 75 00:04:22,540 --> 00:04:24,950 Mutta maanantaina ja sitäkin tänään, olet nyt menossa on 76 00:04:24,950 --> 00:04:27,710 sitäkin ilmeikäs voimavarojen kirjoittaa ohjelmia 77 00:04:27,710 --> 00:04:31,330 todella manipuloida tietokoneen muistiin kuitenkin parhaaksi näet, 78 00:04:31,330 --> 00:04:33,720 sekä hyvään tarkoitukseen, ja huonoja, 79 00:04:33,720 --> 00:04:39,620 Bugs on hyvin yleinen tulos tässä vaiheessa oppimiseen tätä kamaa. 80 00:04:39,620 --> 00:04:42,460 Mutta mitä se oikeastaan ​​tarkoittaa olla char *? 81 00:04:42,460 --> 00:04:46,140 Mennään eteenpäin takaisin - ja tulemme takaisin Binky kuten luvattiin tänään. 82 00:04:46,140 --> 00:04:48,670 Mennään yksinkertainen esimerkki tästä. 83 00:04:48,670 --> 00:04:53,060 Saanen tallenna tiedosto compare.c, ja haluan vain saada mallin koodia tässä 84 00:04:53,060 --> 00:05:00,490 niin ovat stdio.h, haluan myös antaa itselleni kuuluu cs50.h. Minä zoomata sinne. 85 00:05:00,490 --> 00:05:05,850 Haluaisin aloittaa kirjoittaminen tärkein int, main (void), ja nyt haluan tehdä jotain tällaista: 86 00:05:05,850 --> 00:05:13,520 printf ("Anna minulle merkkijono:") ja sitten aion käyttää string s saa GetString 87 00:05:13,520 --> 00:05:16,750 saada merkkijonon käyttäjä, niin aion kysyä käyttäjältä toiselle. 88 00:05:16,750 --> 00:05:21,870 ("Anna minulle toinen merkkijono:") ja aion pyytää heitä kautta GetString saada se. 89 00:05:21,870 --> 00:05:27,020 Soitan sitä t, koska t tulee jälkeen s ja s on kiva nimi merkkijono, jos se on melko yleinen. 90 00:05:27,020 --> 00:05:30,030 Joten GetString, ja nyt haluan vain tehdä järki tarkistaa, ja aion sanoa 91 00:05:30,030 --> 00:05:39,770 if (s == t) niin olen juuri menossa kertoa käyttäjälle printf ("Kirjoitit saman asian! \ n"); 92 00:05:39,770 --> 00:05:45,520 muuten aion tulostaa jotain ("kirjoitit jotain erilaista! \ n") 93 00:05:45,520 --> 00:05:48,460 tai mikä lause tulee. Eli jotain. 94 00:05:48,460 --> 00:05:52,200 Sitten kuten tavallista, palaan 0 mikä vain tarkoitti, että mitään pahaa ei tapahtunut, 95 00:05:52,200 --> 00:05:54,400 ja aion mennä eteenpäin ja kääntää ja ajaa ohjelman. 96 00:05:54,400 --> 00:05:56,540 >> Mutta maanantaina meillä oli tässä ohjelmassa, 97 00:05:56,540 --> 00:06:00,420 ja todellakin kerrottiin, että HELLO ole Hei ja näkemiin ei hyvästi. 98 00:06:00,420 --> 00:06:03,140 Käyttäytyminen näimme oli hieman enemmän kuin tämän. 99 00:06:03,140 --> 00:06:11,450 Anna minun mennä minun lähde hakemistoon, zoom täällä, ja tehkäämme tee vertailla. 100 00:06:11,450 --> 00:06:14,570 Käännetty kunnossa. Saanen juosta vertailla. Anna merkkijono: HELLO. 101 00:06:14,570 --> 00:06:16,300 Anna minulle toinen merkkijono: HELLO. 102 00:06:16,300 --> 00:06:18,000 Kirjoitit jotain erilaista! 103 00:06:18,000 --> 00:06:22,650 No, minäpä kokeilla jotain yksinkertaisempaa, kuten 50, 50. Kirjoitit jotain erilaista! 104 00:06:22,650 --> 00:06:25,740 Hei, hei. Niin selvästi, mitä on tekeillä. 105 00:06:25,740 --> 00:06:28,440 Mutta mikä oli selitys miksi? 106 00:06:28,440 --> 00:06:33,850 Ilmeisesti, rivi 12 on täysin toimimaton. 107 00:06:34,300 --> 00:06:39,430 Mikä perustavanlaatuinen ongelma täällä? Joo. >> [Opiskelija] Se vertaamalla osoitteet. 108 00:06:39,430 --> 00:06:41,850 Joo, aivan. Se on todella vertaamalla osoitteet 109 00:06:41,850 --> 00:06:44,580 jossa HELLO ja Hello tallennetaan. 110 00:06:44,580 --> 00:06:48,290 Se ei verrata kirjaimia HELLO uudestaan ​​ja uudestaan, 111 00:06:48,290 --> 00:06:52,370 sillä mitä todella tapahtui, kaiken tämän ajan olemme käyttäneet GetString - 112 00:06:52,370 --> 00:06:56,130 Tämä liitutaulu on jälleen meidän tietokoneen muistiin, 113 00:06:56,130 --> 00:07:00,100 ja sanokaamme Kutsun GetString todettuaan muuttujan s. 114 00:07:00,100 --> 00:07:01,930 Mitä minun muisti näyttää? 115 00:07:01,930 --> 00:07:07,070 Oletetaan mielivaltaisesti sanoa, että s näyttää tältä. Se on neliön. 116 00:07:07,070 --> 00:07:09,040 Ja melko paljon tahansa Olen piirtänyt pala muistia ruudulla 117 00:07:09,040 --> 00:07:12,860 jos se on 32 bittiä Olen piirtänyt ruudut näin, koska todellakin laitteen 118 00:07:12,860 --> 00:07:17,380 osoitin, osoite, on 32 bittiä. Se on sama kuin int. 119 00:07:17,380 --> 00:07:19,420 , Joka voi vaihdella perustuen tietokonejärjestelmään. 120 00:07:19,420 --> 00:07:24,630 Ne teistä, jotka ovat etäisesti tuttuja että Mac-tai PC on 64 bittiä, 121 00:07:24,630 --> 00:07:28,120 että todella tarkoittaa, että tietokone käyttää 64-bittisiä osoittimia, 122 00:07:28,120 --> 00:07:33,730 64-bittiset osoitteet, ja joukossa upsides siitä on tietokoneet 123 00:07:33,730 --> 00:07:35,560 voi olla paljon enemmän muistia kuin eilispäivän. 124 00:07:35,560 --> 00:07:39,240 Pitkä tarina lyhyt, takaisin päivän, jolloin tietokoneita käytetään vain 32 bittiä 125 00:07:39,240 --> 00:07:42,740 edustamaan osoitteita, suurin tavujen voisit edustaa 126 00:07:42,740 --> 00:07:46,280 tässä tapauksessa oli mitä jos sinulla on 32 bittiä? 127 00:07:46,280 --> 00:07:49,590 Joten 4000000000, oikea, koska 2-32 on 4 miljardia euroa. 128 00:07:49,590 --> 00:07:51,370 Tämä numero on toistuminen kurssin. 129 00:07:51,370 --> 00:07:55,240 >> Joten jos sinulla on vain 32 bittiä, eniten voit laskea, on noin 4 miljardia euroa. 130 00:07:55,240 --> 00:07:58,750 Mutta se oli perustavanlaatuinen rajoitus tietokoneiden kunnes muutama vuosi sitten 131 00:07:58,750 --> 00:08:01,180 koska jos voit vain laskea jopa 4 miljardia euroa, 132 00:08:01,180 --> 00:08:05,270 sillä ei ole väliä, jos ostat 8 gigatavua RAM-muistia tai jopa 5 gigatavua RAM-muistia; 133 00:08:05,270 --> 00:08:07,780 et voi luottaa, että korkea, joten se oli hyödytön. 134 00:08:07,780 --> 00:08:11,430 Voisit vain saada ensimmäiset 3 tai 4 gigatavua tietokoneen muistiin. 135 00:08:11,430 --> 00:08:14,410 Se pienempi ongelma nyt, ja voit ostaa MacBook Pro ja Dells 136 00:08:14,410 --> 00:08:17,680 jossa 8 gigatavua RAM-muistia tai jopa enemmän näinä päivinä. 137 00:08:17,680 --> 00:08:24,100 Mutta jos minä jakaa yksinkertaisesti tässä ohjelmassa osoitin, osoitin nimeltään s, 138 00:08:24,100 --> 00:08:28,370 Se voisi näyttää tältä ruudulla koska todellakin meidän kuori takaisin tähän kerrokseen. 139 00:08:28,370 --> 00:08:33,520 Minä pitää sanoa merkkijonon, mutta maanantaina merkkijono on todella char *, 140 00:08:33,520 --> 00:08:35,590 osoite jokin merkki. 141 00:08:35,590 --> 00:08:39,280 Joten sallikaa että koulutus pyörä pois vaikka jatkamme käyttää GetString nyt. 142 00:08:39,280 --> 00:08:42,600 Joten olen ilmoitettu s, ja tämä on kimpale muistin, 32 bittiä. 143 00:08:42,600 --> 00:08:47,370 Mitä täällä muistissa oletuksena? >> [Äänetön opiskelijan vastausta] 144 00:08:47,370 --> 00:08:50,040 Mikä tuo on? >> [Opiskelija] Garbage. >> Garbage. Aivan. 145 00:08:50,040 --> 00:08:54,610 Jos ohjelmoija ei laita arvoa muuttujan, joka tietää, mitä se on? 146 00:08:54,610 --> 00:08:57,990 Joskus olet onnekas ja se on 0, mikä on tavallaan mukavaa, puhdas oletusarvo, 147 00:08:57,990 --> 00:09:00,310 mutta kuten näimme maanantaina joskus se on täysin järjetöntä, 148 00:09:00,310 --> 00:09:04,130 joitakin todella suuri positiivinen tai negatiivinen luku, jotka tulivat mistä? 149 00:09:05,350 --> 00:09:07,010 Joo. >> [Opiskelija] toiminto ennen. >> Joo. 150 00:09:07,010 --> 00:09:10,170 >> Usein funktio, joka sai kutsutaan ennen, sillä muistan, 151 00:09:10,170 --> 00:09:13,920 kuin soitat toiminnot muistiin, ne vievät enemmän tilaa alhaalta ylöspäin, 152 00:09:13,920 --> 00:09:17,040 ja heti kun toiminto palaa, että muisti saa käyttää uudelleen 153 00:09:17,040 --> 00:09:20,890 jonka seuraava kaveri, joka saa kutsutaan, joka käyttämällä samaa siivu muistia. 154 00:09:20,890 --> 00:09:23,450 Ja jos olet jättänyt roskat siellä, aiemmat arvot, 155 00:09:23,450 --> 00:09:28,190 voisimme luulla s olevan jotain arvoa, kun todellakaan emme ole laittanut mitään sinne. 156 00:09:28,190 --> 00:09:30,960 Joten meidän RAM tässä vaiheessa näyttää tältä. 157 00:09:30,960 --> 00:09:36,030 Nyt oikealla puolella linjan 7 olemme vaaditaan GetString, 158 00:09:36,030 --> 00:09:40,150 jonka olemme tehneet nyt viikkoja, mutta mitä GetString oikeasti tekee? 159 00:09:40,150 --> 00:09:43,350 GetString kirjoittaneet CS50 henkilökunta on hieman älykäs 160 00:09:43,350 --> 00:09:46,500 siitä, että heti kun käyttäjä alkaa kirjoittaa avaimet ja osumia Enter, 161 00:09:46,500 --> 00:09:50,010 GetString lukuja kuinka monta näppäilyjä tekivät käyttäjän osuma, 162 00:09:50,010 --> 00:09:53,360 kuinka monta merkkiä minun täytyy jakaa RAM. 163 00:09:53,360 --> 00:09:55,660 Ja missä se RAM tulee, kuka tietää? 164 00:09:55,660 --> 00:09:58,930 Se on jossain tietokoneen 2 gigatavua tai vaikka mitä muistia. 165 00:09:58,930 --> 00:10:05,200 Mutta Oletetaan, että tietokone löytyy tilaa sana HELLO täällä. 166 00:10:05,200 --> 00:10:08,710 Sana I kirjoitetaan oli H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 Ja jos vedämme tätä merkkijono, voisimme tehdä sen näin. 168 00:10:13,510 --> 00:10:17,860 Mutta minun täytyy tehdä 1 ylimääräinen juttu. Mitä kuuluu lopussa mikä tahansa merkkijono C? 169 00:10:17,860 --> 00:10:20,710 Nollamerkki, jota kirjoitan \ 0. 170 00:10:20,710 --> 00:10:23,980 Se on teknisesti numero 0, mutta kenoviiva tekee kaikki selkeämpi 171 00:10:23,980 --> 00:10:28,150 , että tämä on kirjaimellisesti numero 0, kokonaisluku 0; 172 00:10:28,150 --> 00:10:32,440 se ei ole, esimerkiksi lainaus-lainaus päättyy 0, että saatat kirjoittaa näppäimistöllä. 173 00:10:32,440 --> 00:10:33,940 Joten tämä on Hello. 174 00:10:33,940 --> 00:10:36,350 >> Ja mitä sanomme maanantaina, että toimivat kuten GetString 175 00:10:36,350 --> 00:10:39,580 todella palauttaa kaikki nämä viikkoa? 176 00:10:39,580 --> 00:10:43,960 Se ei palaa merkkijono sinänsä sillä ei oikeastaan ​​ole siten 177 00:10:43,960 --> 00:10:47,710 koska merkkijonot eivät ole. He tavallaan valmistus on CS50 kirjastossa. 178 00:10:47,710 --> 00:10:51,300 Mikä on todella merkkijono, enemmän teknisesti? >> [Opiskelija] Se on ensimmäinen merkki. 179 00:10:51,300 --> 00:10:55,950 Aivan. Se on yksinkertaisesti osoitteen ensimmäinen merkki siitä, että käyttäjä kirjoitettu sisään 180 00:10:55,950 --> 00:11:02,810 Joten jos minun sanani HELLO päätyy sen tavun numero 123 ja sitten tavu numero 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, ja niin edelleen, jos vain numero minun tavuja 0 ylös, 182 00:11:08,320 --> 00:11:12,650 mitä todella GetString palaa on kirjaimellisesti numero 123. 183 00:11:12,650 --> 00:11:19,270 Joten mitä saa laittaa s on numero 123, ei kirjain H, ei sana HELLO, 184 00:11:19,270 --> 00:11:23,130 yksinkertaisesti osoite, josta löydän ensimmäinen kirjain HELLO. 185 00:11:23,130 --> 00:11:26,500 Mutta se ei tunnu riittävän. Pyysin teitä merkkijonon, ei merkki. 186 00:11:26,500 --> 00:11:32,970 Joten miten me tai tietokoneen tietää, että ELLO sellainen mukana tulevat H? 187 00:11:35,760 --> 00:11:37,460 Mikä on sellainen sopimus olemme? Joo. 188 00:11:37,460 --> 00:11:40,100 [Opiskelija] Se hokee itselleen löytää lisää merkkejä. >> Aivan. 189 00:11:40,100 --> 00:11:44,570 >> On tämä ihmisen ja tietokoneen yleissopimuksen jolloin kun olet tekemisissä jouset, 190 00:11:44,570 --> 00:11:49,410 tunnetaan nyt char tähdet, sinun täytyy vain keksiä 191 00:11:49,410 --> 00:11:54,350 jossa lopussa jokaisen merkkijonon elämässä tapahtuu oikeastaan ​​vain iteroimalla sen yli on silmukka, 192 00:11:54,350 --> 00:11:57,820 while-silmukka, mitä, joten kun löydät merkkijonon loppuun 193 00:11:57,820 --> 00:12:02,160 Nyt voit päätellä, että oi, koko sana oli HELLO. 194 00:12:02,160 --> 00:12:04,820 Ne teistä, joilla on aiemmin kokemusta ohjelmoinnista voi tietää Java 195 00:12:04,820 --> 00:12:09,880 voit vain soittaa. pituus ja muilla kielillä, voit soittaa pituus tai vastaavia. 196 00:12:09,880 --> 00:12:14,060 Se koska paljon kieliä, erityisesti asioita kutsutaan olio-kielet, 197 00:12:14,060 --> 00:12:18,580 pituus on jotain sellaista kapseloitu sisällä datalohko itse, 198 00:12:18,580 --> 00:12:24,000 paljon kuin me koteloitu tunnukset ja nimet ja talojen sisällä opiskelija maanantaina. 199 00:12:24,000 --> 00:12:28,700 Mutta C on paljon alhaisempi. Ei ole esineitä tai luokissa, jos olet kuullut näitä termejä ennen. 200 00:12:28,700 --> 00:12:31,490 Kaikki mitä on todella muisti osoitteita. 201 00:12:31,490 --> 00:12:35,540 Joten tämä on eräänlainen vanhanaikainen tapa esittää mielenkiintoisia tietorakenteita. 202 00:12:35,540 --> 00:12:38,760 Sinulla alkuarvo kuten osoitteen ensimmäisen merkin 203 00:12:38,760 --> 00:12:42,340 ja sitten vain muutamia mielivaltaisia ​​yleissopimuksen että jokainen sitoutuu noudattamaan. 204 00:12:42,340 --> 00:12:46,420 Joten miten on merkkijonon pituus toteutettu, ei ehdotamme? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, jota jotkut teistä ovat nyt käytetty muutaman kerran. Se on melko yksinkertainen, eikö? 206 00:12:51,360 --> 00:12:53,060 Se on kuin 2 riviä koodia. 207 00:12:53,060 --> 00:12:56,140 Se on aika paljon ja silmukka jonkinlaisia, ehkä ylimääräinen paikallinen muuttuja. 208 00:12:56,140 --> 00:13:00,540 Mutta strlen vain on otettava osoittimen ja sitten alkaa etsiä \ 0. 209 00:13:00,540 --> 00:13:05,190 >> Ja heti, kun se havaitsee, se voi palauttaa vaiheiden kokonaismäärä, että se on toteutettu, että merkkijono. 210 00:13:05,190 --> 00:13:07,150 Joten voimme päätellä tästä, mitä tapahtuu seuraavaksi. 211 00:13:07,150 --> 00:13:11,850 Oletetaan sitten ilmoittaa t kuten olen tehnyt linjassa 10. 212 00:13:11,850 --> 00:13:14,280 Tämä on jonkin verran roskaa arvo. Kuka tietää ensin? 213 00:13:14,280 --> 00:13:18,490 Mutta oikealla puolella linjan 10 soitan GetString uudelleen. 214 00:13:18,490 --> 00:13:20,050 Kuka tietää mihin tämä päätyy? 215 00:13:20,050 --> 00:13:23,830 Oletetaan mielivaltaisesti sanoa, että käyttöjärjestelmä löytyy tilaa se tapa tänne. 216 00:13:23,830 --> 00:13:28,610 Satun sattumalta kirjoittaa H-E-L-L-O uudelleen, 217 00:13:28,610 --> 00:13:31,260 ja niin voimme tehdä samanlaista kuvaa. 218 00:13:31,260 --> 00:13:34,290 Mutta se, että olen latautunut tämä kuva on tahallinen 219 00:13:34,290 --> 00:13:37,720 koska se on erilainen HELLO kuin tämä yksi. 220 00:13:37,720 --> 00:13:43,920 Joten tässä tämä voi olla sijainti 456, tämä on 457, ja niin edelleen. 221 00:13:43,920 --> 00:13:47,170 Joten mitä saa laittaa jos kysymysmerkin kerran oli? 222 00:13:47,170 --> 00:13:50,190 Tässä tapauksessa 456. 223 00:13:50,190 --> 00:13:53,540 Olemme poiminta näitä numeroita mielivaltaisesti koska oikeastaan ​​päivän jälkeen 224 00:13:53,540 --> 00:13:57,110 emme aio välitä niin paljon siitä, mitä osoitetta mitään on. 225 00:13:57,110 --> 00:14:02,690 Kaikki välitämme on, että voimme selvittää osoitteen joidenkin pala tietoja, kuten HELLO. 226 00:14:02,690 --> 00:14:07,100 >> Joten oikeastaan ​​mitä useimmat ihmiset tekevät tietojenkäsittelytieteen puhuttaessa muisti osoitteita 227 00:14:07,100 --> 00:14:10,210 ja puhumme viitteitä erityisesti, 228 00:14:10,210 --> 00:14:14,220 eikä vaivaudu mietitään 123 - who cares jos tätä tavaraa todella on, 229 00:14:14,220 --> 00:14:17,440 Tiedämme vain, että se on jossain numeerinen osoite - 230 00:14:17,440 --> 00:14:22,180 me yksinkertaistaa maailmaa ja sanoa, että s on osoittaa, että merkin 231 00:14:22,180 --> 00:14:25,080 ja t on osoittaa, että merkki. 232 00:14:25,080 --> 00:14:27,430 Ja että se nuoli on aivan tarkoituksellista 233 00:14:27,430 --> 00:14:31,610 koska kirjaimellisesti nyt s on suunnattu H ja t on suunnattu muille H 234 00:14:31,610 --> 00:14:34,720 koska lopussa päivä, sillä ei ole väliä, mitä osoite on, 235 00:14:34,720 --> 00:14:40,240 mutta sillä on väliä, että meillä on kyky ilmaista kyseiseen osoitteeseen joidenkin koodinpätkä. 236 00:14:40,240 --> 00:14:42,730 Emme ole todellakaan manipuloida näitä osoitteita ihan vielä 237 00:14:42,730 --> 00:14:47,770 niin näemme missä voimme heittää väliin ja tavallaan tehdä asioita osoittimia, 238 00:14:47,770 --> 00:14:52,030 mutta nyt linja 12 kirjaimellisesti mitä arvoja me vertaamalla 239 00:14:52,030 --> 00:14:55,500 mukaan tämä tarina linjalla 12? 240 00:14:56,570 --> 00:15:01,290 Me sanomme on 123 yhtä sama 456? Ja se ei todellakaan ole kyse. 241 00:15:01,290 --> 00:15:05,320 Ja jopa käsitteellisesti, tämä osoitin ei todellakaan ole sama kuin tämän 242 00:15:05,320 --> 00:15:09,500 koska soitit GetString kahdesti, ja GetString ei yritä olla super ovela, 243 00:15:09,500 --> 00:15:12,470 se ei yritä ymmärtää, oh, kirjoitit HELLO 5 minuuttia sitten; 244 00:15:12,470 --> 00:15:15,090 minäpä annan samalla osoitinta annoin teille ennen, 245 00:15:15,090 --> 00:15:18,450 se vain allokoi uuden palan muistia aina kun soittaa sitä. 246 00:15:18,450 --> 00:15:20,350 >> Miten siis korjata tämän ongelman? 247 00:15:20,350 --> 00:15:24,270 Jos korkeampaa haluan verrata merkkijonoja HELLO ja Hello - 248 00:15:24,270 --> 00:15:28,680 En välitä osoittimet - miten voin edetä vastata kysymykseen, 249 00:15:28,680 --> 00:15:31,980 ei käyttäjä kirjoittaa sama asia? Mitä tässä tarvitaan? Joo. 250 00:15:31,980 --> 00:15:35,200 [Opiskelija] Käytä toimintoa. >> Voin käyttää toimintoa kättelyssä. 251 00:15:35,200 --> 00:15:38,170 Voin käyttää funktiota kutsutaan strcmp, s-t-r-c-m-p, 252 00:15:38,170 --> 00:15:41,190 vain lyhennetty versio sanoa merkkijono vertaa. 253 00:15:41,190 --> 00:15:45,070 Ja jos me mennä esimerkiksi vertailla 2, joka on yksi nykypäivän monisteita, 254 00:15:45,070 --> 00:15:46,690 Teen juuri sitä. 255 00:15:46,690 --> 00:15:51,750 Pidin kaiken muun samaa linjaa 1 alas 26 tai niin, 256 00:15:51,750 --> 00:15:54,360 ja nyt huomaa tämä osa on muuttunut vain vähän. 257 00:15:54,360 --> 00:15:57,690 Katsotaanpa sivuuttaa linja 28 hetkeksi ja keskittyä vain tämä yksi. 258 00:15:57,690 --> 00:16:00,410 Mitä sanomme maanantaina str Vertaile tekee? 259 00:16:00,410 --> 00:16:05,200 Se käsittelee ottamassa 2 osoittimia, s ja t tässä tapauksessa, 260 00:16:05,200 --> 00:16:08,480 tavallaan lähes laittaa sen sormen näitä 2 kirjainta, 261 00:16:08,480 --> 00:16:11,530 ja mitä sen täytyy tehdä, on jotain while-silmukka tai on silmukka, 262 00:16:11,530 --> 00:16:16,050 ja se sanoo nämä samat? Jos näin on, se liikkuu sormien tai osoittimia eteenpäin. 263 00:16:16,050 --> 00:16:17,970 Nämä ovat samat, nämä samat, nämä samat, 264 00:16:17,970 --> 00:16:22,710 nämä samat, nämä samat? Ja ooh, olen lopussa merkkijonon sekä s ja t. 265 00:16:22,710 --> 00:16:26,780 En ole löytänyt mitään ristiriitaisuuksia. Kyllä, nämä jouset ovat samat. 266 00:16:26,780 --> 00:16:31,940 Ja mitä str verrata paluu jos 2 jouset ovat samat, ilmeisesti? Zero. 267 00:16:31,940 --> 00:16:35,900 Joten 0 on hyvä tässä tapauksessa, koska jos se palaa -1 tai +1, 268 00:16:35,900 --> 00:16:40,560 tämä tarkoittaa, että on vain sattuu tulemaan ennen t aakkosjärjestykseen tai jälkeen t.. 269 00:16:40,560 --> 00:16:43,760 Ja miksi se olisi hyödyllistä olla toiminto, joka kertoo mikä merkkijono on ennen 270 00:16:43,760 --> 00:16:46,720 tai sen jälkeen vuonna sanakirjasta? 271 00:16:46,720 --> 00:16:48,740 [Opiskelija] Searching. >> Etsiminen ja lajittelu. 272 00:16:48,740 --> 00:16:51,730 >> Joten voit tehdä asioita, kuten binäärihakupuu tai kupla lajitella tai yhdistää lajitella 273 00:16:51,730 --> 00:16:53,230 jossa sinun täytyy vertailla asioita. 274 00:16:53,230 --> 00:16:56,420 Toistaiseksi olemme tavallaan leikata joitakin kulmat ja vain puhui lajittelua 275 00:16:56,420 --> 00:16:59,430 yhteydessä numeroiden koska se on mukava ja helppo puhua, 276 00:16:59,430 --> 00:17:02,430 mutta voit toki verrata merkkijonoja, omena ja banaani, 277 00:17:02,430 --> 00:17:05,349 koska jos omena tiedetään tulla ennen banaani, vastaavasti, 278 00:17:05,349 --> 00:17:09,319 voit siirtää merkkijonoja ympäri muistiin aivan kuten Rob teki Merge lajitella video 279 00:17:09,319 --> 00:17:15,880 ja teimme täällä lavalla valinta Lajittele, lisäys lajitella ja kupla lajitella. 280 00:17:15,880 --> 00:17:18,710 Joten jos muuta voimme ottaa tämän? Kokeillaan tätä. 281 00:17:18,710 --> 00:17:23,980 Mennään tavallaan unohtaa, että opetus hetkeksi ja yrittää nyt ja kopioida 1.c tehdä seuraavasti. 282 00:17:23,980 --> 00:17:26,800 Yhdenmukaisesti 21 sanon print jotain, 283 00:17:26,800 --> 00:17:28,520 Sitten Saan merkkijonon käyttäjä, 284 00:17:28,520 --> 00:17:30,690 Sitten olen tarkistamiseksi. 285 00:17:30,690 --> 00:17:33,620 Emme ole todellakaan mennyt tämä tapa vielä, mutta katsotaan nyt tehdä tämän. 286 00:17:33,620 --> 00:17:40,990 Mennään todella Taitat tämän kerroksen. Tämä on todella char *. Tämä kaveri on todella char *. 287 00:17:40,990 --> 00:17:45,690 Joten mitä se tarkoittaa olla tarkistaa jos s == NULL? 288 00:17:45,690 --> 00:17:48,380 On käynyt ilmi, että kun soitat toimivat kuten GetString 289 00:17:48,380 --> 00:17:51,540 tai yleisemmin vain pyytää tietokone antaa sinulle jonkin verran muistia, 290 00:17:51,540 --> 00:17:53,030 jotain voi mennä pieleen. 291 00:17:53,030 --> 00:17:56,630 Voisit olla hullu ja pyydä tietokoneen teratavun muistia 292 00:17:56,630 --> 00:18:01,780 pyytämällä biljoonia tavua muistia, jotka eivät vain olemassa tietokoneen, 293 00:18:01,780 --> 00:18:05,130 mutta GetString ja muut toiminnot tarvitsevat tapa huutaa sinua 294 00:18:05,130 --> 00:18:06,820 jos olet pyytänyt liikaa. 295 00:18:06,820 --> 00:18:10,450 Ja miten GetString tämä on, jos olet pyytänyt lisää muistia 296 00:18:10,450 --> 00:18:14,250 kuin on käytettävissä tietokoneessa, vaikka se on super, super alhainen todennäköisyys 297 00:18:14,250 --> 00:18:17,730 koska kukaan meistä ovat menossa kirjoittaa biljoona merkkejä ja paina sitten Enter- 298 00:18:17,730 --> 00:18:21,980 mutta pieni todennäköisyys, vaikka se voi olla, en silti halua tarkistaa se vain siinä tapauksessa, 299 00:18:21,980 --> 00:18:26,120 ja erityinen arvo GetString, vastaus, ja muita toimintoja palaa 300 00:18:26,120 --> 00:18:30,630 jos jotain on mennyt pieleen on NULL kaikissa korkit. 301 00:18:30,630 --> 00:18:36,520 >> Ja mikä on NULL? NULL sattuu edustamaan osoitin. Se muistiosoite 0. 302 00:18:36,520 --> 00:18:40,800 Maailman päätti mielivaltaisesti, jos tämä on minun tietokoneen muistiin - Tiedätkö mitä? - 303 00:18:40,800 --> 00:18:46,260 aiomme varastaa vain 1 tavu jokaisen tietokoneen muistiin, ja tämä on paikka 0. 304 00:18:46,260 --> 00:18:49,560 Me aiomme antaa sille lempinimen NULL, ja aiomme luvata 305 00:18:49,560 --> 00:18:52,660 että emme koskaan oikeastaan ​​laittaa todellisia tietoja ei 306 00:18:52,660 --> 00:18:56,770 koska vain mielivaltaisesti tarvitsemme erityinen arvo, 0, alias NULL, 307 00:18:56,770 --> 00:19:00,230 jotta voimme huutaa käyttäjiä, jos jokin menee pieleen. 308 00:19:00,230 --> 00:19:03,590 Muuten et ehkä tiedä, ei 0 tarkoittaa laittaa jotain 309 00:19:03,590 --> 00:19:05,490 tai se tarkoittaa jotain meni pieleen? 310 00:19:05,490 --> 00:19:09,190 Olemme kaikki yhtä mieltä siitä, että NULL tarkoittaa mitään ei palautettu, 311 00:19:09,190 --> 00:19:11,700 ei todellista osoitetta palautettiin. 312 00:19:11,700 --> 00:19:15,210 Nyt, täällä olen vain hyväksymällä minun ihmisen yleissopimus palaan 1 alkaen tärkeimmistä 313 00:19:15,210 --> 00:19:17,040 Jos jokin menee pieleen. 314 00:19:17,040 --> 00:19:20,650 Tämä johtuu pääasiassa paluuta yleissopimus on palauttaa 0, jos hyvä, 315 00:19:20,650 --> 00:19:22,990 1 tai jokin muu arvo, jos huono. 316 00:19:22,990 --> 00:19:28,200 Mutta GetString ja kaikki toiminta, joka käsittelee muistissa palauttaa NULL, jos jokin menee huonosti. 317 00:19:28,200 --> 00:19:33,480 >> Okei. Joten valitettavasti linja 27, super yksinkertainen kuin se onkin, ei onnistunut kopioida merkkijono. 318 00:19:33,480 --> 00:19:35,740 Miksi? Voimme nähdä tämän seuraavasti. 319 00:19:35,740 --> 00:19:40,120 Olen väittäen linjassa 27 voidaan tehdä kopion s ja sen hakeminen t. 320 00:19:40,120 --> 00:19:45,790 Joten en pyydä käyttäjä 2 jousille tällä kertaa, sanon vain arvo s 321 00:19:45,790 --> 00:19:47,870 pitäisi laittaa t samoin. 322 00:19:47,870 --> 00:19:52,890 Joten nyt vain osoittaa kuinka rikki tämä on linjassa 29 eteenpäin mitä teen? 323 00:19:52,890 --> 00:19:56,980 Ensimmäinen olen tarkistaa, jos pituus t on suurempi kuin 0. 324 00:19:56,980 --> 00:19:59,330 On joitakin merkkijono siellä. Käyttäjä kirjoitettu jotain sisään 325 00:19:59,330 --> 00:20:03,410 Mikä on line 32 tekee ilmeisesti? 326 00:20:03,410 --> 00:20:08,910 [Äänetön opiskelija vastausta] >> Oikea. Voit sellaista päätellä sitä mitä sanoin sen tekee. 327 00:20:08,910 --> 00:20:13,200 Mutta teknisesti, mitä tämä tekee? t [0] tarkoittaa mitä? 328 00:20:13,200 --> 00:20:15,140 [Opiskelija] nollas merkki. >> [Malan] nollas merkki. 329 00:20:15,140 --> 00:20:19,620 Tai enemmän ihmisen kaltaisia, ensimmäisen merkin t, mitä se on, H ehkä tässä tapauksessa. 330 00:20:19,620 --> 00:20:24,990 Ja toupper mitä se sanoo. Se aktivoi nollas luonnetta t ja se muuttaa sitä. 331 00:20:24,990 --> 00:20:28,430 Joten tämä tarkoittaa ottaa nollas luonnetta t, tee se isoiksi, 332 00:20:28,430 --> 00:20:30,320 ja laita se takaisin samassa paikassa. 333 00:20:30,320 --> 00:20:35,540 Joten jos kirjoitat hei pieniä, pitäisi vaihtaa pienet h pääoman H. 334 00:20:35,540 --> 00:20:41,400 Mutta ongelma on, että linjat 35 ja 36, ​​mitä aion tehdä, on tulostaa meille s ja t. 335 00:20:41,400 --> 00:20:43,120 Ja mikä on sinun aavistus? 336 00:20:43,120 --> 00:20:47,250 Mitä minä todella menossa katsomaan jos olen kirjoittanut Hei kaikki pieniä? 337 00:20:47,250 --> 00:20:52,280 Mitä menossa painettu? >> [Äänetön opiskelijan vastausta] >> Mikä tuo on? 338 00:20:52,280 --> 00:20:58,360 [Opiskelija] Big H ja loput pieniä. >> Iso H ja loput pieni, joka s tai t? 339 00:20:58,360 --> 00:21:03,170 [Opiskelija] Molemmat. >> Molemmat. Aivan. Joten katsotaanpas mitä täällä tapahtuu. 340 00:21:03,170 --> 00:21:08,380 >> Anna minun mennä eteenpäin ja koota tähän. Tämä on COPY1, joten varmista COPY1. Selvä. 341 00:21:08,380 --> 00:21:14,840 Lähennä Haluan mennä eteenpäin ja ajaa COPY1, Anna, Sano jotain: hei pienillä kirjaimilla. 342 00:21:14,840 --> 00:21:19,570 Se aktivoi kopio, mutta se ilmeisesti aktivoidaan alkuperäisen samoin, 343 00:21:19,570 --> 00:21:22,070 sillä mitä nyt tapahtuu tämän tarinan? 344 00:21:22,070 --> 00:21:27,030 Yhdenmukaisesti 27 En oikeastaan ​​tunnu kopiointi merkkijono, 345 00:21:27,030 --> 00:21:30,450 mutta vaikka ehkä intuitiivisesti toivonut, että olisi kyse, 346 00:21:30,450 --> 00:21:33,680 jos ajattelee tätä kuvaa, mitä todella olen tehnyt? 347 00:21:33,680 --> 00:21:35,410 Puolet kuva on sama. 348 00:21:35,410 --> 00:21:39,390 Joten perua ajoissa, jotta t ei vielä ole tarina. 349 00:21:39,390 --> 00:21:43,160 S voi esiintyä tarina, mutta katsotaanpa pieniksi hei tällä kertaa. 350 00:21:43,160 --> 00:21:46,710 Joten haluan korjata mitä olen itse kirjoittanut tuumaa 351 00:21:46,710 --> 00:21:51,280 Tässä tapauksessa meillä on tässä h-e-l-l-o. 352 00:21:51,280 --> 00:21:58,050 Me piirtää se merkkijono, laitoin erotin linjat täällä ja minun \ 0. 353 00:21:58,050 --> 00:22:05,980 Joten tämä on, missä olemme pian linja 1: stä 24-ish, antaa tai ottaa, on suoritettu. 354 00:22:05,980 --> 00:22:07,800 Tämä on kuva minun muisti. 355 00:22:07,800 --> 00:22:10,800 Kun pääsen linja 27, mitä tapahtuu? 356 00:22:10,800 --> 00:22:14,730 Aivan kuten ennen, saan osoittimen, joka minä piirtää kuin tämä neliö. 357 00:22:14,730 --> 00:22:19,740 Sitä kutsutaan t.. Ja mikä sen arvo oletuksena? Kuka tietää? Jotkut roskat arvoa. 358 00:22:19,740 --> 00:22:22,060 >> Niin minä abstrakteja että pois kuin kysymysmerkki. 359 00:22:22,060 --> 00:22:27,670 Ja heti oikealla puolella linjan 27 suorittaa, mitä olen laskemisesta sisällä t? 360 00:22:27,670 --> 00:22:30,770 Sama juttu se on s. 361 00:22:30,770 --> 00:22:34,120 Joten jos me hetkeksi poistaa tämän abstraktion nuolen ja sanomme, 362 00:22:34,120 --> 00:22:40,330 Voi, tämä on muistin kuormituksen osoite 123, kun sanot t saa s, puolipiste, 363 00:22:40,330 --> 00:22:42,700 olet kirjaimellisesti laskemisesta 123 täällä. 364 00:22:42,700 --> 00:22:45,200 Nyt jos me tavallaan yksinkertaistaa maailmamme jälleen kuvia, 365 00:22:45,200 --> 00:22:48,750 mitä olet tehnyt todella on juuri lisätty toinen nuoli maailmaasi 366 00:22:48,750 --> 00:22:52,910 joka on joka osoittaa t täsmälleen sama merkkijono. 367 00:22:52,910 --> 00:22:59,730 Joten kun rivillä 31 ja 32 olen itse mennä muuttamassa t [0] 368 00:22:59,730 --> 00:23:05,580 Mikä on t [0] ilmeisesti synonyymi nyt? s [0] 369 00:23:05,580 --> 00:23:07,030 Niin, että kaikki tapahtuu. 370 00:23:07,030 --> 00:23:09,900 Ja vaikka tällainen tuntuu hieman alhainen ja mystistä 371 00:23:09,900 --> 00:23:12,760 ja tämä tavallaan tuntuu ehkä intuitiivisesti tämä olisi vain toimi - 372 00:23:12,760 --> 00:23:15,410 Olen tehnyt kopioita asioita ennen ja se toimi - 373 00:23:15,410 --> 00:23:18,590 jos todella miettiä, mitä merkkijono todella on, se on char *. 374 00:23:18,590 --> 00:23:21,700 No, mikä on? Se on osoite jokin merkki. 375 00:23:21,700 --> 00:23:24,930 Sitten ehkä järkevämpää, että kun yrität tehdä jotain 376 00:23:24,930 --> 00:23:29,220 Super näennäisen yksinkertainen näin, kaikki mitä teet on kopiointi muistin osoitteen. 377 00:23:29,220 --> 00:23:32,530 Et oikeastaan ​​tee mitään merkkijono itse. 378 00:23:32,530 --> 00:23:37,500 Joten vaikka sinulla ei ole aavistustakaan miten ratkaisisi tämän ongelman koodin, 379 00:23:37,500 --> 00:23:45,080 korkea, käsitteellisesti, mitä meidän on tehtävä, jotta ta jäljennös s, ilmeisesti? 380 00:23:46,670 --> 00:23:48,820 Joo. >> [Opiskelija] Anna sille uusi sijainti? >> Aivan. 381 00:23:48,820 --> 00:23:50,800 >> Meidän täytyy antaa t upouusi paikkaan. 382 00:23:50,800 --> 00:23:55,230 Meidän jotenkin luoda maailma, jossa saamme uuden palan muistia, 383 00:23:55,230 --> 00:24:00,090 jotka vain selvyyden vuoksi minä piirtää oikeassa alapuolella, mutta se ei tarvitse olla siellä. 384 00:24:00,090 --> 00:24:04,880 Mutta sen on oltava sama koko, niin minä piirtää nämä pystyviivoja samassa paikassa. 385 00:24:04,880 --> 00:24:09,720 Se on hienoa, jos tämä kaikki on roskaa aluksi. Kuka tietää, mitä siellä oli? 386 00:24:09,720 --> 00:24:13,850 Mutta vaihe 1 tulee on antaa minulle niin paljon muistia kuin tarvitsen 387 00:24:13,850 --> 00:24:18,630 sopimaan kopio Hei, sitten selvittää, miten kopioida h täällä, E täällä, 388 00:24:18,630 --> 00:24:20,390 L täällä ja niin edelleen. 389 00:24:20,390 --> 00:24:24,880 Mutta tämä on jo pitäisi tuntea hieman ilmeinen, vaikka jotkut yksityiskohdat ovat vielä abstrakteja. 390 00:24:24,880 --> 00:24:28,690 Kopioida tämä merkkijono tähän, se on vain varten silmukka tai kun silmukka 391 00:24:28,690 --> 00:24:31,580 tai jotain, jonka kanssa olet tullut kaikki tutumpi. 392 00:24:31,580 --> 00:24:35,970 Joten kokeile tätä. Sallikaa minun mennä copy2.c. 393 00:24:35,970 --> 00:24:43,270 Vuonna copy2.c meillä on lähes sama ohjelma paitsi linja 27. 394 00:24:43,270 --> 00:24:47,260 Se näyttää hieman monimutkainen, mutta jos me murtaa se alas pala palalta, 395 00:24:47,260 --> 00:24:48,950 vasen puoli on sama. 396 00:24:48,950 --> 00:24:52,790 Char * t luo tämän asian muistiin, vaikkakin kysymysmerkki 397 00:24:52,790 --> 00:24:54,680 koska meillä ei ole aavistustakaan mitä siellä oletuksena. 398 00:24:54,680 --> 00:24:57,920 Oikealla puolella olemme nyt käyttöön uuden toiminnon, malloc, 399 00:24:57,920 --> 00:25:00,640 muistin myöntää, anna minulle muisti, 400 00:25:00,640 --> 00:25:06,900 ja se ilmeisesti kestää kuinka monta argumenttia, kuinka paljon suluissa? 401 00:25:09,660 --> 00:25:12,130 Kuulin nurinasta 1 ja 2, mutta se on vain 1. 402 00:25:12,130 --> 00:25:15,320 Ei ole pilkkua, mikä tarkoittaa, että on vain 1 juttu sulkujen sisään. 403 00:25:15,320 --> 00:25:17,720 Vaikka on olemassa muita sulkeisiin, haluan korostaa 404 00:25:17,720 --> 00:25:21,460 mitä sisällä uloimman sulkeisiin, ja se on tämä lauseke: 405 00:25:21,460 --> 00:25:25,880 (Strlen (t) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Joten jos ajattelemme tätä kautta, tämä sanoo anna minulle pituuden s. 407 00:25:29,190 --> 00:25:34,440 Miksi olen kuitenkin lisäämällä 1 päälle pituus? >> [Äänetön opiskelijan vastausta] 408 00:25:34,440 --> 00:25:40,200 Aivan. Tarvitsemme tilaa tämän kaveri hännän, kuudes merkki, joka ei ole Englanti merkitystä 409 00:25:40,200 --> 00:25:42,250 mutta ei ole erityisiä ohjelmallinen merkitys. 410 00:25:42,250 --> 00:25:46,800 >> Joten tarvitsemme + 1 että koska strlen palaa ihmisten odotukset pituus, 411 00:25:46,800 --> 00:25:50,890 Hei tai 5, se ei anna lisää nollamerkki. 412 00:25:50,890 --> 00:25:52,980 Olen siis manuaalisesti lisätä tätä + 1. 413 00:25:52,980 --> 00:25:56,060 Ja sitten tämä, * koko (char), emme ole nähneet tätä ennen. 414 00:25:56,060 --> 00:25:57,480 Tämä ei ole teknisesti funktio. 415 00:25:57,480 --> 00:26:04,150 Se on erityinen avainsanan, joka vain kertoo, mitä kokoa on joidenkin tietojen tyypin tietokoneella 416 00:26:04,150 --> 00:26:06,980 koska todellisuudessa, jotkut meistä ovat 32-bittisiä tietokoneita. 417 00:26:06,980 --> 00:26:10,900 Olen aika vanha tietokone kotona ja se käyttää vain 32 bitin osoittimia. 418 00:26:10,900 --> 00:26:13,900 Ja niin jos tein koko tietotyyppi, se voi olla 32 bittiä. 419 00:26:13,900 --> 00:26:18,300 Mutta jos olen käyttäen uutta fancy tietokone, saatan palata arvo 64 bittiä 420 00:26:18,300 --> 00:26:20,510 ja jotain osoitetta. 421 00:26:20,510 --> 00:26:25,400 Joten tässä tapauksessa, vain olla super turvallinen, emme aio kova koodi jotain - 422 00:26:25,400 --> 00:26:28,740 hyvin, mikä on koko char mukaan, mitä olemme sanoneet tähän mennessä? 423 00:26:28,740 --> 00:26:34,450 Olemme melko sanoi suullisesti että se on 1 tavu, ja se on aika paljon totta kautta linjan. 424 00:26:34,450 --> 00:26:37,000 Mutta jälleen kerran, oletukset yleensä huono. 425 00:26:37,000 --> 00:26:40,850 Ne johtavat buginen ohjelmisto, jos ihmiset käyttää ohjelmistoa tavoilla, joita et aikonut. 426 00:26:40,850 --> 00:26:44,750 Joten Tiivistelmä pois ja vain lisää yleisesti sanoa 427 00:26:44,750 --> 00:26:46,830 Tarvitsen tätä monet palasina muistia 428 00:26:46,830 --> 00:26:50,210 ja kukin kimpale muistia olisi vastattava koko merkin, 429 00:26:50,210 --> 00:26:54,870 mikä on itse asiassa yhtä suuri kuin 1 tässä tapauksessa, mutta se on yleisempi tapa kirjoittaa sitä. 430 00:26:54,870 --> 00:27:00,460 Eli jos sana on hei, kuinka monta tavua ei malloc ilmeisesti osoittaa Hello? 431 00:27:00,460 --> 00:27:04,980 [Opiskelija] Six. >> Kuusi. Tasan yhtä monta kuin meillä on kysymysmerkkejä ruudulla. 432 00:27:04,980 --> 00:27:07,800 Ja sitten arvata perustuu nyt ymmärrystä GetString 433 00:27:07,800 --> 00:27:12,790 Mitä malloc palannee? >> [Opiskelija] osoite. 434 00:27:12,790 --> 00:27:17,020 Osoite mitä? Ensimmäisen palan muistia. 435 00:27:17,020 --> 00:27:20,670 >> Meillä ei ole aavistustakaan, mitä on olemassa, koska jokin muu toiminto 436 00:27:20,670 --> 00:27:23,010 voitu käyttää tätä muistia aikaisemmin. 437 00:27:23,010 --> 00:27:28,380 Mutta malloc, kuten GetString, palauttaa osoitteen ensimmäisen tavun muistin 438 00:27:28,380 --> 00:27:30,540 että se on varattu sinulle. 439 00:27:30,540 --> 00:27:38,380 Kuitenkin, mitä se ei tee on täyttää tämä tyhjäksi kenoviivaan nollamerkki 440 00:27:38,380 --> 00:27:43,030 koska se kääntyy pois, voit käyttää malloc osoittaa mitään: ints, jouset, taulukot, 441 00:27:43,030 --> 00:27:45,700 kellukkeet, opiskelija rakenteita. 442 00:27:45,700 --> 00:27:47,750 Voit käyttää malloc täysin yleisesti. 443 00:27:47,750 --> 00:27:51,470 Se ei välitä tai tarvitse tietää, mitä olet jakamisesta muistia. 444 00:27:51,470 --> 00:27:55,810 Joten se olisi ylimielistä malloc laittaa \ 0 445 00:27:55,810 --> 00:27:58,340 lopussa jokaisen palan muistia se antaa sinulle 446 00:27:58,340 --> 00:28:02,620 koska \ 0 juttu on vain yleissopimus jousille. 447 00:28:02,620 --> 00:28:06,310 Se ei käytetä ints, sitä ei käytetä kellukkeet, sitä ei käytetä opiskelijoille. 448 00:28:06,310 --> 00:28:11,730 Ja niin ähäkutti kanssa malloc on, että taakka on täysin sinusta ohjelmoija 449 00:28:11,730 --> 00:28:16,790 muistaa kuinka monta tavua olet varattu eikä koskaan käytä varten silmukka 450 00:28:16,790 --> 00:28:21,570 tai kun silmukan ja mennä ohi rajan palan muistia olet saanut. 451 00:28:21,570 --> 00:28:23,540 Toisin sanoen, heti kun varata muistia, 452 00:28:23,540 --> 00:28:28,510 et voi kysyä käyttöjärjestelmä, oh, muuten, kuinka suuri kimpale muisti oli tämän? 453 00:28:28,510 --> 00:28:32,080 Se on täysin sinun muistaa jos tarvitset arvoa. 454 00:28:32,080 --> 00:28:34,330 >> Joten katsotaanpas miten edetä käyttää tätä muistia. 455 00:28:34,330 --> 00:28:38,430 Linjassa 28 ja 29 Miksi minä teen tätä? 456 00:28:39,850 --> 00:28:42,260 Vain yhteensä järki tarkistaa. 457 00:28:42,260 --> 00:28:45,110 Vain jos jokin meni pieleen, pyydän joitakin hullu muistin määrän 458 00:28:45,110 --> 00:28:48,690 tai olen niin monia asioita käynnissä tietokoneessa, ei vain ole tarpeeksi muistia, 459 00:28:48,690 --> 00:28:51,780 jotain, minä ainakin haluan tarkistaa null. 460 00:28:51,780 --> 00:28:55,260 Todellisuudessa useimmissa tietokoneissa antaa sinulle illuusion, että jokainen ohjelma 461 00:28:55,260 --> 00:28:57,080 voidaan käyttää kokonaisuudessaan RAM, 462 00:28:57,080 --> 00:29:00,740 mutta silti, jos käyttäjä on joku hullu pitkä jono ehkä koska he pahis 463 00:29:00,740 --> 00:29:03,440 ja he todella yrittävät kaataa ohjelman tai hakata siihen, 464 00:29:03,440 --> 00:29:07,300 Haluatko ainakin tarkistaa palauttaa arvon malloc ja onko se yhtä null. 465 00:29:07,300 --> 00:29:11,630 Ja jos se, mennään vain lopettaa nyt, koska en tiedä mitä tehdä tässä tapauksessa. 466 00:29:11,630 --> 00:29:13,950 Miten kopioin merkkijono? On muutamia tapoja tehdä tätä. 467 00:29:13,950 --> 00:29:18,850 On str kopiointitoiminnoista C, mutta se on erittäin yksinkertainen, että teemme tämän vanhanaikaisella tavalla. 468 00:29:18,850 --> 00:29:23,110 >> Ensinnäkin haluan selvittää, mitä pituus s on. 469 00:29:23,110 --> 00:29:26,930 Olisin voinut laittaa tämän silmukan vaan olen vain laittaa sitä täällä selvyyden vuoksi. 470 00:29:26,930 --> 00:29:30,610 Joten n nyt tallentaa pituus alkuperäisen merkkijonon, joka on ilmeisesti 5. 471 00:29:30,610 --> 00:29:35,290 Sitten minun on loop olen iteroimalla 0 on korkeintaan n, 472 00:29:35,290 --> 00:29:40,940 ja kukin iterointi Laitan s [i] sisäpuolelle t [i]. 473 00:29:40,940 --> 00:29:45,060 Niin, että mitä minä merkitsi minun 2 sormea ​​osoittaen merkkijonot. 474 00:29:45,060 --> 00:29:49,260 Koska tämä silmukka toistetaan näin, aion olla kopioinnin h osaksi täällä, 475 00:29:49,260 --> 00:29:52,890 e osaksi täällä, L tulee tänne, koska tämä on s, tämä on t. 476 00:29:52,890 --> 00:29:58,770 Ja sitten lopuksi, vastaa 35 Miksi minä teen tätä? 477 00:29:58,770 --> 00:30:03,770 Minun täytyy varmistaa, että olen päättyneen merkkijono t. 478 00:30:03,770 --> 00:30:06,170 Ja tein sen näin olla super selkeä. 479 00:30:06,170 --> 00:30:09,510 Mutta ehdottaa, joku, jos voisi, erilainen tapa tehdä tämä. 480 00:30:09,510 --> 00:30:13,930 En todellakaan tarvitse linja 35. On toinenkin tapa tehdä tämä. 481 00:30:13,930 --> 00:30:18,880 Joo. >> [Äänetön opiskelijan vastausta] >> Sano se kovempaa. 482 00:30:18,880 --> 00:30:20,960 [Opiskelija] Pienempi tai yhtä suuri kuin. >> Aivan. 483 00:30:20,960 --> 00:30:24,450 Voisimme eli vähemmän kuin tai yhtä suuri kuin n, joka yleensä on ollut huono 484 00:30:24,450 --> 00:30:28,190 sillä lähes aina kun menemme jopa sama asia Luotamme 485 00:30:28,190 --> 00:30:30,000 mennään 1 askel liian pitkälle. 486 00:30:30,000 --> 00:30:32,170 Mutta muistakaa, kuinka monta tavua teimme jakaa? 487 00:30:32,170 --> 00:30:37,210 Me jaetaan strlen s, joten 5 + 1 yhteensä 6. 488 00:30:37,210 --> 00:30:39,980 Eli tässä tapauksessa voisimme tehdä jotain tällaista 489 00:30:39,980 --> 00:30:46,450 niin että me kopiointi ei vain hei vaan myös \ 0 aivan lopussa. 490 00:30:46,450 --> 00:30:49,860 Vaihtoehtoisesti voisimme käyttää toimintoa kutsutaan str kopio, strcpy, 491 00:30:49,860 --> 00:30:51,700 mutta se ei olisi läheskään niin hauskaa. 492 00:30:51,700 --> 00:30:54,000 Mutta kaikki se alla huppu. 493 00:30:54,000 --> 00:30:56,050 Sitten lopuksi, me teemme samoin kuin ennen. 494 00:30:56,050 --> 00:31:01,620 Olen isolla t ja sitten väittää, että alkuperäinen näyttää tältä ja kopio näyttää että. 495 00:31:01,620 --> 00:31:08,570 Joten kokeile tätä nyt. Päästä minut tänne. Tee copy2. Me lähentää ja ajaa copy2. 496 00:31:08,570 --> 00:31:13,840 Aion kirjoittaa Hei pieniä, ja todellakin saan pieniksi hei kuin alkuperäinen 497 00:31:13,840 --> 00:31:16,930 mutta pääomaa Hei kopiolle. 498 00:31:16,930 --> 00:31:20,300 Mutta en ole tehnyt vielä. Minun täytyy tehdä 1 viimeinen asia täällä. 499 00:31:20,300 --> 00:31:28,000 46 ja 47 on selvästi vapauttaa muistia, mutta mitä se oikeastaan ​​tarkoittaa? 500 00:31:28,000 --> 00:31:33,250 Mitä teen, luulet, soittamalla linja 46 ja linja 47? 501 00:31:33,250 --> 00:31:38,900 Mikä vaikutus tällä on? Joo. 502 00:31:38,900 --> 00:31:43,140 [Äänetön opiskelija vastausta] >> Aivan. 503 00:31:43,140 --> 00:31:46,380 >> Olet vain kertoa käyttöjärjestelmä, hei, kiitos tästä muistia. 504 00:31:46,380 --> 00:31:48,320 Voit nyt käyttää sitä joku muu. 505 00:31:48,320 --> 00:31:50,790 Ja tässä täydellinen esimerkki roskaa arvoja. 506 00:31:50,790 --> 00:31:55,430 Olen juuri käyttänyt tätä muistia kirjoittaa sana hello in 2 paikkaa, 507 00:31:55,430 --> 00:31:57,490 täällä, täällä, täällä ja täällä. 508 00:31:57,490 --> 00:32:00,910 Joten tämä on h-e-l-l-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Mutta sitten soittaa rivi 46 ja linja 47, ja tiedät mitä siellä tapahtuu kannalta kuvan? 510 00:32:06,960 --> 00:32:10,010 Oikeastaan, odota, tämä kuva on vanha. 511 00:32:10,010 --> 00:32:12,550 Kun teemme kopion, tämä kaveri on todella osoittaa täällä, 512 00:32:12,550 --> 00:32:16,110 joten katsotaanpa poista numerot ja juuri abstrakteja pois meidän nuolia uudelleen. 513 00:32:16,110 --> 00:32:19,370 Mitä tapahtuu tässä kuvassa kun soitan ilmaiseksi? 514 00:32:19,370 --> 00:32:22,750 [Äänetön opiskelija vastausta] >> Ei edes. 515 00:32:22,750 --> 00:32:29,510 Jos Kehotan ilmaiseksi s ja t - eräänlainen temppu kysymys - tämä kuva ei muutu lainkaan 516 00:32:29,510 --> 00:32:33,880 koska kutsuvan s ja soittaa t vain kertoo käyttöjärjestelmä, 517 00:32:33,880 --> 00:32:39,010 Hei, voit käyttää tätä muistia uudelleen, mutta se ei muuta tätä null 518 00:32:39,010 --> 00:32:41,840 tai jokin erityinen luonne, se ei muuta tätä, 519 00:32:41,840 --> 00:32:47,350 se ei muuta h tai e tai l tai l-tai O joko paikka mitään muuta. 520 00:32:47,350 --> 00:32:51,610 Kannalta kuvan, heti kun soittaa ilmaiseksi, mikään ei muutu. 521 00:32:51,610 --> 00:32:56,570 Ja siinä piilee alkuperä roskat arvoista, koska jos olen myöhemmin tässä ohjelmassa 522 00:32:56,570 --> 00:33:01,010 kysy käyttöjärjestelmän enemmän muistia GetString tai malloc tai jotain 523 00:33:01,010 --> 00:33:04,900 ja käyttöjärjestelmä sanoo, että minulla on 12 tavua muistia vain vapautuisi, 524 00:33:04,900 --> 00:33:08,080 käytä näitä, mitä aiot luovutettava? 525 00:33:08,080 --> 00:33:10,830 Tulette luovutettava kimpale muistin että tyypillisesti tehdä 526 00:33:10,830 --> 00:33:13,700 kanssa kysymysmerkkejä, mutta mitä ovat ne kysymysmerkkejä? 527 00:33:13,700 --> 00:33:17,000 Ne sattuvat olemaan h-e-l-l-o, h-e-l-l-o. 528 00:33:17,000 --> 00:33:20,940 Nämä ovat uudet roska-arvoja heti kun vapautuu, että muistia. 529 00:33:20,940 --> 00:33:22,750 >> On todellinen maailma vaikutusta täälläkin. 530 00:33:22,750 --> 00:33:24,720 Tämä tapahtuu tekemistä RAM, mutta tietokoneet 531 00:33:24,720 --> 00:33:26,720 todella tehdä sama juttu levylle. 532 00:33:26,720 --> 00:33:30,620 Me puhumme tästä erityisesti tulevaisuuden ongelma setti keskittyy Forensics. 533 00:33:30,620 --> 00:33:36,170 Mutta mitä oikeastaan ​​tapahtuu, jos sinulla on herkkä taloudellinen tiedosto työpöydällesi 534 00:33:36,170 --> 00:33:39,600 tai jotkut summittainen JPEG ja vedät sen teidän roskakoriin, 535 00:33:39,600 --> 00:33:44,390 Mitä tapahtuu, kun vedät sen roskakoriin tai roskakoriin? 536 00:33:44,390 --> 00:33:47,240 Tiesit mitä puhuin. [Naurua] 537 00:33:47,240 --> 00:33:52,370 Mitä tapahtuu, kun olet vetää todisteista roskakori tai roskakoriin? 538 00:33:52,370 --> 00:33:55,920 [Äänetön opiskelija vastausta] 539 00:33:55,920 --> 00:33:58,000 No, niin varovainen. Mitä tapahtuu, kun teet sen? 540 00:33:58,000 --> 00:34:01,030 Lyhyt vastaus on ei mitään, eikö? 541 00:34:01,030 --> 00:34:04,790 Sketchy tai herkkä tiedosto on yhä vain istuu jossain kiintolevyllä. 542 00:34:04,790 --> 00:34:07,940 Useimmat meistä ainakin ovat oppineet kantapään kautta, että sinun täytyy tyhjentää roskat 543 00:34:07,940 --> 00:34:10,429 tai roskakori todella poistaa tiedostoja. 544 00:34:10,429 --> 00:34:13,440 Ja todellakin, kun klikkaa oikealla tai Control napsautuksella roskakoriin 545 00:34:13,440 --> 00:34:15,580 tai valitse Tiedosto, Tyhjennä roskakori tai mitä tahansa 546 00:34:15,580 --> 00:34:21,420 ja voit itse tyhjentää roskakorin tai roskakoriin, mitä todella tapahtuu sitten tätä kuvaa? 547 00:34:22,810 --> 00:34:25,969 Enemmän mitään. Joten mitään todella tapahtuu levyllä. 548 00:34:25,969 --> 00:34:30,880 >> Ja jos me vain tilapäisesti Poikkean ja kirjoittaa - Minä vain käyttää takaisin tämän. 549 00:34:30,880 --> 00:34:34,639 Joten nyt tarinan on muuttumassa RAM, mikä on kun ohjelmia on olemassa 550 00:34:34,639 --> 00:34:39,250 kun käytät niitä, levylle, mikä on kun niitä säilytetään pitkään 551 00:34:39,250 --> 00:34:42,920 vaikka virta sammuu, nyt - ja me palaamme tähän myöhemmin - 552 00:34:42,920 --> 00:34:46,380 Haluan vain teeskennellä, että tämä on kovalevy sisällä tietokoneen 553 00:34:46,380 --> 00:34:50,110 koska takaisin päivän ne käytetään olla pyöreä levyille, aivan kuten levykkeet. 554 00:34:50,110 --> 00:34:55,130 Joten jos sinulla on joitakin arkaluonteisia Excel-tiedoston, se voisi ottaa tämän palan muistia 555 00:34:55,130 --> 00:34:59,770 tietokoneen levyn, ja olen vain piirtämällä sama mielivaltainen 1s ja 0s. 556 00:34:59,770 --> 00:35:03,970 Kun vedät tiedoston kuin että teidän roskakoriin tai kierrättää bin, 557 00:35:03,970 --> 00:35:07,750 kirjaimellisesti mitään ei tapahdu, koska Apple ja Microsoft ovat juuri päättäneet 558 00:35:07,750 --> 00:35:10,450 roskakoriin ja roskakorin on oikeastaan ​​vain väliaikainen paikkamerkki. 559 00:35:10,450 --> 00:35:14,710 Ehkä lopulta OS tyhjentää sen sinulle, mutta yleensä se ei tee mitään, 560 00:35:14,710 --> 00:35:17,090 ainakin kunnes olet todella vähissä tilaa. 561 00:35:17,090 --> 00:35:20,870 >> Kuitenkin, kun menet Tyhjennä roskakori tai tyhjä roskakoriin, 562 00:35:20,870 --> 00:35:23,460 Vastaavasti ei tapahdu mitään tätä kuvaa. 563 00:35:23,460 --> 00:35:28,590 Kaikki tämä tapahtuu on muualla tietokoneessa on jonkinlainen taulukko. 564 00:35:28,590 --> 00:35:35,400 Se on tavallaan kuin pieni lunttilappua joka sanoo, että sanotaan, resume.doc, 565 00:35:35,400 --> 00:35:40,920 joten ansioluettelosi Microsoft Word-tiedoston asuivat paikassa 123 kiintolevyllä, 566 00:35:40,920 --> 00:35:43,710 ole muistissa eikä RAM, vaan kiintolevyllä, 567 00:35:43,710 --> 00:35:49,050 ja teidän pintapuolisena JPEG asuu 456, ja Excel-tiedoston asuu 789 tai missä. 568 00:35:49,050 --> 00:35:53,640 Kun poistat tiedostoja todella tyhjentämällä roskakori tai roskakori, 569 00:35:53,640 --> 00:35:59,530 Tämä kuva ei muutu. 0s ja 1s kiintolevyllä ei mene minnekään. 570 00:35:59,530 --> 00:36:03,930 Mutta tämä taulukko, tämä pieni tietokanta lajittelee, ei muutosta. 571 00:36:03,930 --> 00:36:08,750 Kun poistat ansioluettelosi, se on ikään kuin tiedosto poistetaan jossain mielessä, 572 00:36:08,750 --> 00:36:12,790 mutta kaikki tietokoneessa ei on unohtaa missä tuo asuu kiintolevylle. 573 00:36:12,790 --> 00:36:17,870 0s ja 1s joka säveltää ansioluettelosi tai näistä muista tiedostot ovat vielä ennallaan. 574 00:36:17,870 --> 00:36:21,960 >> Joten jos teit tämän vahingossa, siellä on vielä nollasta todennäköisyys 575 00:36:21,960 --> 00:36:25,800 että voit palauttaa tietoja käyttämällä Norton Utilities tai joitakin kaupallisia ohjelmistoja 576 00:36:25,800 --> 00:36:29,810 joiden elämän tarkoitus on löytää 0s ja 1s jotka ovat tavallaan jääneet orvoiksi, 577 00:36:29,810 --> 00:36:33,300 unohdettu täällä mutta lähti täältä, niin että voit saada tiedot takaisin. 578 00:36:33,300 --> 00:36:38,410 Tai oikeuslääketieteen tutkijat poliisin kanssa tai FBI todella ottaa kovalevy 579 00:36:38,410 --> 00:36:42,550 ja todella etsiä malleja 0s ja 1s jotka näyttävät JPEG, näyttää Excel-tiedostoja, 580 00:36:42,550 --> 00:36:46,400 ja palauttaa ne näin vaikka tietokone on unohtanut heidät siellä. 581 00:36:46,400 --> 00:36:49,820 Joten ainoa tapa todella poistaa tietoja, kuten tulemme keskustelemaan tulevaisuudessa, 582 00:36:49,820 --> 00:36:54,190 on pestä tai pyyhkiä tiedoston tai kovalevylle - 583 00:36:54,190 --> 00:36:56,540 Et voi oikeastaan ​​päästä eroon 0s ja 1s 584 00:36:56,540 --> 00:36:59,440 koska muuten olisit aloittaa gigatavun kiintolevy 585 00:36:59,440 --> 00:37:02,380 ja haluat päätyä megatavun kiintolevyn, jos jatkuvasti ollut poistaa, 586 00:37:02,380 --> 00:37:04,380 kirjaimellisesti, 0s ja 1s. 587 00:37:04,380 --> 00:37:06,310 Joten mitä tekisit jos todella halusi peittää jälkesi 588 00:37:06,310 --> 00:37:10,510 ja perustavanlaatuinen ongelma on, että siellä on vielä 0s ja 1s levylle? 589 00:37:10,510 --> 00:37:14,930 Näen jonkun elehti että voisitte fyysisesti rikkoa laitteen. Se toimii. 590 00:37:14,930 --> 00:37:19,600 [Naurua] Mutta jos se on sellainen kallis ratkaisu, mikä olisi järkevämpi? 591 00:37:19,600 --> 00:37:23,270 Joo. >> [Opiskelija] Korvaa ne. >> Korvaa ne mitä? >> [Opiskelija] Muut tiedot. 592 00:37:23,270 --> 00:37:29,070 Muut tiedot. Voit vain korvata levyn kanssa 0s tai 1s tai kaikki 0s, kaikki 1s. 593 00:37:29,070 --> 00:37:31,230 >> Ja se todellakin mitä jotkut ohjelmisto ei. 594 00:37:31,230 --> 00:37:33,570 Voit ostaa ohjelmiston tai edes ilmainen ohjelmisto, 595 00:37:33,570 --> 00:37:36,610 ja jopa rakennettu Mac OS näinä päivinä, ei niinkään Windowsin, 596 00:37:36,610 --> 00:37:38,660 on kyky turvallisesti poistaa. 597 00:37:38,660 --> 00:37:41,960 Oikeastaan, jos haluat kaikki ajaa kotiin tänään, jos sinulla on Mac ja tehdä tämän, 598 00:37:41,960 --> 00:37:45,740 jos sinulla joitakin juttuja teidän roskakoriin, voit tehdä Tyhjennä roskakori turvallisesti, 599 00:37:45,740 --> 00:37:47,610 joka tekee juuri näin. 600 00:37:47,610 --> 00:37:53,350 Sen sijaan vain poistaa tiedostoja tässä, se ei poista 0s ja 1s täällä, 601 00:37:53,350 --> 00:38:01,240 Pikemminkin se vain vaihtaa ne kaikki, esimerkiksi on 0 ja piste, piste, piste. 602 00:38:01,240 --> 00:38:05,330 Joten yksi tulevaisuuden psets todella olla tarkoituksella palauttaa tietoja - 603 00:38:05,330 --> 00:38:08,430 valokuvia, jotka olemme ottaneet ihmisiä, paikkoja ja asioita kampuksella 604 00:38:08,430 --> 00:38:12,810 josta teemme rikosteknisen kuvan digitaalikameran muistikortilta, 605 00:38:12,810 --> 00:38:17,120 joka on täsmälleen sama ajatus - ja sinun täytyy haastaa itse löytää 606 00:38:17,120 --> 00:38:20,160 malleja, jotka edustavat JPEG kiintolevylle, 607 00:38:20,160 --> 00:38:23,610 paljon kuin että entinen opiskelija, jonka sähköpostin luin muutama viikko sitten tein 608 00:38:23,610 --> 00:38:25,860 takaisin sisarensa valokuvat. 609 00:38:25,860 --> 00:38:30,300 Miksi emme ota 5 minuutin tauko täällä, ja me koota enemmän muistia. 610 00:38:33,030 --> 00:38:38,610 Joten tässä Asiat käyvät hieman vaikeaselkoinen, mutta tämä on erittäin tehokas askel 611 00:38:38,610 --> 00:38:40,480 kohti ymmärrystä tämä sitäkin. 612 00:38:40,480 --> 00:38:42,900 Tässä on ohjelma nimeltä pointers.c. 613 00:38:42,900 --> 00:38:45,430 Se on yksi nykypäivän mallikoodia. 614 00:38:45,430 --> 00:38:51,280 Huomaa, että muutaman ensimmäisen rivin, 19 kautta 22, kaikki teemme on jotain GetString 615 00:38:51,280 --> 00:38:54,460 ja palauttaa osoitteen, tallentamalla sen s. 616 00:38:54,460 --> 00:38:58,380 Vastedes on PSET jopa 3 jos haluat mutta PSET 4 ja 617 00:38:58,380 --> 00:39:01,030 jossa voit alkaa ottaa nämä apupyörät pois itse, 618 00:39:01,030 --> 00:39:04,030 ei ole mitään syytä teeskennellä, että jouset enää olemassa. 619 00:39:04,030 --> 00:39:07,030 Se on varmasti kunnossa vain aloittaa sanomalla char *. 620 00:39:07,030 --> 00:39:12,610 >> Sivuhuomautuksena, online viittauksia ja kirjoja voi usein nähdä tähti vieressä muuttuja. 621 00:39:12,610 --> 00:39:15,600 Saatat jopa nähdä tilat noin molemmille puolille. 622 00:39:15,600 --> 00:39:17,680 Kaikki nämä ovat toiminnallisesti oikein. 623 00:39:17,680 --> 00:39:21,180 Nyt kuitenkin, me standardoida tätä lähestymistapaa tehdä super selväksi 624 00:39:21,180 --> 00:39:24,000 että char * on kuin sanoisi merkki osoitin. 625 00:39:24,000 --> 00:39:25,680 Tämä on tietotyypin. 626 00:39:25,680 --> 00:39:28,730 Ja sitten muuttujan nimi on s tässä tapauksessa. 627 00:39:28,730 --> 00:39:31,180 Joten olemme saaneet merkkijono ja olemme kutsuneet sitä s. 628 00:39:31,180 --> 00:39:35,180 Ja sitten täällä huomaa, että olen tekemässä todella vähän metkut. 629 00:39:35,180 --> 00:39:39,080 Tätä kutsutaan osoitin aritmeettinen, mikä on tavallaan erittäin yksinkertainen. 630 00:39:39,080 --> 00:39:41,790 Se vain tarkoittaa, lisätä ja poistaa numeroita osoittimia. 631 00:39:41,790 --> 00:39:43,660 Mutta tämä todella toimii. 632 00:39:43,660 --> 00:39:49,170 Tämä ohjelma ilmeisesti tulostaa merkkijonon s 1 merkki per rivi siten, että lopputulos - 633 00:39:49,170 --> 00:39:54,920 Just niin voimme pilata mihin tämä on menossa, tehdä osoittimia, ajaa osoittimet, haluan zoomata sisään 634 00:39:54,920 --> 00:39:58,940 Nyt haluan kirjoita jotain HELLO ja tyyppi Enter 635 00:39:58,940 --> 00:40:01,080 ja se tulostaa 1 merkki per rivi. 636 00:40:01,080 --> 00:40:04,730 Vuoteen hetki sitten, olisimme tehneet tätä hakasulje notaatio. 637 00:40:04,730 --> 00:40:09,760 Meillä täytyisi varten silmukka ja olimme tehdä printf s [i] ja olimme tehdä sitä uudestaan ​​ja uudestaan ​​ja uudestaan 638 00:40:09,760 --> 00:40:11,950 kenoviivaan n lopussa kunkin rivin. 639 00:40:11,950 --> 00:40:16,800 Mutta tämä ohjelma on erilainen. Tämä ohjelma käyttää, kirjaimellisesti, aritmeettinen. 640 00:40:16,800 --> 00:40:18,860 Joten mitä täällä tapahtuu? 641 00:40:18,860 --> 00:40:24,720 Ensinnäkin, ennen tätä silmukka edes suorittaa, mitä vain olla selkeä, on s oikeastaan? 642 00:40:24,720 --> 00:40:27,270 S on? >> [Opiskelija] osoite. >> Osoite. 643 00:40:27,270 --> 00:40:32,980 >> Ja se on osoite, kun kyseessä on hei, ensimmäinen merkki siitä, että sana, joka on h. 644 00:40:32,980 --> 00:40:37,370 Joten s on, tässä nimenomaisessa esimerkissä, osoite tuntia. 645 00:40:37,370 --> 00:40:41,850 Joten mitä se tarkoittaa tehdä s + i? 646 00:40:41,850 --> 00:40:46,280 No, minä alkaa 0 Tässä varten silmukka. Olemme tehneet sen monta kertaa. 647 00:40:46,280 --> 00:40:49,760 Olen aikoo mennä jopa merkkijonon pituus, ilmeisesti. 648 00:40:49,760 --> 00:40:53,950 Joten ensimmäisen iteraation tämän silmukan, i on luonnollisesti 0. 649 00:40:53,950 --> 00:41:01,740 Joten tämä ilmaus sanoo s + i - vaan s +0--se ilmeisesti vain s. 650 00:41:01,740 --> 00:41:04,320 Joten mikä on * s täällä? 651 00:41:04,320 --> 00:41:08,530 Nyt käytämme tähti hieman eri tavalla. 652 00:41:08,530 --> 00:41:13,080 Anna minun mennä eteenpäin ja päästä eroon t, koska olemme tehneet puhumme t ja kopiot s. 653 00:41:13,080 --> 00:41:15,540 Nyt me vain haluamme kertoa tarinan, johon s. 654 00:41:15,540 --> 00:41:20,090 Ja niin tällä hetkellä, sen jälkeen kun tyyppi merkkijono, meidän maailma näyttää aivan samalla tavalla kuin ennen 655 00:41:20,090 --> 00:41:26,630 vain s tallennetaan osoitteen h ja yleisemmin osoittaen merkkijono Hei. 656 00:41:26,630 --> 00:41:33,170 Jos en nyt tee kaltainen rivi * (t + i), katsotaanpa kokeilla tätä. 657 00:41:33,170 --> 00:41:40,140 Niin * (s + i). Saanen yksinkertaistaa tätä, koska tämä on 0, joten tämä on * (t +0). 658 00:41:40,140 --> 00:41:43,790 No, odota hetki. Yksinkertaistaa edelleen. Tämä on * (t). 659 00:41:43,790 --> 00:41:47,020 No, nyt ovat suluissa typerää, joten nyt haluan vain tehdä * s. 660 00:41:47,020 --> 00:41:50,540 Joten ensimmäisessä iteraatiossa tämän silmukan, että viiva, joka on korostettuna, 26, 661 00:41:50,540 --> 00:41:53,650 on melko vastaa tulostamiseksi. 662 00:41:53,650 --> 00:41:56,040 Mikä on tietotyyppi * s? 663 00:41:56,040 --> 00:42:00,770 Tässä yhteydessä, koska tähti sattuu olemaan vieressä s itse, 664 00:42:00,770 --> 00:42:04,930 mutta tarkemmin, koska emme enää julistaa s, 665 00:42:04,930 --> 00:42:09,730 emme ole luomassa muuttuja enää, ei ole mitään mainintaa char * linjassa 26, 666 00:42:09,730 --> 00:42:14,280 ei ole mitään mainintaa avainsanan merkkijonon, olemme vain käyttämällä muuttuja nimeltä s, 667 00:42:14,280 --> 00:42:19,650 se osoittautuu nyt tähti on hieman erilainen ja kieltämättä sekava merkitys. 668 00:42:19,650 --> 00:42:26,590 * S tarkoittaa tässä mene osoitteeseen s ja tulostaa mitä on olemassa. 669 00:42:26,590 --> 00:42:33,750 Joten s on täällä, * s on - tavallaan kuin liukumäet ja tikkaat, noudata nuoli - täällä. 670 00:42:33,750 --> 00:42:35,850 Joten tämä on * s. 671 00:42:35,850 --> 00:42:39,060 >> Joten mitä saa painettu ensimmäistä iterointia kyseisen silmukan rivi 26? 672 00:42:39,060 --> 00:42:42,170 Olen tulostaa% C, joka on tilapäinen luonne, 673 00:42:42,170 --> 00:42:48,520 Sitten \ n uuden linjan. * (T + i) missä i on 0 on juuri tämä. 674 00:42:48,520 --> 00:42:53,670 Joten mitä char asetan in% C? H. 675 00:42:53,670 --> 00:42:56,900 Seuraavalla iterointia silmukan - voit todennäköisesti nähdä mihin tämä on menossa - 676 00:42:56,900 --> 00:43:01,350 seuraavan iteraation i on tietenkin 1, joten tämä merkitsee sitä, s +1, 677 00:43:01,350 --> 00:43:05,580 ja sitten nyt en tarvitse suluissa koska nyt tähti tarvitsee sanoa 678 00:43:05,580 --> 00:43:08,620 Siirry muistiosoite s +1. 679 00:43:08,620 --> 00:43:14,170 Mikä on s? Mennään rullata ajassa taaksepäin ja sanoa nuoli nyt ei oikeastaan ​​tee meille mitään palveluksia. 680 00:43:14,170 --> 00:43:18,450 Oletetaan tarkemmin sanoa, että tämä on tallennetaan numero 123 681 00:43:18,450 --> 00:43:25,110 koska alusta tämän merkkijonon hello, tämä on osoite 123, tämä on 124, ja niin edelleen. 682 00:43:25,110 --> 00:43:30,550 Joten toisen iteroinnin kun sanon s +1, se on kuin sanoisi 123 +1, 683 00:43:30,550 --> 00:43:35,340 muuten kutsutaan 124, niin mitä char saa painaa toista iterointia? 684 00:43:35,340 --> 00:43:37,850 E muistiosoite 124. 685 00:43:37,850 --> 00:43:44,440 Sitten + taas, 125, 126, 127, ja tämä silmukka onneksi pysähtyy ennen kuin saamme täällä 686 00:43:44,440 --> 00:43:49,040 koska olen käyttäen strlen varmistaa, että i ei lasketa liian korkea. 687 00:43:49,040 --> 00:43:50,810 Niin sekin on sitä. 688 00:43:50,810 --> 00:43:55,000 Tämäkin on aivan kuin olisimme tehneet viikko sitten. 689 00:43:55,000 --> 00:43:59,200 Saanen kirjoittaa sen linjan alapuolella, vaikka emme halua tehdä molempia. 690 00:43:59,200 --> 00:44:02,500 Tämä on identtinen nyt tähän. 691 00:44:02,500 --> 00:44:08,310 >> Joten vaikka s on merkkijono, kuten olemme vaatineet sitä viikkoja, s on todella char *. 692 00:44:08,310 --> 00:44:13,270 Joten jos haluamme olla super anaali, se on todella oikea kirjoittaa erityisluonteen 693 00:44:13,270 --> 00:44:17,490 klo nteen paikkaan käyttämällä näitä numeerisia osoitteita ja tämän tähden operaattori, 694 00:44:17,490 --> 00:44:20,470 mutta suoraan sanottuna, tämä on vain niin paljon puhtaampaa. Joten tämä ei ole huono. 695 00:44:20,470 --> 00:44:26,720 Ei syytä lakata tekemästä linja 27 täällä, mutta 26 on toiminnallisesti sama, 696 00:44:26,720 --> 00:44:31,570 ja se on toiminnallisesti sama juuri syistä olemme keskustelleet toistaiseksi. 697 00:44:31,570 --> 00:44:33,650 Ja lopuksi, 29 on aivan hyviä käytäntöjä. 698 00:44:33,650 --> 00:44:38,420 Soittaminen ilmaiseksi s tarkoittaa, että nyt annat takaisin muistin GetString antoi sinulle 699 00:44:38,420 --> 00:44:41,630 koska jälleen, kuten mainitsin maanantaina GetString viikkoja 700 00:44:41,630 --> 00:44:44,180 on käyttöön bug omaan koodia. 701 00:44:44,180 --> 00:44:46,490 Koodi viikkoja on ollut muistivuotoja 702 00:44:46,490 --> 00:44:49,970 jolloin olet pyytänyt GetString muistin, mutta et ole koskaan antaneet sitä takaisin. 703 00:44:49,970 --> 00:44:53,410 Ja se oli tietoisesti valinnut meidät pedagogisesti 704 00:44:53,410 --> 00:44:55,880 koska se on aivan liian paljon ajateltavaa varhain. 705 00:44:55,880 --> 00:44:57,710 Mutta nyt me tarvitsemme enemmän symmetria. 706 00:44:57,710 --> 00:45:00,830 Jos pyytää tietokoneen muistiin, kuten on asian laita GetString, 707 00:45:00,830 --> 00:45:02,820 kuten on ilmeisesti malloc, 708 00:45:02,820 --> 00:45:07,970 sinun on nyt PSET 4 edelleen myös ilmainen tällaista muistia. 709 00:45:07,970 --> 00:45:11,650 Huomaa että tämä on eri asia kuin ajatus int n. 710 00:45:11,650 --> 00:45:15,040 Sinun ei tarvitse vapauttaa tämän, koska et soita GetString 711 00:45:15,040 --> 00:45:16,890 ja te ette soita malloc. 712 00:45:16,890 --> 00:45:20,610 >> Ja vaikka et kutsutaan GetInt kuten tulemme lopulta nähdä, 713 00:45:20,610 --> 00:45:25,520 GetInt ei varata muistia sinulle, koska voit itse kulkea ympäri kokonaislukuja 714 00:45:25,520 --> 00:45:29,430 ja kellukkeet ja merkkiä juuri niin olemme tehneet jo viikkoja. 715 00:45:29,430 --> 00:45:33,960 Strings kuitenkin ovat erityisiä, koska todellisuudessa he ketjutus useiden merkkiä. 716 00:45:33,960 --> 00:45:37,450 Joten he vain eri merkkiä ja kellukkeet ja ints ja vastaavat. 717 00:45:37,450 --> 00:45:39,980 Mutta tulemme takaisin, että ennen pitkää. 718 00:45:39,980 --> 00:45:44,920 Kaikki kysymykset sitten tämä alku viitteitä? Joo. 719 00:45:44,920 --> 00:45:49,690 [Äänetön opiskelija kysymys] 720 00:45:49,690 --> 00:45:51,440 Ah, erittäin hyvä kysymys. 721 00:45:51,440 --> 00:45:55,790 Yksi harvoista asioista, C todella tekee teille, mikä on kätevää, 722 00:45:55,790 --> 00:46:00,110 on se keksii teille mitä kokoa on tietotyyppi 723 00:46:00,110 --> 00:46:03,060 ja sitten tekee tuollaista kertolasku sinulle. 724 00:46:03,060 --> 00:46:06,610 Tämä ei ole merkitystä, jos merkkiä, koska lähes aina char on 1 tavu, 725 00:46:06,610 --> 00:46:08,150 joten tämä vain toimii. 726 00:46:08,150 --> 00:46:11,220 Mutta vuoksi keskustelun, olisit itse tulostaa kokonaislukuja 727 00:46:11,220 --> 00:46:15,500 ja yritit tulostaa jotain arvoa tuo oli osoittaen kokonaisluku, 728 00:46:15,500 --> 00:46:20,720 te samalla ei tarvitse tehdä + 4 * En vain siksi, int on 4 tavua. 729 00:46:20,720 --> 00:46:25,780 Pointer aritmeettinen keskiarvo, että C-ja kääntäjä tehdä kaikki matematiikka sinulle. 730 00:46:25,780 --> 00:46:29,190 Sinun tarvitsee välität on laskennan eräänlainen ihmisen mielessä. Joo. 731 00:46:29,190 --> 00:46:35,200 [Opiskelija] Jos julistaa merkkijono sisällä on silmukan, sinun täytyy vapauttaa sen myöhemmin? 732 00:46:35,200 --> 00:46:36,760 Hyvä kysymys. 733 00:46:36,760 --> 00:46:41,390 >> Jos ilmoitettu merkkijono sisällä on silmukka, sinun täytyy vapauttaa sitä myöhemmin? 734 00:46:41,390 --> 00:46:47,520 Sinun tarvitsee vain vapaan muistin että jakaa kanssa GetString tai malloc. 735 00:46:47,520 --> 00:46:53,110 Joten jos vain sanoa jotain - haluan laittaa aaltosulkeita nyt niin kaikki koodi liittyy. 736 00:46:53,110 --> 00:46:58,580 Jos teit jotain, vaikkakin buggily, kuten tämä, char * t = s, 737 00:46:58,580 --> 00:47:03,450 sinun ei tarvitse maksuton t koska t ei liittynyt mitään mainintaa malloc tai GetString. 738 00:47:03,450 --> 00:47:08,960 Jos sitä vastoin teit tämän, GetString, niin kyllä, sinun pitäisi maksuton t. 739 00:47:08,960 --> 00:47:14,350 Ja itse asiassa, ainoa mahdollisuus tehdä se nyt on sisällä tämän silmukan, saman kysymyksen soveltamisala 740 00:47:14,350 --> 00:47:16,060 että olemme keskustelleet aikaisemmin. 741 00:47:16,060 --> 00:47:18,830 Muuten olisit jaettaessa muisti, jaettaessa muisti, jakaminen muisti, 742 00:47:18,830 --> 00:47:21,230 ja ohjelman lopussa, koska olet ulkopuolella että silmukan, 743 00:47:21,230 --> 00:47:24,240 T ei ole olemassa, mutta et koskaan kertonut käyttöjärjestelmä 744 00:47:24,240 --> 00:47:26,750 että et tarvitse tuota muistia enää. 745 00:47:26,750 --> 00:47:30,430 Ja ennen pitkää, sillä PSET 4 tai 5 me varustaa sinulle ohjelma nimeltä Valgrind, 746 00:47:30,430 --> 00:47:34,160 joka on hengeltään samanlaisia ​​GDB että se sai jokseenkin vaikeaselkoinen käyttöliittymä, 747 00:47:34,160 --> 00:47:35,750 mutta sen tarkoitus elämässä on auttaa sinua. 748 00:47:35,750 --> 00:47:39,380 Ja Valgrind on ohjelma, joka tulee jatkossa etsiä ohjelmia 749 00:47:39,380 --> 00:47:42,550 etsivät muistivuotoja, olipa GetString tai malloc, 750 00:47:42,550 --> 00:47:47,800 jonka aloitamme käyttää kaikkia enemmän kuin me lopeta CS50 kirjastoa niin paljon. 751 00:47:47,800 --> 00:47:53,030 Olemme vihdoin nyt tavallaan sanastoa ja tavallaan mentaalinen malli teoriassa 752 00:47:53,030 --> 00:47:55,170 jolla ratkaista tämä rikki ohjelman. 753 00:47:55,170 --> 00:47:59,410 >> Joten tässä rikki ohjelmassa swap toimii sisällä swap, 754 00:47:59,410 --> 00:48:05,280 mutta se ei koskaan todella toiminut pääasiassa koska pääasiassa kului x ja y, Recall, 755 00:48:05,280 --> 00:48:07,260 ja ne kuluivat arvot ovat niin sanotusti. 756 00:48:07,260 --> 00:48:09,330 Jäljennökset niistä annettiin vaihtaa. 757 00:48:09,330 --> 00:48:12,520 Vuoden swap, ja b oli todellakin vaihdettu, 758 00:48:12,520 --> 00:48:16,120 mutta tietenkin x ja y, kuten olemme keskustelleet maanantaina, ei ollut. 759 00:48:16,120 --> 00:48:19,940 Joten ehdotan vihreä täällä, että tämä on todella ratkaisu tähän. 760 00:48:19,940 --> 00:48:22,640 Ja itse asiassa, haluaisin siirtää minun tähdet vain oltava 761 00:48:22,640 --> 00:48:24,440 vaikka jälleen toiminnallisesti tämä ei ole väliä. 762 00:48:24,440 --> 00:48:28,730 Tulevaisuudessa viikkoa kerromme, milloin ja miksi sillä on väliä. 763 00:48:28,730 --> 00:48:30,600 Joten vihreä on nyt ratkaisu. 764 00:48:30,600 --> 00:48:33,700 Suoraan sanottuna se näyttää paljon Messier koska minulla on kaikki nämä tähdet. 765 00:48:33,700 --> 00:48:35,380 Saanen huomauttaa yhden asian. 766 00:48:35,380 --> 00:48:40,040 Ylärivillä täällä missä lukee int * ja int * b 767 00:48:40,040 --> 00:48:42,820 on pohjimmiltaan tekee samaa kuin se on aina tehnyt. 768 00:48:42,820 --> 00:48:47,070 Se julistaa 2 argumentteja tai parametreja vaihtaa, 769 00:48:47,070 --> 00:48:49,940 joista ensimmäinen on int osoitin kutsutaan, 770 00:48:49,940 --> 00:48:53,100 joista toinen on int osoitin nimeltään b. 771 00:48:53,100 --> 00:48:55,770 Ainoa asia, joka on uutta tässä vaiheessa on se, että siellä on tähti siellä. 772 00:48:55,770 --> 00:48:59,340 >> Mitä se tarkoittaa? A ei ole int, b ei ole int. 773 00:48:59,340 --> 00:49:04,100 A on osoite int ja b on osoite eri int. 774 00:49:04,100 --> 00:49:06,980 Tänne, tämä on kun myönnän C saa hämmentävää. 775 00:49:06,980 --> 00:49:09,790 Nyt käytämme tähti, mutta se on eri merkitys tässä yhteydessä. 776 00:49:09,790 --> 00:49:13,150 Koska emme julistaa osoittimet kuten me täällä, 777 00:49:13,150 --> 00:49:15,500 Tässä olemme dereferencing asioita. 778 00:49:15,500 --> 00:49:21,520 Niinpä teknisesti tähden tässä yhteydessä ensimmäisen, toisen ja kolmannen rivin sisällä swap 779 00:49:21,520 --> 00:49:24,560 on dereference toimija, mikä tarkoittaa vain mennä sinne. 780 00:49:24,560 --> 00:49:27,400 Joten minun sormi seurasi nuoli h, 781 00:49:27,400 --> 00:49:31,100 * Tarkoittaa mene tähän osoitteeseen ja löytää minua int se siellä. 782 00:49:31,100 --> 00:49:34,250 * B keino mennä osoitteeseen ja välittää minulle mitä siellä. 783 00:49:34,250 --> 00:49:40,730 Joten piirtää kuva maanantaista käyttävät nyt pino kehyksiä, 784 00:49:40,730 --> 00:49:43,130 pohja joista yksi tulee olemaan pää-, 785 00:49:43,130 --> 00:49:47,600 ylempi joista yksi tulee olemaan swap, 786 00:49:47,600 --> 00:49:50,880 niin että maailma näyttää, kuten maanantaina näin. 787 00:49:50,880 --> 00:49:53,620 Tässä on kimpale muistin että pääasiallinen aikoo käyttää. 788 00:49:53,620 --> 00:49:56,520 >> Muistamme maanantaina, että ohjelma oli vain 2 muuttujaa, 789 00:49:56,520 --> 00:50:01,930 yksi nimeltään x ja yksi nimeltään Y, ja olin laittanut numerot 1 ja 2 on. 790 00:50:01,930 --> 00:50:06,580 Nyt kun vuorottelu kuten tein maanantaina, 791 00:50:06,580 --> 00:50:11,000 Aiemmin kun käytin punaista versio ohjelmasta, joka näyttää tältä, 792 00:50:11,000 --> 00:50:17,470 Sain 2 parametrit, ja b, ja mitä me kirjoitamme täällä ja täällä? 793 00:50:17,470 --> 00:50:21,160 Vain 1 ja 2, kirjaimellisesti kopioi x-ja y. 794 00:50:21,160 --> 00:50:23,070 Tänään muuttaa. 795 00:50:23,070 --> 00:50:28,510 Tänään sen sijaan kulkevat ints ja b aiomme kulkea 2 osoitteet. 796 00:50:28,510 --> 00:50:34,290 Nämä osoitteet sattuvat osoittamaan ints, mutta näitä osoitteita ei ints itse. 797 00:50:34,290 --> 00:50:37,330 Ne ovat osoitteita. Se on kuin postiosoite sijaan. 798 00:50:37,330 --> 00:50:40,580 Joten nyt meidän täytyy vain antaa itselleni hieman tarkemmin näytöllä. 799 00:50:40,580 --> 00:50:43,250 Tämä on minun tietokoneen muistiin kuin se on ollut koko päivän. 800 00:50:43,250 --> 00:50:45,120 Nyt tarvitsemme mielivaltainen numerointi. 801 00:50:45,120 --> 00:50:50,580 Joten vain sanoa, vain sattumalta, että tämä on muistin osoite 123, 124. 802 00:50:50,580 --> 00:50:55,660 Sanotaan vain se 125, tämä on 126, ja niin edelleen, mutta se on täysin mielivaltainen. 803 00:50:55,660 --> 00:50:58,590 Meidän täytyy vain muutamia numerointia mieleeni. 804 00:50:58,590 --> 00:51:04,030 Joten nyt kun olen itse kulkea x ja y, en aio kulkea x ja y; 805 00:51:04,030 --> 00:51:08,400 Aion kulkea postiosoite, niin sanoakseni, x ja y 806 00:51:08,400 --> 00:51:11,870 niin että mitä saa säilyttää täällä ja täällä ei ole 1 ja 2, 807 00:51:11,870 --> 00:51:16,030 mutta jos et voi nähdä minun pieni tekstitiedosto, mitä saa siirtää täällä ja täällä? 808 00:51:16,030 --> 00:51:23,340 [Äänetön opiskelija vastausta] >> Aivan. 123 saa laittaa tänne ja 124 saa laittaa tänne. 809 00:51:23,340 --> 00:51:28,910 >> Nyt, koska käytin tähdittävät ensimmäinen rivi asti täällä ylhäällä, 810 00:51:28,910 --> 00:51:34,340 minun ohjelma juuri tietää, että 123 ja 124, vaikka he ilmeisesti kokonaislukuja 811 00:51:34,340 --> 00:51:40,160 että ihminen voisi huomata, ne tulisi tulkita osoitteita, numeerinen osoite. 812 00:51:40,160 --> 00:51:43,250 Ne eivät ole ja itse ints, he osoitteita, 813 00:51:43,250 --> 00:51:46,120 ja se, koska olen nimenomaan laittaa tähdet siellä. 814 00:51:46,120 --> 00:51:51,360 Joten nyt minun ensimmäinen, toinen ja kolmas rivi varsinaisen koodin mitä täällä tapahtuu? 815 00:51:51,360 --> 00:51:53,380 Katsotaan kiinnittää muu kuva. 816 00:51:53,380 --> 00:51:56,980 Tmp on aivan kuten se oli maanantaina. Mitään erityistä tmp. 817 00:51:56,980 --> 00:52:03,060 Se on vain paikallinen 32 bittiä muuttuja, ja sisällä että olen ilmeisesti tallennetaan arvo *. 818 00:52:03,060 --> 00:52:08,580 Nyt, jos olen vain sanonut tmp =, mitä laitoin tänne? >> [Opiskelija] 123. 819 00:52:08,580 --> 00:52:10,370 123. Mutta se ei ole, mitä olen tekemässä. 820 00:52:10,370 --> 00:52:13,670 Sanon tmp = *. Star keinoin sinne. 821 00:52:13,670 --> 00:52:19,370 Joten tässä on, 123. Miten pääsen sinne? Teeskennellä siellä nuoli. 822 00:52:19,370 --> 00:52:24,460 No, siinä se on, 1. Joten mitä saa säilyttää tmp, ilmeisesti? Vain 1. 823 00:52:24,460 --> 00:52:29,620 Eli toisin sanoen, tmp on *, * välineet mennä osoite, joka on tällä hetkellä, 824 00:52:29,620 --> 00:52:31,320 , joka on ilmeisesti 123. 825 00:52:31,320 --> 00:52:33,910 >> Okei, täällä ollaan paikassa 123, näen numero 1, 826 00:52:33,910 --> 00:52:35,670 joten aion laittaa numero 1 siellä. 827 00:52:35,670 --> 00:52:39,020 Nyt mitä teen linjassa 2, * = * b? 828 00:52:39,020 --> 00:52:44,570 Tämä yksi on hieman enemmän mukana, koska mitä nyt on? Se on 123. 829 00:52:44,570 --> 00:52:50,220 Joten * on missä? Oikea missä olin ennen. Joten mene sinne. Okei. 830 00:52:50,220 --> 00:52:53,420 Nyt, lopuksi, ja lopulta tämä alkaa järkeä, toivottavasti, 831 00:52:53,420 --> 00:53:00,280 * B tarkoittaa mitä on b? 124. Joten minun täytyy mennä sinne, mikä on 2. 832 00:53:00,280 --> 00:53:03,430 Joten mitä laitoin minne? 833 00:53:03,430 --> 00:53:10,100 2 menee täällä, koska * b menee *. Joten teen sen. 834 00:53:10,100 --> 00:53:13,120 Ja voit jo nähdä, ehkä, että olemme niin paljon lähempänä 835 00:53:13,120 --> 00:53:17,710 ratkaisemisen tyhmä, yksinkertainen ongelma oikein ensimmäistä kertaa 836 00:53:17,710 --> 00:53:20,920 koska nyt meillä on vielä muistikuva mitä x oli, 837 00:53:20,920 --> 00:53:23,230 meillä on 2 kappaletta, tosin y, 838 00:53:23,230 --> 00:53:25,850 mutta linja 3 sanoo nyt * b. 839 00:53:25,850 --> 00:53:31,080 Joten tässä b.. * B keinoin sinne. Joten missä on paikka 124? 840 00:53:31,080 --> 00:53:35,560 Se on ilmeisesti täällä. Joten mitä laitan tänne? On selvää, tmp. 841 00:53:35,560 --> 00:53:39,600 Joten nyt teen tämän. Joten minulla on 1 täällä ja 2 täällä. 842 00:53:39,600 --> 00:53:43,560 Ja nyt, mitä tästä kaikesta, 123, 124, ja 1? 843 00:53:43,560 --> 00:53:47,910 Heti kun swap palaa, tämä muisti on yhtä hyvä kuin menetetty 844 00:53:47,910 --> 00:53:51,070 sillä pian swap palaa, käyttöjärjestelmä 845 00:53:51,070 --> 00:53:54,190 käyttö on ilmaista, että muistin uudelleen tulevaisuudessa. 846 00:53:54,190 --> 00:53:58,870 Vain tärkeimmät muistiin alareunassa tämän ns pino tikkuja ympärille. 847 00:53:58,870 --> 00:54:01,470 >> Ja niin meillä on vihdoinkin nyt toimiva versio. 848 00:54:01,470 --> 00:54:06,310 Sallikaa minun mennä swap.c, ja huomaa seuraavat. 849 00:54:06,310 --> 00:54:11,280 Ylimpänä ohjelman Muutin prototyyppi on int * ja int * b. 850 00:54:11,280 --> 00:54:15,000 Joten ainoa asia muuttunut mennä punainen, mikä oli huono, vihreään, mikä on hyvä, 851 00:54:15,000 --> 00:54:17,350 on Lisäsin nämä tähdet tänään. 852 00:54:17,350 --> 00:54:21,520 Mutta sitten alas täällä vaihtaa itse jouduin kopioida, liittää mitä vain diassa. 853 00:54:21,520 --> 00:54:24,140 Olen tähti täällä, tähti täällä - joka vastaa prototyyppi - 854 00:54:24,140 --> 00:54:27,930 ja sitten kaikki nämä asiat nyt Tähteä paitsi tmp 855 00:54:27,930 --> 00:54:30,680 koska käytön väliaikainen muuttuja, ei mitään uutta siellä. 856 00:54:30,680 --> 00:54:33,040 Tarvitsen vain tilapäiseen varastointiin int. 857 00:54:33,040 --> 00:54:34,820 Joten emme tarvitse tähti siellä. 858 00:54:34,820 --> 00:54:39,310 Meidän täytyy vain tähti, jotta voimme ylittää tällainen mielivaltainen rajan 859 00:54:39,310 --> 00:54:42,900 näiden 2 kehykset tietokoneen muistiin. 860 00:54:42,900 --> 00:54:45,630 Mutta yksi asia on muututtava, ja olet ehkä keksineet sen jo. 861 00:54:45,630 --> 00:54:48,810 Mitä muita linja on selvästi erilainen nyt? >> [Opiskelija] & x. 862 00:54:48,810 --> 00:54:53,270 >> Joo, niin 25 on viimeinen koodirivi minun täytyy muuttaa, jotta tämä toimisi. 863 00:54:53,270 --> 00:54:58,360 Viikko sitten ja jopa maanantaina linjan 25 näytti tältä, vaihda x ja y, 864 00:54:58,360 --> 00:55:02,020 ja tämä oli juuri rikki koska jos sanot swap (x, y) 865 00:55:02,020 --> 00:55:05,660 annat kopioita x ja y vaihtaa, niin se tekee sen asian, 866 00:55:05,660 --> 00:55:09,080 mutta et koskaan todella muuttuu x-ja y itsensä. 867 00:55:09,080 --> 00:55:12,880 Joten vaikka et ole koskaan nähnyt tätä merkkiä ennen kanssa et-koodin, 868 00:55:12,880 --> 00:55:15,860 vain arvata. Mitä et-tee, ilmeisesti? 869 00:55:15,860 --> 00:55:17,890 [Opiskelija] Tulee osoitteen. >> Tulee osoitteen. 870 00:55:17,890 --> 00:55:21,160 Joten et-sanoo anna minulle osoitteen x. 871 00:55:21,160 --> 00:55:25,590 Kuka tietää missä se on? Se sattuu olemaan 123. En välitä. Vain antaa minulle osoitteen x. 872 00:55:25,590 --> 00:55:28,340 Ja y tarkoittaa antaa minulle osoite y. 873 00:55:28,340 --> 00:55:34,450 Ja tässä vaiheessa tarina on täysin yhdenmukainen kuva laadimme hetki sitten. 874 00:55:34,450 --> 00:55:38,310 >> Joten minä myönnän osoittimia, varmasti minulle kun aloitin oppiminen tätä, 875 00:55:38,310 --> 00:55:40,570 oli ehdottomasti yksi vaikeimmista asioista kääri mieleeni ympäri. 876 00:55:40,570 --> 00:55:43,760 Mutta ymmärtää, varsinkin kun pidämme leikkivät tällaisia ​​asioita, 877 00:55:43,760 --> 00:55:48,030 jos murtaa se alas nämä super yksinkertainen eräänlainen älyllisesti mielenkiinnoton ongelmia 878 00:55:48,030 --> 00:55:52,270 vain liikkuvat numeroiden ympärillä, vastaus paljon sekaannusta osoittimet 879 00:55:52,270 --> 00:55:56,590 todellakin voi olla peräisin näistä hyvin perus mekaniikka. 880 00:55:56,590 --> 00:55:59,070 Tässä osoite. Mene sinne tähti. 881 00:55:59,070 --> 00:56:03,830 Tai päinvastoin, tässä on et-. Selvittää, mitä osoitetta todellisuudessa on. 882 00:56:03,830 --> 00:56:06,270 Selvä. 883 00:56:06,270 --> 00:56:09,000 Eli jos on kaikki tämä muisti tulevat? 884 00:56:09,000 --> 00:56:12,360 Olemme vetää tätä kuvaa pari kertaa, ja pidän lupaavia Palaamme siihen, 885 00:56:12,360 --> 00:56:14,920 mutta tässä on edustus tietokoneen muistiin 886 00:56:14,920 --> 00:56:17,420 joka on hieman enemmän leimattua kuin meidän liitutaulu täällä on. 887 00:56:17,420 --> 00:56:21,590 Tekstin segmentti ylhäällä edustaa mitä suhteen ohjelma? 888 00:56:21,590 --> 00:56:26,090 [Äänetön opiskelija vastausta] >> Sorry? Sano uudestaan. 889 00:56:26,090 --> 00:56:28,660 [Opiskelija] varsinainen ohjelma. >> Varsinainen ohjelma. 890 00:56:28,660 --> 00:56:32,430 >> Joten 0s ja 1s että olet kääntänyt kirjoituksen jälkeen C-koodin ja sitten käynnissä clang 891 00:56:32,430 --> 00:56:35,910 ja tuottaa 0s ja 1s päätyy saamaan työntää sinne muistiin 892 00:56:35,910 --> 00:56:38,570 koska kun kaksoisnapsauttamalla kuvaketta Mac tai PC 893 00:56:38,570 --> 00:56:43,010 tai suorittaa komennon kuten Mario teidän nopeaa, sinun 0s ja 1s levyltä 894 00:56:43,010 --> 00:56:45,700 latautuvat muistiin, jotta tietokone voi manipuloida niitä 895 00:56:45,700 --> 00:56:47,540 ja suorittaa ne nopeammin. 896 00:56:47,540 --> 00:56:50,880 Joten alustettu data ja alustamaton tietoja, emme puhu paljon niitä, 897 00:56:50,880 --> 00:56:52,420 mutta nämä ovat vain globaaleja muuttujia. 898 00:56:52,420 --> 00:56:54,710 Alustettu tarkoittaa globaalien muuttujien että annoit arvoja; 899 00:56:54,710 --> 00:56:59,300 alustamaton tarkoittaa globaalien muuttujien jotka ette vielä anna arvot. 900 00:56:59,300 --> 00:57:01,900 Sitten on nämä ympäristömuuttujat jonka minä täysin vilkuttaa käteni, 901 00:57:01,900 --> 00:57:04,860 mutta ne ovat olemassa ja että tallentaa asioita, kuten käyttäjänimesi 902 00:57:04,860 --> 00:57:08,090 ja muu sellainen alemman tason yksityiskohtia. 903 00:57:08,090 --> 00:57:12,880 Mutta juiciest kappaletta muisti layout on tämä asia sanottu pino ja keko. 904 00:57:12,880 --> 00:57:17,470 Pino taas olla selkeä, on muisti, jota käytetään aina funktiot, 905 00:57:17,470 --> 00:57:19,710 jos on paikallisia muuttujia 906 00:57:19,710 --> 00:57:22,120 ja jos on parametrien kiertämään. 907 00:57:22,120 --> 00:57:24,490 Kaikki tämä tapahtuu pinon. 908 00:57:24,490 --> 00:57:29,570 Kasan emme ole puhuneet, mutta arvata kuka käyttää kasaan. 909 00:57:31,120 --> 00:57:32,690 Vain eri kimpale muistia. 910 00:57:32,690 --> 00:57:36,620 Se tapahtuu laaditaan täällä huipulla, mutta se mielivaltainen kuvallinen yleissopimuksen. 911 00:57:36,620 --> 00:57:41,670 Kuka ilmeisesti käyttää muistia kasan viikkoja? 912 00:57:41,670 --> 00:57:44,830 Se on teknisesti sinua vaan välillisesti. >> [Opiskelija] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString ja malloc. Joten tässä on perustavanlaatuinen ero. 914 00:57:47,950 --> 00:57:51,300 >> Tiedät että viime viikkoina, että jos tarvitset muistia, vain julistaa muuttuja. 915 00:57:51,300 --> 00:57:54,560 Jos tarvitset paljon muistia, julistaa joukko oikeus sisällä oman toiminnan. 916 00:57:54,560 --> 00:57:59,620 Mutta ongelma olemme pitäneet edessä on jos julistaa muuttujia paikallisesti sisällä toimintoja, 917 00:57:59,620 --> 00:58:05,340 heti kun funktio palauttaa, mitä tapahtuu muistiin ja nämä muuttujat? 918 00:58:05,340 --> 00:58:09,620 Vain eräänlainen se ei ole enää sinun, eikö? Se katoaa eräänlainen käsitteellisesti. 919 00:58:09,620 --> 00:58:13,950 Se on edelleen fyysisesti siellä, tietenkin, mutta se ei ole enää asiakkaan oikeus käyttää. 920 00:58:13,950 --> 00:58:17,160 Tämä on tietysti ongelmallista, jos haluat kirjoittaa toimintojen elämässä 921 00:58:17,160 --> 00:58:20,440 että todella varata muistia ja älä anna sitä takaisin välittömästi. 922 00:58:20,440 --> 00:58:24,180 Asia kohtaan: GetString n tarkoitus elämässä on ole aavistustakaan etukäteen 923 00:58:24,180 --> 00:58:26,390 kuinka suuri merkkijono aion kirjoittaa on näppäimistö, 924 00:58:26,390 --> 00:58:30,390 mutta se täytyy pystyä varata muistia pitää David tai hei 925 00:58:30,390 --> 00:58:32,860 tai kokonainen essee että käyttäjä ehkä kirjoitettu sisään 926 00:58:32,860 --> 00:58:35,280 Joten GetString on käyttänyt malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc vuoksi täytyy käyttää ei pinon; 928 00:58:38,910 --> 00:58:40,770 vaan se käyttää tämä asia sanottu kasaan. 929 00:58:40,770 --> 00:58:44,430 Ei ole mitään erilaista muistia. Se ei ole nopeampi tai hitaampi tai mitään sellaista. 930 00:58:44,430 --> 00:58:46,570 Se on vain fyysisesti eri paikassa. 931 00:58:46,570 --> 00:58:50,120 >> Mutta sääntö on, että muisti, joka on varattu kasaan 932 00:58:50,120 --> 00:58:56,180 ei koskaan oteta pois, kunnes soitat - ottaa arvata - ilmaiseksi. 933 00:58:56,180 --> 00:59:00,510 Sen sijaan kaikki muisti pyydät pinoon vain hieman julistamalla array 934 00:59:00,510 --> 00:59:03,320 tai julistetaan muuttujan kuten olemme tehneet jo viikkoja, 935 00:59:03,320 --> 00:59:05,640 että oletuksena päätyy pinoon. 936 00:59:05,640 --> 00:59:09,550 Ja se toimii hyvin 90% ajasta, mutta niitä harvinaisempia otteeseen 937 00:59:09,550 --> 00:59:12,470 minne haluat varata muistia ja pitää sen ympärillä, 938 00:59:12,470 --> 00:59:14,730 Sitten sinun täytyy käyttää toimintoa kuten malloc. 939 00:59:14,730 --> 00:59:19,370 Tai olemme käyttäneet toiminto, kuten GetString, joka puolestaan ​​käyttää malloc. 940 00:59:19,370 --> 00:59:23,300 Katsotaan jos tämä voi murtaa ja sitten kurkistaa Binky. 941 00:59:23,300 --> 00:59:25,820 Palaamme siihen tulevaisuudessa. 942 00:59:25,820 --> 00:59:29,270 Täällä on erittäin yksinkertainen ohjelma, joka on ensimmäisen 2 riviä tekee mitä? 943 00:59:29,270 --> 00:59:33,460 Englanti, mitä nämä ensimmäiset 2 riviä koodia tehdä sisällä tärkein? 944 00:59:33,460 --> 00:59:35,600 [Äänetön opiskelija vastausta] 945 00:59:35,600 --> 00:59:37,880 Varovasti. Se ei anna minulle osoite x tai y. 946 00:59:37,880 --> 00:59:41,840 [Opiskelija] Antaa viitteitä ints. >> Hyvä. Anna minulle 2 osoittimia kokonaislukuja. 947 00:59:41,840 --> 00:59:45,130 Toisin sanoen, anna minulle 2 paloina muistin että minun pitää piirustus tänään 948 00:59:45,130 --> 00:59:46,950 vaikka en hävitä sitä nyt, kuten neliöitä. 949 00:59:46,950 --> 00:59:50,000 Anna minulle 2 paloina muistia, yksi nimeltään x, yksi nimeltään Y - 950 00:59:50,000 --> 00:59:54,320 aikaisemmin Kutsuin heitä s ja t - ja mikä on sen tyyppinen, että kimpale muistia? 951 00:59:54,320 --> 00:59:57,160 Se tulee tallentaa osoitteen. 952 00:59:57,160 --> 00:59:59,110 Se on tyyppiä int *. 953 00:59:59,110 --> 01:00:01,630 >> Joten osoitteen int lopulta elää x, 954 01:00:01,630 --> 01:00:03,860 osoite int lopulta elää y, 955 01:00:03,860 --> 01:00:08,460 mutta aluksi, mitä sisällä x ja y? Kuka tietää? Garbage arvot. 956 01:00:08,460 --> 01:00:10,180 Sillä ei ole mitään tekemistä viitteitä. 957 01:00:10,180 --> 01:00:12,720 Jos emme ole laittaneet jotain siellä, kuka tietää mitä todellisuudessa on? 958 01:00:12,720 --> 01:00:18,950 Nyt, x. Mitä täällä tapahtuu? Tämä on legit nyt, koska x on osoitin. Se on int *. 959 01:00:18,950 --> 01:00:21,870 Joten se tarkoittaa, että voin laittaa x osoitteen joidenkin palan muistia. 960 01:00:21,870 --> 01:00:25,120 Mitä malloc palaa? Perfect, se palauttaa osoitteita, 961 01:00:25,120 --> 01:00:28,510 osoitteen ensimmäinen tavu koko palan muistia. 962 01:00:28,510 --> 01:00:31,140 Kuinka monta tavua on tähän ilmeisesti vuodeksi Esimerkiksi laite? 963 01:00:31,140 --> 01:00:33,510 Mitä kokoa int? 4. 964 01:00:33,510 --> 01:00:36,600 Jos luulet takaisin viikon 1, se ei ole erittäin tärkeää aina muistaa, että 965 01:00:36,600 --> 01:00:38,870 mutta tässä tapauksessa se on hyödyllistä tietää, 4 tavua. 966 01:00:38,870 --> 01:00:41,770 Joten tämä on jakaa kasaan 4 tavua 967 01:00:41,770 --> 01:00:46,110 ja se palauttaa osoitteen ensimmäinen minulle mielivaltaisesti. 968 01:00:46,110 --> 01:00:47,700 Nyt, mitä x tekee? 969 01:00:47,700 --> 01:00:52,200 * X = 42 tekee mitä? 970 01:00:52,200 --> 01:00:57,150 Jos tässä vaiheessa tarinan olemme x, joka näyttää tältä joitakin roskaa arvo, 971 01:00:57,150 --> 01:01:04,120 Tämä on nyt y joitakin roskat arvoa, nyt linja 3 Olen varattu 4 tavua. 972 01:01:04,120 --> 01:01:06,950 Tämä kuva lähinnä näyttää tältä. 973 01:01:06,950 --> 01:01:12,010 Tai tarkemmin, jos tämä on mielivaltainen osoite 123, tämä on mitä tarina nyt näyttää. 974 01:01:12,010 --> 01:01:23,940 * X = 42 nyt tarkoittaa mitä? Tämä tarkoittaa mene osoitteeseen 123 ja laita numero 42 siellä. 975 01:01:23,940 --> 01:01:26,220 Minun ei tarvitse tehdä näiden kohtien koska emme tee merkkijonoja. 976 01:01:26,220 --> 01:01:29,480 >> Minun olisi pitänyt juuri kirjoittanut sen näin, ja vain esittelyn vuoksi, 977 01:01:29,480 --> 01:01:33,240 42 kuten int sellainen vie paljon tilaa, 4 tavua. 978 01:01:33,240 --> 01:01:35,960 Niin, että mitä siellä tapahtui, mutta siellä on ongelma nyt. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Mitä tulee tapahtumaan täällä? 980 01:01:40,580 --> 01:01:46,470 Ongelmana on * y meidän yksinkertaistetussa maailmassa tarkoittaa vain mennä osoitteeseen y. 981 01:01:46,470 --> 01:01:48,590 Mitä y? Se on joku roska arvoa. 982 01:01:48,590 --> 01:01:53,150 Joten olettaa, että roskat arvo on 5551212, jotain hullua sellaista. 983 01:01:53,150 --> 01:01:56,750 * Y keinoja mennä puuttumaan 5551212. 984 01:01:56,750 --> 01:02:00,450 Se on kuin täällä. Ei ole olemassa, esimerkiksi. 985 01:02:00,450 --> 01:02:05,310 Joten * y saa 13 avulla yritän piirtää 13 täällä. Sitä ei ole olemassa. 986 01:02:05,310 --> 01:02:08,790 Olen ylittänyt segmentti liitutaulun. Mitä saan? 987 01:02:08,790 --> 01:02:14,930 Tämä arvoituksellinen viesti segmentointi vika, koska yritän laittaa muistiin 988 01:02:14,930 --> 01:02:19,470 arvo kuin 13 paikassa, joka ei ole olemassa. 989 01:02:19,470 --> 01:02:23,900 Loput ohjelman saattaisi toimia hyvin, mutta enintään siihen saakka se ei ole. 990 01:02:23,900 --> 01:02:25,350 Joten yritä kertoa tämän tarinan. 991 01:02:25,350 --> 01:02:27,830 Tulemme takaisin, että kun olemme puhuneet hex. 992 01:02:27,830 --> 01:02:30,290 Mennään takaisin tähän ja tehdä tämä asia sanottu Binky, 993 01:02:30,290 --> 01:02:33,710 joka Recall on Stanfordin professori istuu kotona leikkii claymation, 994 01:02:33,710 --> 01:02:36,380 kertoa tarinan täsmälleen saman ohjelman. 995 01:02:36,380 --> 01:02:40,580 Se on vain noin 3 minuuttia pitkä. Täällä meillä on Binky. 996 01:02:40,580 --> 01:02:45,030 [Uros kaiutin video] Hei Binky, herätä. On aika osoittimen hauskaa. 997 01:02:45,030 --> 01:02:50,080 [Binky] Mikä tuo on? Lisätietoja viitteitä? Voi goody! 998 01:02:50,080 --> 01:02:53,700 [Uros kaiutin] No, päästä alkuun, kai me menossa pari viitteitä. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Okei. Tämä koodi jakaa 2 osoittimia, jotka voivat osoittaa kokonaislukuja. 1000 01:02:57,890 --> 01:03:02,220 [Uros kaiutin] Okei. No, näen 2 osoittimia, mutta ne eivät näytä osoittavan mitään. 1001 01:03:02,220 --> 01:03:05,550 [Binky] Aivan oikein. Aluksi osoittimet eivät osoita mitään. 1002 01:03:05,550 --> 01:03:09,270 Mitä he viittaavat kutsutaan pointees, ja asettamalla niille on erillinen vaihe. 1003 01:03:09,270 --> 01:03:12,330 [Uros kaiutin] Voi, oikea, oikea. Tiesin sen. Pointees ovat erillisiä. 1004 01:03:12,330 --> 01:03:15,630 Er, niin miten voit jakaa pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Okei. Tämä koodi allokoi uuden kokonaisluku pointee, ja tämä osa asetetaan x osoittamaan sitä. 1006 01:03:21,510 --> 01:03:23,500 [Uros kaiutin] Hei, se näyttää paremmalta. 1007 01:03:23,500 --> 01:03:26,030 Joten tehdä jotain. >> [Binky] Okei. 1008 01:03:26,030 --> 01:03:30,300 Minä dereference osoitin x tallentaa numero 42 osaksi pointee. 1009 01:03:30,300 --> 01:03:34,410 Tämän tempun minä tarvitsen taikasauvaa ja dereferencing. 1010 01:03:34,410 --> 01:03:38,610 [Uros kaiutin] Sinun taikasauvaa ja dereferencing? Se on hienoa. 1011 01:03:38,610 --> 01:03:44,230 [Binky] Tämä on mitä koodi näyttää. Otan vain perustanut numero ja ... [Poksahtelua] 1012 01:03:44,230 --> 01:03:46,100 [Uros kaiutin] Hei katso, siellä se menee. 1013 01:03:46,100 --> 01:03:50,990 Näin dereference koskevan x seuraa nuolta päästäksesi sen pointee, 1014 01:03:50,990 --> 01:03:53,230 Tässä tapauksessa tallentaa 42 siellä. 1015 01:03:53,230 --> 01:03:57,630 Hei, kokeile sitä tallentaa numero 13 kautta muille osoitin, y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Okei. Otan vain mennä tänne y ja saada numero 13 perustetun 1017 01:04:03,250 --> 01:04:08,360 ja sitten ottaa taikasauva dereferencing ja vain ... [Särinää] Vau! 1018 01:04:08,360 --> 01:04:10,980 [Uros kaiutin] Ai hei, se ei toimi. 1019 01:04:10,980 --> 01:04:14,870 >> Sano, Binky, en usko dereferencing y on hyvä idea 1020 01:04:14,870 --> 01:04:17,880 koska perustetaan pointee on erillinen vaihe 1021 01:04:17,880 --> 01:04:19,850 enkä usko, että koskaan tehnyt sitä. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, hyvä pointti. 1023 01:04:21,770 --> 01:04:26,640 [Uros kaiutin] Joo. Me jaetaan osoittimen y, mutta emme koskaan aseta se osoittamaan pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, hyvin tarkkaavainen. 1025 01:04:28,780 --> 01:04:30,690 [Uros kaiutin] Hei, etsit hyvää siellä, Binky. 1026 01:04:30,690 --> 01:04:34,160 Voitteko korjata sen niin, että y viittaa samaan pointee kuin x? >> [Binky] Toki. 1027 01:04:34,160 --> 01:04:37,100 Minä käytän taikasauvaa osoittimen tehtävän. 1028 01:04:37,100 --> 01:04:39,070 [Uros kaiutin] että tulee olemaan ongelma kuin ennen? 1029 01:04:39,070 --> 01:04:40,840 [Binky] Ei, tämä ei kosketa pointees. 1030 01:04:40,840 --> 01:04:44,780 Se vain muuttaa yksi osoitin osoittaa sama asia kuin toinen. [Poksahtelua] 1031 01:04:44,780 --> 01:04:48,570 [Uros kaiutin] Ymmärrän. Nyt y viittaa samaan paikkaan kuin x. 1032 01:04:48,570 --> 01:04:51,140 Joten odota. Nyt y kiinteä. Se on pointee. 1033 01:04:51,140 --> 01:04:54,520 Joten voit kokeilla taikasauva dereferencing jälleen lähettää 13 yli. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Öh, okei. Tässä menee. [Poksahtelua] 1035 01:04:58,130 --> 01:05:01,250 [Uros kaiutin] Hei, katso tuota. Nyt dereferencing toimii y. 1036 01:05:01,250 --> 01:05:05,200 Ja koska osoittimia jakavat että yksi pointee, he molemmat katso 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Joo, jakaminen. Whatever. 1038 01:05:06,910 --> 01:05:08,880 >> Joten aiomme vaihtaa paikkaa nyt? 1039 01:05:08,880 --> 01:05:11,420 [Uros kaiutin] Oh look, olemme myöhässä. >> [Binky] Mutta - 1040 01:05:11,420 --> 01:05:13,880 [Uros kaiutin] Muistathan 3 osoitin sääntöjä. 1041 01:05:13,880 --> 01:05:18,630 Numero 1, perusrakenne on, että sinulla on osoittimen ja se viittaa yli pointee. 1042 01:05:18,630 --> 01:05:23,120 Mutta osoittimen ja pointee ovat erillisiä, ja yhteinen virhe on perustaa osoittimen 1043 01:05:23,120 --> 01:05:25,680 mutta unohtaa antaa sille pointee. 1044 01:05:25,680 --> 01:05:29,580 Numero 2, osoitin dereferencing alkaa osoittimen ja seuraa sen nuoli yli 1045 01:05:29,580 --> 01:05:31,060 käyttää sen pointee. 1046 01:05:31,060 --> 01:05:34,340 Kuten me kaikki tiedämme, tämä toimii vain, jos on olemassa pointee, 1047 01:05:34,340 --> 01:05:36,460 millaisia ​​saa takaisin sääntö numero 1. 1048 01:05:36,460 --> 01:05:39,870 Numero 3, osoitin toimeksianto kestää yhden osoittimen ja muuttaa sitä 1049 01:05:39,870 --> 01:05:42,390 osoittamaan samaan pointee kuin toinen osoitin. 1050 01:05:42,390 --> 01:05:45,890 Joten kun toimeksianto, 2 osoittimet tulee osoittaa samaan pointee. 1051 01:05:45,890 --> 01:05:47,800 Joskus sitä kutsutaan jakaminen. 1052 01:05:47,800 --> 01:05:50,910 >> Ja se kaikki on sitä todella. Bye-bye nyt. 1053 01:05:50,910 --> 01:05:55,840 Tämä on Binky. Tämä on CS50. Nähdään ensi viikolla. [Aplodit] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]