[Powered by Google Translate] [Nedēļa 4, Turpinājums] [David J. Malan - Hārvarda] [Tas ir CS50. - CS50.TV] Tas ir CS50, un tas ir beigas 4 nedēļas. Tik dažas labas ziņas un dažas sliktas ziņas. Nav lekcija pirmdien, nav problēmu noteikt nākamnedēļ. [Studenti uzmundrinoša] Jūs neesat gatavojas patīk, kur tas notiek. Bet mums ir šis nevis nākamo trešdien, un tur ir arī par to mācību programmu piektdiena 1 lekciju nākamā piektdiena, lai mēs varētu palikt uz ceļa. Bet viss tiks filmēts kā parasti, tāpēc nav jāuztraucas. Un attiecībā uz viktorīnas 0 Ko mēs darīsim pret nedēļas beigām ir post par kursu mājaslapā cs50.net paskaidrojums gada kāda veida cerības, jums ir jābūt, kad runa ir uz pirmo viktorīnas. Kopumā tas būs vairākas izvēles, patiess-nepatiess, Īsā atbilde, īsi kodēšanas problēmas. Jūs neesat gatavojas sagaidīt, lai īstenotu ekvivalentu par problēmu, ka jūs varētu redzēt uz PSET, par kuru jums ir dators un atkļūdotājs un tamlīdzīgi, bet tur būs mazie kodēšanas problēmas. Un tiešām, labākais ceļvedis, lai iegūtu sajūtu, ko CS50 viktorīnas ir līdzīgi ir doties uz cs50.net, dodieties uz viktorīnas saiti, un jūs varat redzēt pēdējo vairākus gadus vērts viktorīnas. Tikai jāsaprot, ka mācību programma ne vienmēr ir tas pats gadu gaitā. Dažreiz mēs pievienot, reizēm atņemt, Tātad, ja jūs redzat kādu tēmu par vienu no tiem veco viktorīnas ka jums nav ne jausmas, ko tas runā, tas ir, vai nu, ka mēs uz to vai ka mēs neesam uz to. Bet forma atsauksmes, šo svētdien, pirmdien un otrdien kā arī kursu-plašā pārskata sanāksmē par svētdienas vakarā - laiks un vieta tiks paziņota par kursu mājaslapā - Jums visiem ir iespēja pārskatīt ar kursu mācība līdzcilvēkiem materiāls par šo gadu, gan sadaļā un kā pilnu klasi, un tie tiks filmēts, kā ierasts, kā arī. Labi. Tātad bez papildu ADO, viens komentārs par der / neder un pievienot / kritums. Jums var būt redzējis manas piezīmes pēdējā naktī, un tas ir tiešām tikai dažas papildu drošība ka, ja jūs esat viens no tiem, jo ​​īpaši mazāk apmierināti vai kaut kur starp un jūs sajūta tikai mazliet virs galvas, apzināties, ka patiešām ir pavisam normāli, un tur plašas atbalsta struktūru vietā, no kuriem viens darba laiks bija nodoms uzlabot visu vēl vienu manu e pagājušajā naktī, un saprast arī to, ka, piemēram, der variants / neizdoties klasē kā šis tiešām ir paredzēts kā mehānisms, lai ņemtu malu off no protams, tāpat kā tas, tā, ka atkal, ja jūs izdevumu šos 10, 15, 20 stundas tikai mēģina iegūt kādu PSET uz darbu, un jūs zināt, jūs esat 90-95% no tā tur bet jūs nevarat atrast kādu nopelt kļūdu, kādā / neatbilstības modeli, kas ir sava veida labi. Ideja ir tāda, ka ar šo mehānismu jūs varat doties koncentrēties uz savu citu psets vai gulēt vai kāds tas ir, ka jūs vēlaties, lai koncentrētos uz. Lai saprastu, ka jums ir līdz šim nāk otrdien - tehniski 5. Pirmdiena, bet tas ir svētki, tāpēc šis nāk otrdiena - lai pārslēgtos no der / nespēj šķiroto vai vice versa. Un, ja jūs patiešām uz kraujas, un domā par pilināmā vispār, lūdzu nozvejas mani pēc lekcijas vai piliens man piezīmi. Mēs ar prieku vismaz chat pirms jūs cena adieu. Labi. Tātad mēs sākām veikt apmācības riteņus pēdējo reizi. Jo īpaši, mēs vērsta uz virkni. Virkne ir kaut kas ir deklarēta CS50 bibliotēkā, īpaši šajā failu sauc cs50.h ko mēs sāksim skatīties uz šo nedēļu un nākamo. Bet virkne ir tiešām tikai vienkāršošana kaut tas nedaudz vairāk arcanely raksturot kā char *. Char mēs esam pazīstami ar. Tas ir tikai viens raksturs. Bet * kā pirmdien apzīmēts ko? >> [Students] rādītājs. Rādītājs. Un, kas ir rādītājs? >> [Students] adrese. Tas ir tāpat kā adresi, atrašanās atmiņā. Kas adrese vai vieta vai atmiņas? Atkal visi no mums ir laptops ar koncerta vai 2 gigabaiti RAM visticamāk šajās dienās, un tas nozīmē, ka jums ir miljards vai 2 miljards baitu vērts atmiņas. Un tas nav īsti jautājums, ko tas fiziski izskatās, bet ņemt uz ticību, ka jūs varat numurēt visus atsevišķos baitu ka jūsu pašu klēpjdators ir - tas ir baitu 0, tas ir baits 1, tas ir baits 2000000000 - un tas ir tieši tas, ko dators dara. Kad jūs piešķirt vietu par vienu rakstzīmi, piemēram, tas acīmredzami ir dzīvot kaut kur datora atmiņā, un varbūt tas ir pie baitu numuru 12345, un tas ir kaut kur šeit ir datora atmiņā. Un adrese tad par šo raksturu ir 12345. Tagad, nedēļā 0 līdz šim Līdz šim mēs neesam īsti aprūpēti kur atmiņā lietas ir saglabāti, jo mēs parasti izmanto simbolus, mainīgie, un bloki, lai faktiski saņemtu mūsu datiem. Bet kā pirmdien un visu vairāk šodien, jūs tagad nāksies visi ekspresīvākos iespējas ar rakstīšanas programmu lai patiešām manipulēt datora atmiņā tomēr jūs redzat fit, gan labas mērķiem un slikti, bugs ir ļoti bieži rezultāts šajā brīdī mācīties šo stuff. Bet ko tas īsti nozīmē būt char *? Iesim uz priekšu atpakaļ - un mēs būsim atpakaļ, lai Binky kā solīts šodien. Ejam uz vienkāršu piemēru šeit. Ļaujiet man saglabājiet šo failu kā compare.c, un ļaujiet man tikai iegūt kādu veidni kodu šeit tā ietver stdio.h, ļaujiet man arī dotu sevi ietver cs50.h. Es tuvinātu tur. Ļaujiet man sākt rakstīt galveno int, galvenais (spēkā neesošs), un tagad es gribu darīt kaut kas līdzīgs šim: printf ("Dodiet man virkni:"), un tad es izmantošu String s izpaužas GetString lai iegūtu virkni no lietotāja, tad es esmu gatavojas lūgt lietotājam vienam otru. ("Dod man vēl virkni:"), un es esmu gatavojas lūgt tos izmantojot GetString lai iegūtu to. Es aicinu to t jo t nāk pēc s un s ir jauka nosaukums virkni ja tas ir diezgan vispārīgs. Tātad GetString, un tagad es vienkārši gribu darīt veselība pārbaudītu, un es esmu gatavojas teikt ja (i == t), tad es esmu tikai gatavojas pateikt lietotājam printf ("Jūs ierakstījāt pats \ n!"); vēl es esmu gatavojas izdrukāt kaut ko līdzīgu ("ierakstījāt kaut kas atšķirīgs! \ n") vai kāds teikums būs. Lai kaut kas tamlīdzīgs. Tad kā parasti, es ņemšu atgriezties 0 kas tikai nozīmēja, ka nekas slikts noticis, un es esmu gatavojas iet uz priekšu un apkopo un palaist šo programmu. Bet pirmdien mēs ilga šo programmu, un faktiski tika teikts, ka HELLO nav Sveicināti un Ardievu nav Ardievu. Uzvedība mēs redzējām, bija nedaudz vairāk kā šis. Ļaujiet man iet manā avota direktorijā, kas šeit zoom, un pieņemsim do veikt salīdzināt. Sastādītāja labi. Ļaujiet man palaist salīdzināt. Dodiet man virkni: Hello. Dodiet man vēl virkni: Hello. Ierakstītais kaut ko citu! Nu, ļaujiet man mēģināt kaut ko vienkāršāku, piemēram, 50, 50. Ierakstītais kaut ko citu! hi, hi. Tik skaidri, kaut kas notiek šeit. Bet kāda bija izskaidrojums, kāpēc? Acīmredzot, līnija 12 ir pilnīgi disfunkcionālas. Kas pamatproblēma šeit? Yeah. >> [Students] Tas salīdzinot adreses. Jā, tieši tā. Tas faktiski salīdzinot adreses kurā HELLO un HELLO tiek uzglabāti. Tas nav salīdzinot vēstules sveiki atkal un atkal, jo to, kas īsti noticis, visu šo laiku mēs esam izmantojuši GetString - Šī tāfele ir atkal mūsu datora atmiņā, un pieņemsim, ka es aicinu GetString pēc deklarējot mainīgu s. Kāda mana atmiņa izskatās? Pieņemsim patvaļīgi teikt, ka s izskatās šādi. Tas ir kvadrāts. Un diezgan daudz jebkurā laikā es esmu sastādīts gabals atmiņas uz ekrāna ja tas ir 32 biti es esmu zīmēšanas laukumu, kā šis, jo tiešām ierīces, rādītājs, adrese, ir 32 biti. Tas pats kā int. Tas var atšķirties, pamatojoties uz datora sistēmā. Tie no jums, kas ir neskaidri iepazinušies ar to, ka jūsu Mac vai PC ir 64 biti, kas faktiski nozīmē, ka jūsu dators izmanto 64 bitu norādes, 64 bitu adreses, un starp to, kas upsides ir jūsu datoru var būt daudz vairāk RAM, nekā vakardienas. Garš stāsts īss, atpakaļ dienā, kad datori izmanto tikai 32 bitus pārstāvēt adreses, vislielākais skaits baitu jūs varētu pārstāvēt Šajā lietā bija ko darīt, ja jums ir 32 bitu? Tātad 4 miljardus, labi, jo 2-32 to ir 4 miljardi. Šis numurs ir atkārtojas gaitā. Tātad, ja jums ir tikai 32 bitus, vislielākais skaits jūs varat rēķināties, ir aptuveni 4 miljardi. Bet tas bija būtisks ierobežojums datoru pirms dažiem gadiem jo, ja jūs varat tikai rēķināties augsta kā miljards 4, tas nav svarīgi, ja jūs pērkat 8 gigabaitu RAM vai pat 5 gigabaitu RAM; Jūs nevarat rēķināties, ka liels, tāpēc tas bija bezjēdzīgi. Jūs varētu piekļūt tikai pirmos 3 vai 4 gigabaitu datora atmiņā. Tas ir mazāk jautājumu tagad, un jūs varat iegādāties Macbook Pros un Dells ar 8 gigabaitu RAM vai pat vairāk šajās dienās. Bet, ja es piešķirt gluži vienkārši šajā programmā rādītāju, rādītāju sauc s, tas varētu izskatīties šādi uz ekrāna, jo tiešām mums mizu atpakaļ šo slāni. Es turpinu sakot stīgu, bet pirmdien, virkne tiešām char *, adresi kādu raksturs. Tāpēc pieņemsim, ka apmācības riteni, lai gan mēs joprojām izmantot GetString tagad. Tāpēc es esmu atzīts s, un tas ir rieciens atmiņas, 32 biti. Kas šeit atmiņā pēc noklusējuma? >> [Dzirdams studentu reaģēšanas] Ko tas nozīmē? >> [Students] Atkritumu. >> Atkritumu. Tieši tā. Ja jums programmētājs nav izvirzīti vērtību mainīgā, kas zina, kas tas ir? Dažreiz jums paveiksies un tas ir 0, kas ir sava veida jauku, tīru noklusējuma vērtību, bet kā mēs redzējām Pirmdien, dažreiz tas ir pilnīgs absurds, daži patiešām liels pozitīvs vai negatīvs skaitlis, kas nāca no kurienes? Yeah. >> [Students] funkcija pirms tam. >> Jā. Bieži funkcija, kas ieguva nosaukumu pirms, jo jāatceras, kā jūs sauc funkcijas atmiņā, tie aizņem vairāk un vairāk vietas no apakšas uz augšu, un tiklīdz funkcija atgriež, ka atmiņa izpaužas atkārtoti ar nākamā puisis, kas izpaužas sauc, kurš izmanto jūsu pašu šķēle atmiņas. Un, ja jūs esat atstājuši atkritumus tur, iepriekšējām vērtībām, mēs varētu noturēt s kā ar kādu vērtību, kad tiešām mēs esam salikti neko tur. Tātad mūsu atmiņa šajā brīdī izskatās. Tagad par labajā pusē 7 līnijas mēs aicinām GetString, kas mēs esam bijuši dara tagad nedēļas, bet to, kas ir GetString īsti dara? GetString rakstīti ar CS50 personāls ir nedaudz inteliģents jo tiklīdz lietotājs sāk rakstīt atslēgas un hits Enter, GetString skaitļi, cik keystrokes darīja lietotājs hit, cik rakstzīmes man nepieciešams piešķirt RAM. Un ja šī atmiņa nāk no, kas zina? Tas ir kaut kur datora 2 gigabaitiem vai atmiņas plauktiņš. Bet pieņemsim, ka dators atrasts telpu vārdu HELLO šeit. Vārdu es drukāti bija H-E-L-L-O. Un, ja mēs izdarīt to kā rakstzīmju secību, mēs varētu izdarīt to, kā šis. Bet man jādara 1 papildus lieta. Kas pieder beigās jebkura virknes C? Null raksturs, ko mēs rakstīt par 0 \. Tas ir tehniski numuru 0, bet slīpsvītru padara visu skaidrāku ka tas ir burtiski skaitlis 0, tad skaitlis 0; tas nav, piemēram, citēju-likt pēdiņas beigās 0, kas jūs varētu tipa pie klaviatūras. Tātad tas ir sveiki. Un ko mēs sakām pirmdien, ka funkcijas, piemēram GetString faktiski atgriežas visi šie nedēļas? Tas neatgriezīsies virkni per se, jo tas nav īsti ir nozīme jo stīgas nav. Viņi sava veida izgatavošanas uz CS50 bibliotēkā. Kas ir patiešām virkne, vairāk tehniski? >> [Students] Tā pirmā zīme. Tieši tā. Tas ir diezgan vienkārši adrese pirmais raksturu, kas lietotājs drukāti collas Tātad, ja mans vārds HELLO beidzas to augšā baitu numuru 123 un pēc tam baitu numuru 124, 125, 126, un tā tālāk, ja es tikai skaitlis manu bytes no 0 uz augšu, kas patiešām GetString atgriežas ir burtiski numuru 123. Tātad, ko izpaužas likts s ir numurs 123, nevis vēstuli H nav vārdu HELLO, gluži vienkārši adresi, kur es varu atrast pirmo burtu HELLO. Bet tas nav šķist pietiekami. Es lūdzu jūs par virkni, nevis raksturu. Tātad, kā mēs vai dators zina, ka ELLO veida nāk kopā ar H? Kas par līguma veida mums ir? Yeah. [Students] Tas tur stāsta sevi, lai atrastu kādu vēl rakstzīmes. >> Tieši tā. Tur tas ir cilvēka-datora konvencija, kurā kad jums ir darīšana ar stīgām, citādi zināma tagad kā char zvaigznēm, jums vienkārši ir, lai noskaidrotu kur katra virknes dzīves beigas, ir tiešām tikai atkārtojot pa to ar par cilpu, kamēr cilpa, neatkarīgi, tā, ka tad, kad jūs atrast beigām virknes Tagad jūs varat secināt no tā, ak, viss vārds bija sveiki. Tiem no jums ar iepriekšēju programmu pieredzi varētu zināt Java Jūs varat vienkārši piezvanīt garumu un. citās valodās jūs varat zvanīt garumu vai līdzīgu. Tas ir tāpēc, ka ir daudz valodām, īpaši lietas sauc objektorientētā valodas, kaut kā garums ir sava veida iekapsulēts iekšpusē gabals datu pati, līdzīgi kā mēs iekapsulēti ID vārdi un mājas iekšpusē students pirmdien. Bet C ir daudz zemāks līmenis. Ir nekādi priekšmeti vai klases, ja esat dzirdējuši šos noteikumus pirms. Viss, kas Jums ir patiešām ir atmiņas adreses. Tātad tas ir sava veida vecmodīgs veidā, pārstāvot interesantu datu struktūras. Jums ir starta vērtība, piemēram adreses pirmās rakstzīmes un tad tikai daži patvaļīgi konvencija, ka visi piekrīt ievērot. Tā kā ir virknes garums īstenota, tomēr mēs piedāvājam? Strlen, strlen, ko daži no jums ir tagad izmanto dažas reizes. Tas ir diezgan vienkārši, vai ne? Tas ir tāpat kā 2 rindas kodu. Tas ir diezgan daudz, lai cilpa kāda veida, varbūt ar papildu vietējo mainīgo. Bet strlen vienkārši ir jāņem rādītāju un tad sākt meklēt 0 \. Un tiklīdz tā konstatē, tā var atgriezties kopējo vairākus pasākumus, ka tas ir pieņemts šajā virknē. Tātad, mēs varam no tā secinu, kas notiek nākamo. Pieņemsim tad es apliecinu t kā es esmu darījusi 10 rindā. Tas ir daži atkritumu vērtība. Kurš zina sākumā? Bet uz labajā pusē līnijas gada 10 Es esmu aicinot GetString vēlreiz. Kas zina, kur tas beidzas līdz? Pieņemsim patvaļīgi teikt, ka operētājsistēma konstatēja istabu tā kā vairāk nekā šeit. Es notikt nejauši rakstīt H-e-L-L-O atkal, un tā mēs varam izdarīt to pašu veida attēlu. Bet fakts, ka es esmu pārzīmēta šo attēlu ir apzināta jo tas ir atšķirīgs HELLO nekā šīs. Tātad šeit tas varētu būt vieta 456, tas ir 457, un tā tālāk. Tātad, ko izpaužas likts kur jautājuma zīme reiz bija? Šajā gadījumā 456. Mēs picking šos skaitļus patvaļīgi, jo tiešām pēc šodienas mēs nebrauksim aprūpes tik daudz par to, ko par kaut adrese ir. Visi mēs rūpējamies par ir tas, ka mēs varam izrēķināt adresi kādu gabals datu, piemēram HELLO. Tik tiešām, ko vairums cilvēku darīt datorzinātnēs, runājot par atmiņas adresēm un runājot par šautru konkrēti, nevis uztraukties norādītas 123 - kas rūpējas, ja tas sīkumi patiesībā ir, mēs vienkārši zinām, ka tas ir kaut skaitlisko adresi - mēs vienkāršot pasauli un tikai teikt, ka s ir vērsta uz šo raksturu un t ir vērsta uz šo raksturu. Un fakts, ka tas ir bultiņa ir diezgan apzināta jo burtiski tagad s pavērsts H un t norāda uz citām H jo beigās, dienā, tas nav svarīgi, ko adrese ir, bet tas nav jautājums, kas mums ir iespēja paust, ka adresi ar kādu gabals kodu. Mēs neesam īsti manipulē šīs adreses tikai vēl tāpēc mēs redzam, kur mēs varam izteikt un kārtot par darīt lietas ar norādes, bet tagad atbilst 12 burtiski kādas vērtības mēs salīdzinātu Saskaņā ar šo stāstu 12 līnijas? Mēs esam sakot ir 123 vienāds vienāds ar 456? Un tas noteikti nav tas gadījums. Un pat konceptuāli, šis rādītājs noteikti nav tas pats, jo tas jo jūs sauc GetString divreiz, un GetString necenšas būt super gudrs, tas nav mēģināt saprast, ak, jūs drukāti HELLO 5 minūtēm; ļaujiet man jums to pašu rādītāju kā man bija agrāk, tas tikai piešķir jaunu rieciens atmiņas katru reizi, kad to sauc. Tātad, kā mēs varam noteikt šo problēmu? Ja augstākā līmeņa es vēlos salīdzināt stīgas Labdien un Sveiki - Man vienalga par norādes - kā es varu iet par atbildot uz jautājumu, darīja lietotājs ierakstiet to pašu? Kas nepieciešams, šeit? Yeah. [Students] Izmantojiet funkciju. >> Es varētu izmantot funkciju no kastes. Es varu izmantot funkciju sauc strcmp, s-t-R-c-m-p, tikai saīsinātā versija sakot virkne salīdzināt. Un, ja mēs ejam uz, piemēram, salīdzināt 2, kas ir starp mūsdienu izdales materiāliem, Man tieši tā. Es tur viss pārējais pats no 1 rindā uz leju līdz 26, vai arī tā, un tagad paziņojums šo daļu ir mainījies tikai mazliet. Pieņemsim ignorēt uz brīdi 28 līniju un koncentrēties tikai uz šo vienu. Ko mēs sakām pirmdiena, ka ielā salīdzināt dara? Tā rokturi procesu ņemot 2 norādes, s un t šajā gadījumā, kārtot praktiski liekot savu roku uz šīm 2 vēstulēm, un ko tas ir jādara, ir kaut kas līdzīgs kamēr cilpa, vai cilpa, un tā saka, ir tie paši? Ja tā, tas kustas uz pirkstiem vai norādes uz priekšu. Vai tie paši, tie paši, tie paši, Tie paši, tie paši? Un ooh, es esmu beigās virknes pie gan s un t. Es neesmu atradis nekādas pretrunas. Jā, šie virknes ir vienādas. Un ko ielā salīdzināt atdevi ja 2 stīgas ir vienādas, acīmredzot? Nulle. Tāpēc 0 ir labs šajā lietā, jo, ja tas atgriežas -1 vai +1, tas nozīmē, ka ir tikai notiek nākt pirms t alfabēta vai pēc t. Un kāpēc tas var būt noderīgi, lai būtu funkcija, kas stāsta, kas stīgu nāk pirms vai pēc iekļauta vārdnīcā? [Students] Meklē. >> Meklē un šķirošana. Tātad jūs varat darīt lietas, piemēram bināro meklēšanu vai burbulis šķirot vai apvienot kādas kur jums ir salīdzināt lietas. Līdz šim mēs esam veida samazināt dažas stūriem un tikai runāja par šķirošanas saistībā ar skaitļiem, jo ​​tas ir jauki un viegli runāt, bet jūs noteikti var salīdzināt stīgas, ābolu un banānu, jo, ja ābolu ir zināms, nonāk līdz banānu, līdzīgi, Jūs varat pārvietoties virknes pa atmiņā, tāpat kā Rob darīja ar sapludināšanas kārtot ar video un mēs šeit uz skatuves ar atlases veida, ievietošanas šķirot, un burbulis šķirot. Tātad, kur vēl mēs varam pieņemt šo? Mēģināsim šo. Pieņemsim veida aizmirst, ka mācība par brīdi, un mēģināt tagad un kopēt 1.c darīt šādi. 21 Saskaņā es saku drukas kaut ko, tad es saņemu virkni no lietotāja, tad es esmu pārbaudot šo. Mēs neesam īsti gotten šo ieradumu vēl, bet pieņemsim tagad darīt. Pieņemsim faktiski mizu atpakaļ šo slāni. Tas ir patiešām char *. Šis puisis ir patiešām char *. Tātad, ko tas nozīmē, lai pārbaudītu, ja s == null? Izrādās, ka tad, kad jūs zvanu funkcija ir līdzīga GetString vai vispār tikai lūgt datoru, lai dotu jums dažas atmiņas, kaut kas varētu noiet greizi. Jūs varētu būt traks un lūgt datoru par terabaitu atmiņas lūdzot triljoniem baiti atmiņas, kas vienkārši nepastāv ar datoru, bet GetString un citas funkcijas nepieciešams zināms veids, kliegt pie jums ja esat lūdza pārāk daudz. Un kā GetString dara tas ir, ja jums ir lūgusi vairāk atmiņas nekā ir pieejams dators, pat ja tas ir super, super maza varbūtība jo neviens no mums gatavojas rakstīt triljonu rakstzīmes un pēc tam hit Enter, bet maza varbūtība gan tas var būt, es joprojām gribu, lai pārbaudītu to tikai gadījumā, un īpašas vērtības GetString, atbilde, un citas funkcijas atgriežas ja kaut kas ir nogājis greizi ir NULL visās vāciņiem. Un kāda ir NULL? NULL tikai tā notiek, lai pārstāvētu rādītāju. Tas ir atmiņas adrese 0. Pasaule nolēma, ka patvaļīgi, ja tas ir mana datora atmiņa - jūs zināt, ko? - mēs esam gatavojas nozagt tikai 1 baitu katra datora atmiņā, un tas ir vieta 0. Mēs ejam, lai dotu tai segvārdu null, un mēs esam gatavojas apsolu ka mēs nekad faktiski likts reālus datus tur jo mums vienkārši patvaļīgi nepieciešama īpaša vērtība, 0, aka NULL, lai mēs varētu bļaut lietotājiem, ja kaut kas noiet greizi. Pretējā gadījumā jūs varētu nezināt tas 0 nozīmē likt kaut ko šeit vai tas nozīmē, kaut kas nogāja greizi? Mums ir visi piekrītam, ka NULL līdzekļi nekas netika atgriezies, Nav faktiskā adrese tika atgriezta. Tagad, šeit es esmu tikai pieņemot manu cilvēku konvenciju par I return 1 no galvenās ja kaut kas noiet greizi. Tas ir tāpēc, ka Main atgriešanās konvencija ir atgriezties 0, ja labi, 1 vai kādu citu vērtību, ja slikti. Bet GetString un kādas funkcijas, kas nodarbojas ar atmiņas atgriež null ja kaut kas notiek slikts. Labi. Tātad diemžēl, 27 līnijas, super vienkārši, lai gan tas ir, pilnīgi nespēj kopēt virkni. Kāpēc? Mēs varam redzēt šo šādi. Es esmu apgalvojot 27 rindā, lai padarītu kopiju s un aicinot to t. Tāpēc es neesmu lūdzot lietotājam uz 2 stīgām šoreiz, es tikai saku vērtību s būtu jāievieš t, kā arī. Tāpēc tagad tikai, lai pierādītu, cik salauzta tas ir, line 29 turpmākais ko es daru? Vispirms es esmu pārbaudes, ja no t garums ir lielāks par 0. Ir daži virkne tur. Lietotājs drukāti kaut iekšā Kas ir līnija 32 dara, acīmredzot? [Dzirdams studentu reaģēšanas] >> labo. Jūs varat veida izsecināt no tā, ko es teicu tas dara. Bet tehniski, kas ir šis dara? t [0] ir, ko? [Students] 0. raksturs. >> [Malan] 0. raksturs. Vai, cilvēka līdzīgi, pirmā rakstzīme t, kāds tas ir, H varbūt šajā gadījumā. Un toupper dara to, ko tā saka. Tā kapitalizē uz 0. raksturu t un tas maina to. Tātad tas nozīmē uzņemties 0. raksturu t, padarīt to lielos, un nodot to atpakaļ tajā pašā vietā. Tātad, ja es rakstīt sveiki kā mazie, tas būtu jāmaina mazo burtu h, lai kapitāla H. Bet problēma ir tā, ka līniju 35 un 36, ko es esmu gatavojas darīt, ir izdrukāt mums s un t. Un kāda ir jūsu nojauta? Ko es tiešām gatavojas, lai redzētu, vai es drukāti sveiki jo visiem mazajiem? Kas notiek, lai saņemtu izdrukāt? >> [Dzirdams studentu reaģēšanas] >> Kas tas ir? [Students] Liels H un atpūtas maza. >> Liels H un atpūtas mazs, kas ir vai t? [Students] Gan. >> Abi. Tieši tā. Tātad, pieņemsim redzēt, kas notiek šeit. Ļaujiet man iet uz priekšu un apkopo šo. Tas ir copy1, lai padarītu copy1. Labi. Tuvinātu iekšā Ļaujiet man iet uz priekšu un palaist copy1, Enter, ka kaut ko: sveiki mazie burti. Tā kapitalizēti kopiju, bet tas acīmredzot kapitalizētas oriģinālu, kā arī, jo tas, ko tagad notiek šajā stāstā? 27 līniju man nav faktiski šķiet, kopējot virkni, bet pat ja jūs varētu būt intuitīvi cerēja, ka būs gadījums, ja jūs domājat par šo attēlu, ko īsti es esmu darījis? Puse no attēla ir pats. Tāpēc pieņemsim roll atpakaļ laikā, lai t vēl nav stāstā. S var pastāvēt stāsts, bet pieņemsim mazo sveiki šo laiku. Tāpēc ļaujiet man noteikt, ko es patiesībā drukāti collas Šajā gadījumā šeit mums ir h-e-l-L-o. Mēs izdarīt to kā rakstzīmju secību, manu atdalītāju līnijas šeit un mans \ 0. Tātad tas ir, ja mēs esam ātrāk 1 līnijas līdz 24-ish, sniegt vai pieņemt, ir izpildīts. Tas ir aina manā atmiņā. Kad man līdz 27 līnija, kas notiek? Tāpat kā līdz šim, man rādītāju, ko es ņemšu sagatavot kā šajā laukumā. To sauc t. Un kāda ir tās vērtība pēc noklusējuma? Kas to lai zina? Daži atkritumu vērtība. Tāpēc es ņemšu abstrakti, ka prom kā jautājuma zīme. Un tiklīdz labajā pusē 27 līnijas izpilda, ko es liekot iekšā t? Tas pats, kas ir s. Tātad, ja mēs uz brīdi izņemt šo ieguvi bultiņas un mēs sakām, Ak, tas ir atmiņas slodze adrese 123 kad jūs sakāt t izpaužas s, semikolu, jūs burtiski liekot 123 šeit. Tagad, ja mēs veida vienkāršo pasauli atkal ar attēliem, ko jūs esat patiešām izdarīt, ir tikai pievienots vēl viens bultiņas jūsu pasaulē kas ir virzienā no t to pašu precīzu virknes. Tātad, ja 31 rindā un 32 es tiešām iet par maiņu t [0], kas ir t [0] acīmredzot sinonīms tagad? s [0] Tā ka viss, kas notiek. Un pat ja šāda veida jūtas nedaudz zems līmenis un mistiskā un šāda veida jūtas kā varbūt intuitīvi tas būtu vienkārši strādājām - Esmu veikti kopijas lietām pirms un tas tikai strādāja - ja jūs tiešām domājat par to, ko virkne patiešām ir, tas ir char *. Nu, kas tas ir? Tas adresi kādu raksturs. Tad varbūt tā ir lielāka jēga, ka, ja jūs mēģināt kaut ko darīt super šķietami vienkāršs, piemēram, tas, visi jūs darāt, ir kopēšana atmiņas adrese. Jūs neesat faktiski dara kaut ko ar virkni pati. Tātad, pat ja jums nav ne jausmas, kā jūs varētu atrisināt šo problēmu kodu, augsta līmeņa, konceptuāli, ko mums vajag darīt, lai padarītu ta kopija s, acīmredzot? Yeah. >> [Students] Piešķiriet jaunu atrašanās vietu? >> Tieši tā. Mums ir nepieciešams, lai dotu t pavisam jaunu vietu. Mums vajag kaut kā radīt pasauli, kurā mēs saņemtu jaunu rieciens atmiņas, kas tikai skaidrības labad es izvilkšu labi zem šo vienu, bet tas nav nepieciešams būt tur. Bet tai ir jābūt vienāda izmēra, tāpēc es ņemšu izdarīt šīs vertikālās līnijas vienā vietā. Tas ir jauki, ja tas ir viss atkritumu sākotnēji. Kurš zina, kas tur bija? Bet soli 1 gatavojas jābūt dot man tik daudz atmiņas, kā man vajag uzstādīt kopiju sveiki, tad izdomāt, kā kopēt h šeit, e šeit, l šeit un tā tālāk. Bet tas jau vajadzētu justies mazliet skaidrs, pat ja dažas detaļas vēl abstrakti. Nokopēt šo string vērā to, tas ir tikai par cilpu vai kamēr cilpa vai kaut ar kuru jūs esat kļuvis vairāk pazīstams. Tāpēc pieņemsim mēģināt šo. Ļaujiet man iet copy2.c. Jo copy2.c mums ir gandrīz to pašu programmu, izņemot par 27 līniju. Tas izskatās mazliet sarežģītāka, bet, ja mēs sadalīt gabalu pa gabalu, kreisajā pusē ir tāda pati. Char * t rada šo lietu atmiņā, kaut arī ar jautājuma zīmi jo mums nav ne jausmas, kas tur pēc noklusējuma. No labajā pusē mēs tagad ievieš jaunu funkciju, malloc, par atmiņas piešķirt, dod man atmiņu, un tas acīmredzot aizņem cik argumenti, cik daudz iekšā iekavās? Es dzirdēju murmurings 1 un 2, bet tas ir tikai 1. Nav komats, kas nozīmē, ka ir tikai 1 lieta iekšpusē iekavās. Kaut gan tur ir citi iekavas, ļaujiet man uzsvērt kas ir iekšā no attālākajiem iekavās, un tas ir tas izteiciens: (Strlen (-s) + 1) * sizeof (char). Tātad, ja mēs tiešām domāju, ka tas cauri, tas ir teikts man garumu s. Kāpēc es esmu, lai gan, pievienojot 1 uz garumu? >> [Dzirdams studentu reaģēšanas] Tieši tā. Mums vajag telpa šo puisi pie astes, sestais raksturs ka nav angļu nozīme bet tomēr ir īpaša programmatisku nozīme. Tāpēc mums ir nepieciešams + 1 par to, jo strlen atgriež cilvēku gaidās garuma, sveiki vai 5, tas nedod jums papildu null raksturs. Tāpēc es manuāli pievienot to ar 1 +. Un tad tas, * izmērs (CHAR), mēs neesam redzējuši šo pirms. Tas nav tehniski funkcija. Tas ir īpašs atslēgvārds, kas tikai stāsta jums to izmērs ir dažu datu tipa datorā jo patiesībā, daži no mums ir 32 bitu datoriem. Man ir diezgan vecs dators mājās, un tas izmanto tikai 32 bitus, lai pārstāvētu norādes. Un tāpēc, ja man bija lieluma datu tipu, tas varētu būt 32 biti. Bet, ja es esmu, izmantojot manu jauno iedomātā datoru, es varētu saņemt atpakaļ vērtību 64 bitiem kaut ko līdzīgu adresi. Tātad šajā gadījumā, tikai, lai būtu super droša, mēs nebrauksim uz cietā kodu kaut ko līdzīgu - labi, kāda ir lielums CHAR saskaņā ar to, ko mēs esam teica tik tālu? Mēs esam diezgan daudz teica mutiski, ka tas ir 1 baits, un tas ir diezgan daudz taisnība visā kuģa. Bet atkal, pieņēmumi mēdz būt slikti. Viņi izraisīt buggy programmatūru, ja cilvēki izmanto savu programmatūru, kā tu nebija paredzējuši. Tātad pieņemsim abstrakta šo prom, un tikai vairāk vispārīgi pateikt Man vajag šo daudz gabalu no atmiņas un katrs no atmiņas rieciens būtu līdzvērtīgs ar izmēru raksturs, kas faktiski ir vienāds ar šajā gadījumā 1, bet tas ir vairāk vispārējs veids, to rakstīt. Tātad, ja vārds ir sveiki, cik daudz baitu tas malloc acīmredzot piešķirt uz sveiki? [Students] Seši. >> Seši. Tieši tā, kā daudz kā mums ir jautājuma zīmes uz ekrāna. Un tad domāju, tagad, pamatojoties uz savu izpratni par GetString Kāda malloc iespējams atgriezties? >> [Students] adrese. Adresi, ko? Pirmās rieciens atmiņas. Mums nav ne jausmas, kāda ir tur, jo dažas citas funkcijas varēja izmantot šo atmiņu iepriekš. Bet malloc, tāpat GetString, atgriež adresi pirmo baitu atmiņas ka tā ir atvēlēti jums. Tomēr, ko tas nav jādara, ir aizpildīt šo tukšo ar slīpsvītru null raksturs jo izrādās jūs varat izmantot malloc atvēlēt kaut: Ints, stīgas, masīvi pludiņiem, studentu struktūras. Jūs varat izmantot malloc pilnībā vispārēji. Tas nav aprūpi, vai ir jāzina, ko jūs piešķirot atmiņu. Tātad tas būtu iedomīgs, lai malloc likt \ 0 beigās katra rieciens atmiņas tas dod jums jo tas \ 0 lieta ir tikai konvencija par stīgām. Tas nav izmantots Ints, tas nav izmantots pludiņiem, tas nav izmantots studentiem. Un tā ar malloc gotcha ir, ka slogs ir tikai no jums programmētājs jāatceras, cik daudz baitu jūs piešķirtas un nav kādreiz izmantot, lai cilpa vai kamēr cilpa un aiziet pagātnē robežas rieciens atmiņas jūs esat dota. Citiem vārdiem sakot, tiklīdz jūs piešķirt atmiņu, Jūs nevarat prasīt operētājsistēmu, ak, starp citu, cik liels ir rieciens atmiņas bija tas? Tas ir pilnībā atkarīgs no jums, lai atcerēties, ja jums nepieciešama šo vērtību. Tātad, pieņemsim redzēt, kā es sākt izmantot šo atmiņu. 28 Saskaņā un 29 kāpēc es esmu to izdarīt? Tikai kopā veselība pārbaudītu. Tikai gadījumā, ja kaut kas nogāja greizi, es lūdzu kādu traks atmiņas apjomu vai man ir tik daudz lietas, kas darbojas ar datoru, kas tur vienkārši nav pietiekami daudz atmiņas, kaut kas tamlīdzīgs, es vismaz gribu, lai pārbaudītu null. Patiesībā, lielākā daļa datoru dos Jums ilūziju, ka katru programmu var izmantot visus ar savu RAM, bet pat tad, ja lietotājs veidiem dažās traku ilgi virknes varbūt tāpēc, ka viņi slikts puisis un viņi faktiski mēģina crash savu programmu vai banalizēt tajā, Jūs vēlaties, lai vismaz pārbaudītu atgriezto vērtību malloc un vai tas būs vienāds null. Un, ja tas tā ir, pieņemsim tikai atmest tiesības tagad, jo es nezinu, ko darīt šajā lietā. Kā kopēt string? Ir daži veidi, kā to izdarīt. Ir iela kopēt funkcijas C, bet tas ir super vienkārši, lai mēs varētu darīt to vecmodīgs veidā. Pirmais ļaujiet man saprast, kāda no S garums. Es varētu būt nodot to cilpu, bet tā vietā es vienkārši ielieciet to šeit skaidrību. Tātad n tagad saglabā garumu sākotnējā virknes, kas ir acīmredzot 5. Tad manā cilpa es esmu atkārtojot no 0 uz līdz n, un uz katras iterācijas es varēšu s [i] iekšpusē t [i]. Tātad, tas ko es netieši ar manu 2 pirkstiem norādot uz stīgām pirms tam. Tā kā šis cilpa vairākkārt uzsvērts, piemēram, tas, es esmu būs kopēšanu h vērā šeit, e uz šeit, l vērā šeit, jo tas ir s, tas ir t. Un tad visbeidzot, 35 rindā, kāpēc es daru šo? Man nepieciešams, lai pārliecinātos, ka es esmu beidzot virknes t. Un es darīju to tādā veidā, lai būtu super skaidri. Bet ierosināt, kāds, ja jūs varētu, cits veids, kā to izdarīt. Man nav tiešām ir nepieciešams līniju 35. Ir vēl viens veids, kā to izdarīt. Yeah. >> [Dzirdams studentu reaģēšanas] >> Say tā skaļāk. [Students] Mazāks vai vienāds ar. >> Tieši tā. Mēs varētu tikai teikt mazāks vai vienāds ar n, kas kopumā ir slikti jo gandrīz vienmēr, kad mēs aiziet līdz vienāda ar lieta, ko mēs esam skaitīšanas mēs ejam 1 solis pārāk tālu. Bet atceries, cik daudz baitu vai mēs piešķirt? Mēs piešķirti strlen no s, tāpēc 5 + 1 par kopējo summu 6. Tātad šajā gadījumā mēs varētu darīt kaut kas līdzīgs šim tāpēc, ka mēs kopēšanas ne tikai sveiki, bet arī \ 0 pašās beigās. Alternatīvi, mēs varētu izmantot funkciju sauc ielā kopēt, strcpy, bet tas nav gandrīz tikpat daudz jautrības. Bet tas ir viss tas zem motora pārsega. Tad visbeidzot, mēs darīt to pašu, kā iepriekš. Es kapitalizēt t, un tad es apgalvo, ka sākotnējais izskatās šo un kopija izskatās, ka. Tāpēc pamēģināsim šo tagad. Ļaujiet man iet šeit. Padarīt copy2. Mēs tuvinātu un palaist copy2. Es esmu gatavojas rakstīt sveiki kā mazie, un tiešām man mazie sveiki kā oriģināls bet kapitāls Sveiki uz kopiju. Bet es neesmu darīts tikai vēl. Man vajag darīt pēdējās 1 lieta šeit. 46 un 47 ir skaidri atbrīvojot atmiņu, bet ko tas patiesībā nozīmē? Ko es daru, jūs domājat, zvanot līnijas 46 un līnija 47? Kādas sekas tas, ka ir? Yeah. [Dzirdams studentu reaģēšanas] >> Tieši tā. Jums ir tikai stāsta operētājsistēmu, hei, paldies par šo atmiņu. Tagad varat izmantot to, lai kāds cits. Un šeit ir perfekts piemērs atkritumu vērtībām. Man ir tikai izmanto šo atmiņu pierakstīt vārdu sveiki 2 vietās, šeit, šeit, šeit, un šeit. Tātad šī ir h-e-l-l-o-\ 0. Bet tad es aicinu līniju 46 un līniju 47, un jūs zināt, kas notiek tur ziņā attēlā? Patiesībā, pagaidiet, šī aina veco. Kad mēs kopiju, šis puisis ir patiešām vērsta šeit, tāpēc pieņemsim izņemt numurus un tikai abstrakts prom, jo ​​mūsu bultas vēlreiz. Kas notiek šajā attēlā, kad es aicinu bez maksas? [Dzirdams studentu reaģēšanas] >> Nav pat. Ja es aicinu bez maksas s un t - veida āķīgs jautājums - šo attēlu nemaina vispār jo zvanot s un aicinot t tikai stāsta operētājsistēmu, hey, jūs varat izmantot šo atmiņu atkal, bet tas nemaina to null vai kādu īpašo raksturu, tas nemaina to, tas nemaina h vai e vai L vai l vai Õ nu vietā kaut kas cits. Runājot par attēla, tiklīdz jūs zvanīt bezmaksas, nekas nemainās. Un šeit izcelsmi atkritumu vērtību, jo, ja es tad vēlāk šajā programmā lūgt operētājsistēmu vairāk atmiņas ar GetString vai malloc vai kaut kas tamlīdzīgs un operētājsistēmas saka, pārliecinieties, man ir 12 baiti atmiņā tikai atbrīvotos, izmantot šos, ko jūs gatavojas, lai nodotu? Jūs esat būs pasniedza rieciens atmiņas ka mēs parasti sagatavot ar jautājuma zīmēm, bet kādi ir šie jautājuma zīmes? Tie gadās būt h-e-l-l-o, h-e-l-l-o. Tie ir mūsu jaunie atkritumu vērtības, tiklīdz jūs atbrīvotu šo atmiņu. Tur reālās pasaules Ietekme arī šeit. Tas notiek darīt ar RAM, bet jūsu datoru faktiski darīt to pašu ar disku. Mēs runājam par to, jo īpaši ar nākotnes problēmu kopumu, kas vērsta uz kriminālistiku. Bet kas patiesībā notiek, ja Jums ir dažas jutīgu finanšu failu uz darbvirsmas vai kādu paviršs JPEG un velciet to savā miskastes, kas notiek, ja jūs velciet to uz miskasti vai atkritnes? Jūs zināja, ko es runāju par. [Smiekli] Kas notiek, ja jūs esat vilka, ka pierādījumi par jūsu atkritni vai trash var? [Dzirdams studentu reaģēšanas] Nu, tik uzmanīgs. Kas notiek, ja jūs to darīt? Īsā atbilde ir nekas, vai ne? Paviršs vai jutīga fails vēl tikai sēž tur kaut kur jūsu cietā diska. Lielākā daļa no mums vismaz ir iemācījušies cietā veidā, ka jums ir nepieciešams iztukšot miskasti vai jūsu Recycle Bin faktiski dzēst failus. Un tiešām, kad jūs tiesības klikšķi vai Control klikšķi uz jūsu trash var vai izvēlēties File, Empty Trash vai neatkarīgi un jūs faktiski tukšs trash var vai atkritni, kas patiesībā notiek, tad ar šo attēlu? Vairāk nekas. Tātad nekas patiesībā notiek uz diska. Un, ja mēs vienkārši īslaicīgi novirzīties un rakstīt - I'll vienkārši lietot aizmugurē šo. Tāpēc tagad stāsts mainās no RAM, kas ir, ja programmas pastāv kamēr jūs tos palaižot, uz diska, kas ir, ja tie tiek uzglabāti ilgtermiņa pat ja jauda apdziest, tagad - un mēs būsim atpakaļ uz to turpmāk - pieņemsim tikai izlikties, ka tas ir uz cietā diska iekšpusē jūsu datoru jo atpakaļ dienā viņi izmanto, lai būtu apaļa diski, līdzīgi disketēm. Tātad, ja jums ir kāda jutīga Excel failu, tas var aizņemt šo gabalu no atmiņas datora diska, un es esmu tikai zīmēšanas pati patvaļīgu 1s un 0s. Velkot failu, piemēram, ka uz jūsu trash var vai atkritni, burtiski nekas nenotiek, jo Apple un Microsoft ir tikko nolēma trash var un recycle bin ir tiešām tikai pagaidu vietturis. Varbūt beidzot OS būs tukša to jums, bet parasti, tas nedara neko, vismaz līdz brīdim, kad jūs patiešām maz vietas. Tomēr, ja jūs doties uz tukšo miskasti vai tukšas atkritni, Tāpat, nekas nenotiek uz šo attēlu. Viss, kas notiek, ir citur datorā, ir dažas no tabulas veida. Tas ir veida, piemēram, maz apkrāptu lapā, kas saka, ka, teiksim, resume.doc, lai jūsu atsākt Microsoft Word failu izmanto, lai dzīvot uz cietā diska 123 vietā, nav atmiņā, un nav RAM, bet uz cietā diska, un jūsu ieskicējoši JPEG dzīvo pie 456, un savu Excel failu dzīvo pie 789 vai kur. Kad jūs izdzēst failus, faktiski iztukšojot miskasti vai atkritnes, šo attēlu nemainās. 0s un 1s uz cietā diska nav iet visur. Bet šī galda, tas maz datubāze par veidu, mainās. Kad jūs izdzēst savu CV, tas ir it kā fails tiek izdzēsts zināmā mērā, bet visi dators dara, ir aizmirst, ja šī lieta dzīvo uz cietā diska. 0s un 1s ka komponēt savu CV vai kādu no šiem citiem failiem joprojām ir neskartas. Tātad, ja jūs šo nejauši, tur ir vēl nav nulle varbūtība ka jūs varat atgūt savus datus, izmantojot Norton Utilities vai kādu komerciālu programmatūru kuru mērķis dzīvē ir atrast 0s un 1s kas veida bāreņi, aizmirst šeit, bet atstāja šeit, lai jūs varētu saņemt datus atpakaļ. Vai kriminālistikas izmeklētāji ar policiju vai FBI faktiski veikt cieto disku un faktiski meklēt modeļus 0s un 1s ka izskatās JPEG, izskatās Excel failus, un atgūt to, ka veidā, pat ja dators ir aizmirsis tos tur. Tātad vienīgais veids tiešām dzēst datus, kā mēs apspriestu nākotnē, ir skrubis vai noslaucīt failu vai cietā diska - Jūs nevarat īsti atbrīvoties no 0s un 1s jo pretējā gadījumā jūs gribētu sākt ar gigabaitu cieto disku un jūs galu galā ar megabaitu cieto disku, ja jūs pastāvīgi bija dzēšanu, burtiski, 0s un 1s. Tātad, ko tu darītu, ja jūs patiešām vēlējās, lai segtu savas dziesmas un būtiska problēma ir tā, ka tur ir vēl 0s un 1s uz diska? Es redzu kādu gesticulating ka jūs fiziski salauzt ierīci. Kas strādās. [Smiekli] Bet, ja tas ir sava veida dārgu risinājumu, kas būtu pieņemams? Yeah. >> [Students] Pārrakstīt tos. >> Pārrakstīt tos ar ko? >> [Students] Citi dati. Citi dati. Jūs varat vienkārši pārrakstīt savu disku ar 0S vai 1s vai visu 0S, visi 1s. Un tas ir patiešām to, ko daži no programmatūras dara. Jūs varat iegādāties programmatūru vai pat saņemt bezmaksas programmatūru, un pat būvēts uz Mac OS šajās dienās, to ir mazāk Windows, ir spēja droši dzēst. Patiesībā, ja jūs vēlaties, lai visi palaist mājās šodien, ja jums ir Mac, un darīt, ja jūs esat ieguvuši dažas jūsu trash sīkumi var, jūs varat darīt, Secure Empty Trash, kas dara tieši tā. Nevis tikai dzēst failus šeit, tas neizdzēš 0s un 1s šeit, drīzāk, tas tikai maina tos visus, piemēram, lai 0s un dot, dot, dot. Tātad viens no jūsu nākotnes psets faktiski būs apzināti atgūtu datus - fotogrāfijām, ka mēs esam veikuši cilvēki, vietas un lietas, par Campus par kuru mēs veiksim kriminālistikas tēlu digitālā kamera atmiņas kartes, kas ir tieši tā pati ideja - un jums ir apstrīdēt faktiski atrast modeļiem, kas pārstāv JPEG uz cietā diska, daudz, piemēram, ka bijušais students, kura e-pasts es izlasīju pirms dažām nedēļām darīja atgūt savas māsas fotogrāfijas. Kāpēc ne mēs, 5 minūšu pārtraukumu šeit, un mēs pārgrupēt ar vairāk atmiņas. Tātad, šeit ir, ja lietas iegūt mazliet prātā saliekuma, bet tas ir ļoti spēcīgs solis uz sapratni tas viss vairāk. Šeit ir programma, ko sauc pointers.c. Tas ir viens šodienas parauga kodu. Ievērojiet, ka dažos pirmajos līniju, 19 līdz 22 visi mēs darām, ir kaut kas līdzīgs GetString un atgriešanās adresi, uzglabājot to s. Turpmāk par PSET pat 3, ja jūs vēlaties, bet PSET 4 un kur jūs varat sākt lietot šīs mācību riteņus sevi, nav iemesla cerēt, ka stīgas pastāv vairs. Tas noteikti labi, lai tikai sāktu sakot char *. Kā malā, tiešsaistes atsauces un grāmatās jūs bieži vien var redzēt zvaigzni blakus mainīgo. Jūs pat varētu redzēt telpām ap abās tā pusēs. Visi no tiem ir funkcionāli pareizi. Tagad, lai gan, mēs standartizēt uz šo pieeju, lai padarītu super skaidra ka char * ir kā saka rakstura rādītājs. Tas ir datu tips. Un tad no mainīgā vārds ir s šajā gadījumā. Tātad mēs esam gotten stīgu, un mēs esam to sauca s. Un tad noteikti šeit ievēroju, ka es esmu dara tiešām mazliet blēdība. To sauc rādītājs aritmētika, kas ir sava veida super vienkārši. Tas tikai nozīmē, pievienot un atņemt skaitļus virzienus. Bet tas tiešām darbojas. Šī programma acīmredzot drukā string s 1 raksturu katrā rindā, piemēram, ka gala rezultāts - Tikai tā mēs varam sabojāt, kur tas notiek, veikt norādes, palaist norādes, ļaujiet man tuvinātu iekšā Tagad ļaujiet man ierakstiet kaut ko līdzīgu HELLO un veids Enter un tas drukā 1 rakstzīmju katrā rindā. Līdz otrā atpakaļ, mēs būtu darījuši ar kvadrātiekava pierakstā. Mēs ir par cilpu, un mēs gribētu darīt printf par s [i] un mēs gribētu darīt atkal un atkal un atkal ar slīpsvītru n beigās katrā rindā. Bet šī programma ir atšķirīga. Šī programma izmanto, burtiski, aritmētika. Tātad, kas notiek šeit? Pirmkārt, pirms tas cilpa pat izpilda, ko, tikai, lai būtu skaidrs, ir s patiesībā? S ir? >> [Students] adrese. >> Adrese. Un tas adresi, gadījumā sveiki, pirmā rakstzīme šo vārdu, kas ir h. Tātad s, jo šajā piemērā, adresi h. Tātad, ko tas nozīmē darīt s + i? Nu, es sākas ar 0 šajā cilpa. Mēs esam darījuši daudzas reizes. Es gatavojas iet līdz garumu virknes, acīmredzot. Tātad pirmajā atkārtojuma šīs cilpas, es acīmredzot 0. Tātad šis izteiciens ir sakot s + i - drīzāk s +0--tas ir acīmredzami tikai s. Tātad, kas ir * s šeit? Tagad mēs esam izmantojot zvaigzne nedaudz citādi. Ļaujiet man iet uz priekšu un atbrīvoties no t, jo mēs esam darīts runājam par t un kopijās s. Tagad mēs vienkārši vēlamies pastāstīt stāstu, iesaistot s. Un tā šajā brīdī, pēc tam tipa stīgu, mūsu pasaule izskatās gluži tāpat kā pirms ar tikai s uzglabāšanu adresi h un vispār norādot uz virkni sveiki. Ja es tagad darīt līniju, piemēram * (i + i), pieņemsim mēģināt šo out. Tik * (i + i). Ļaujiet man vienkāršot, jo tas ir 0, tāpēc tas ir * (i +0). Nu, pagaidiet minūti. Vienkāršot tālāk. Tas ir * (-iem). Nu, tagad iekavas ir sava veida stulba, tāpēc tagad pieņemsim tikai darīt * s. Tātad pirmajā atkārtojuma šīs cilpas, ka līnija, kas ir iezīmēts, 26, ir diezgan daudz līdzvērtīgs drukāšanas šo. Kas ir datu tips * s? Šajā sakarā, jo zvaigzne notiek, ir blakus s pats, bet jo īpaši, jo mēs vairs atzīst s, mēs esam ne izveidot mainīgo vairs, tur nav char * pieminēšana 26 līnija, tur nav par atslēgvārdu virknes pieminēt, mēs vienkārši izmantojot mainīgo sauc s, izrādās tagad zvaigzne ir nedaudz atšķirīga un, protams, mulsinoši jēgu. * S šeit nozīmē doties uz s adreses un drukāt visu, kas tur. Tātad s ir šeit, * s - veida, piemēram Chutes un Kāpnes, sekojiet bultiņas - šeit. Tātad tas ir * s. Tātad, ko izpaužas uzdrukāts uz pirmās atkārtojuma ka cilpa attiecīgi 26 līnijas? Es izdrukāt% C, kas ir Vietturis raksturs, tad \ n jaunu līniju. * (I + i), kur i ir 0 ir tikai tas. Tātad, ko CHAR man novietot priekš% c? H. Nākamajā atkārtojuma no cilpas - jūs varat iespējams redzēt, kur tas notiek - nākamais atkārtojuma man ir acīmredzami 1, tāpēc tas nozīmē i +1, un tad nu man vajag iekavas jo tagad zvaigzne ir pateikt dodieties uz atmiņas adresi s 1. Kas ir s? Pieņemsim roll atpakaļ laikā un saka, tas bultiņa tagad nav faktiski dara mums neko labu. Pieņemsim precīzāk teikt, ka tas ir uzglabātu cipara 123 jo šīs virknes sākums Sveiki, šis ir adrese 123 tas ir 124, un tā tālāk. Tātad uz otro atkārtojuma, kad es saku s +1, tas ir tāpat kā teikt 123 1, citādi zināma kā 124, lai to, ko palija izpaužas uzdrukāts uz otro atkārtojuma? E pie atmiņas adresi 124. Tad + vēlreiz, 125, 126, 127, un tas cilpa laimi apstājas pirms mēs šeit jo es esmu, izmantojot strlen lai pārliecinātos, ka man tas neskaitās pārāk augsts. Lai arī ir tā. Atkal, tas ir tikai it kā mums bija darīts pirms nedēļas. Ļaujiet man rakstīt to uz līnijas zemāk, lai gan mēs negribam darīt abus. Tas ir identisks tagad šis. Tātad, pat ja s ir virkne, jo mēs esam aicinājuši to nedēļas, s ir tiešām char *. Tātad, ja mēs gribam būt super anālais, tas ir patiešām pareizi rakstīt īpašo raksturu pie kārtējam atrašanās vietu, izmantojot šos skaitliskos adreses un šī zvaigzne operators, bet godīgi sakot, tas ir tikai tik daudz tīrāks. Tātad tas nav slikti. Nav iemesla pārtraukt darīt pozīciju 27 šeit, bet 26 ir funkcionāli pats, un tas ir funkcionāli pats precīzi iemesli, kas mēs esam apspriežam līdz šim. Un visbeidzot, 29 ir tikai laba prakse. Zvanot bez s nozīmē, ka tagad jūs dodot atpakaļ atmiņas, kas GetString deva jums jo atkal, kā jau minēju Pirmdien, GetString nedēļas ir ieviest bug savā kodu. Jūsu kods nedēļas ir bijusi atmiņas noplūde , kurā jūs esat lūdzot GetString atmiņu, bet jūs nekad neesmu bijis dodot to atpakaļ. Un tas bija apzināti izvēlējušies mums pedagoģiski jo tas ir pārāk daudz domāt par agri. Bet tagad mums ir nepieciešams vairāk simetriju. Ja jūs lūgt datoru atmiņas, kā tas ir gadījumā ar GetString, kā tas ir gadījumā, acīmredzot malloc, jums tagad par 4 PSET vēlāk arī bez jebkuru šādu atmiņu. Pamanīt tas ir atšķirīgs no sakot int n. Jums nav nepieciešams, lai atbrīvotu šo, jo jums nav zvanīt GetString un jums nav zvanu malloc. Un pat ja jūs sauc GetInt kā mēs beidzot redzēt, GetInt nepiešķir atmiņu jums, jo jūs faktiski var iet apkārt integers un pludiņi un chars tikai veids, kā mēs esam darījuši, lai nedēļas. Stīgas, lai gan, ir īpašs, jo tiešām viņi konkatenācija vairākiem simboli. Tāpēc viņi vienkārši atšķiras no chars un pludiņiem un Ints un tamlīdzīgi. Bet mēs būsim atpakaļ, ka pirms ilgi. Jebkādi jautājumi, tad par šo sākuma norādes? Yeah. [Dzirdams students jautājums] Ah, ļoti labs jautājums. Viena no retajām lietām C tiešām jums, kas ir ērts, tas ir skaitļi, par jums, kāda lieluma ir datu tipu un tad tas, ka vairošanās jums veida. Tas nav nozīmes, ja chars jo gandrīz vienmēr char ir 1 baits, tāpēc tas vienkārši darbojas. Bet labad diskusiju, ja jūs faktiski drukāšanas integers un jūs mēģināt izdrukāt dažas vērtības ir kas tika pavērsts veselam skaitlim, tu tāpat nebūtu jādara + 4 * Es tikai tāpēc int ir 4 baiti. Rādītājs vidējais aritmētiskais, ka C un kompilators darīt visu, kas math jums. Viss, kas Jums ir rūpēties par ir skaitīti veida cilvēka izpratnē. Yeah. [Students] Ja jūs atzīt virkni iekšpusē uz cilpas, jums ir, lai atbrīvotu to vēlāk? Labs jautājums. Ja jūs paziņoja virkni iekšpusi uz cilpas, jums ir nepieciešams, lai atbrīvotu to vēlāk? Jums tikai nepieciešams, lai atbrīvotu atmiņu, kas jums piešķirt ar GetString vai ar malloc. Tātad, ja jūs vienkārši pateikt kaut ko līdzīgu - ļaujiet man likt cirtaini bikšturi tagad tik viss kods ir saistīts. Ja jūs kaut ko, taču par buggily, piemēram, tas, char * t = s, Jums nav nepieciešams, lai atbrīvotu t jo t neietver atsauces uz malloc vai GetString. Turpretī, ja jūs šo, GetString, tad jā, jums būtu nepieciešams, lai bez t. Un patiesībā, jūsu vienīgā iespēja to darīt, tagad ir iekšā šajā cilpas, par to pašu jautājumu par jomu ka mēs esam apspriests agrāk. Pretējā gadījumā jūs vēlaties būt piešķirot atmiņu, piešķirot atmiņu, piešķirot atmiņu, un beigās programmā, jo tu esi ārpus šīs cilpas, t nav, bet jūs nekad nav teicis operētājsistēmu ka jums nav nepieciešams, ka atmiņas vairs. Un pirms ilgi, par 4 PSET vai 5 mēs aprīkot jūs ar programmu, ko sauc Valgrind, kas ir līdzīga garu gdb jo tas ieguva nedaudz par arcane saskarni, bet tā mērķis dzīvē ir palīdzēt jums. Un Valgrind ir programma, kas būs nākotnē meklēt savu programmu meklē atmiņas noplūdes, vai no GetString vai malloc, ko mēs sāksim izmantot visu vairāk, kā mēs pārtrauktu izmantot CS50 bibliotēku tik daudz. Mums beidzot tagad ir par leksiku veida un garīgo modeli teorētiski kārtošanas ar kuru, lai atrisinātu šo šķelto programmu. Tāpēc šajā šķelto programmā, mijmaiņas darbi iekšpusē swap, bet tā nekad faktiski nostrādāto galvenais jo galvenais pagājis X un Y atgādināt, un tie tika pieņemti pēc vērtības, lai runāt. Kopijas no viņiem tika dota swap. Līdz gada beigām mijmaiņas, un b patiešām bija apmaiņa, bet, protams, x un y, kā mēs apspriests pirmdien, nav bijis. Tāpēc es ierosinu zaļā šeit, ka tas ir faktiski risinājums šeit. Un tiešām, ļaujiet man pārvietot manu zvaigznes tikai, lai būtu konsekventi kaut gan, atkal, funkcionāli tas nav svarīgi. Nākotnē nedēļās mēs izskaidrot, kad un kāpēc tas nav jautājums. Tātad zaļā tagad ir risinājums. Atklāti sakot, tas izskatās visai daudz Messier, jo man ir visas no šīm zvaigznēm. Ļaujiet man norādīt viena lieta. Augšējā līnija šeit, kur ir teikts, int * un int * b ir fundamentāli dara to pašu, jo tas vienmēr ir. Tas ir atzīts 2 argumentus vai parametru swap, no kuriem pirmais ir int rādītājs sauc, un otrās ir int rādītājs saukta b. Vienīgais, kas jauns šajā brīdī ir tas, ka tur ir zvaigzne tur. Ko tas nozīmē? Nav int, b nav int. Ir adrese int un b ir adrese citā int. Šeit lejā, tas ir, ja es atzīstu C kļūst neskaidra. Tagad mēs esam izmantojot zvaigzni, bet tā ir cita nozīme šajā kontekstā. Jo mēs esam ne atzīstot norādes, jo mēs esam šeit, šeit mēs dereferencing lietas. Tātad tehniski, zvaigzne šajā sakarā pirmā, otrā un trešā rindā iekšpusē mijmaiņas ir dereference operators, kas nozīmē tikai iet tur. Tā tāpat kā mans pirksts sekoja bultiņas uz h, * Līdzeklis iet uz šo adresi un atrast man int, kas ir tur. * B līdzekļiem iet uz adresi un iet man, kas ir tur. Tāpēc pieņemsim ievilktu attēlu no pirmdienas tagad izmanto kaudze rāmji, apakšējā no kuriem viens būs galvenais, augšējā no kuriem viens būs mijmaiņas, tāpēc, ka mūsu pasaule izskatās, tāpat kā pirmdien, kā šis. Šeit ir atmiņas rieciens, ka galvenais ir gatavojas izmantot. Atgādināt, no pirmdienas, ka programma tikai bija 2 mainīgie, viens sauc x un vienu sauc y, un man bija likts numurus 1 un 2 tur. Tagad, kad es aicinu swap piemēram, I did pirmdien, agrāk, kad es izmanto sarkano versiju šīs programmas, kas izskatās šādi, Man 2 parametri, un B, un ko īsti mēs rakstīt šeit un šeit? Tikai 1 un 2, burtiski kopijas x un y. Šodien mēs mainīt. Šodien nevis brauc, Ints un b mēs spēsim iziet 2 adreses. Šie adreses notikt norādīt uz Ints, bet šie adreses nav Ints sevi. Tie ir adreses. Tas ir tāpat kā ar pasta adreses vietā. Tāpēc tagad mums ir tikai dot sev nedaudz sīkāk uz ekrāna. Šī ir mana datora atmiņā, kā tas ir bijis visu dienu. Tagad mums vajag kādu patvaļīgu numurēšanas sistēmu. Tāpēc pieņemsim tikai teikt, tikai nejauši, ka šis ir atmiņas adrese 123, 124. Pieņemsim tikai teikt, tas ir 125, tas ir 126, un tā tālāk, bet tas ir pilnīgi patvaļīgi. Mums tikai vajag kādu numerācijas shēmu manā atmiņā. Tāpēc tagad, kad es tiešām iet uz x un y, es neesmu gatavojas iet uz x un y; Es esmu gatavojas iet uz pasta adresi, tā sakot, no x un y lai tas, ko izpaužas uzglabā šeit un šeit nav 1 un 2, bet, ja jūs varat redzēt manu nelielu tekstu, kas izpaužas pagājis šeit un šeit? [Dzirdams studentu reaģēšanas] >> Tieši tā. 123 izpaužas likts šeit un 124 izpaužas likts šeit. Tagad, jo es izmanto zvaigzne šajā pašā pirmajā rindā veidā šeit augšā, mana programma vienkārši zina, ka 123 un 124, lai gan viņi acīmredzot veseli ka jebkurš cilvēks varēja pamanīt, tie būtu jāinterpretē kā adreses, ciparu adreses. Tie nav un par sevi Ints, viņi adreses, un tas ir tāpēc, ka man ir skaidri likts zvaigznes tur. Tāpēc tagad savā pirmajā, otrajā un trešajā rindā faktiskais kods, kas notiek šeit? Pieņemsim izdarīt pārējo attēlu. Tmp ir tāpat kā tas bija pirmdien. Nekas īpašs par TMP. Tā ir tikai vietējie 32 biti mainīgs, un iekšā, ka es esmu acīmredzot uzglabātu vērtību *. Tagad, ja es tikko teicu tmp =, kādi būtu man šeit? >> [Students] 123. 123. Bet tas nav tas, ko es daru. Es saku tmp = *. Star līdzekļi iet tur. Tātad, šeit ir, 123. Kā es varu iet tur? Izlikties, piemēram tur bulta. Nu, tur tas ir, 1. Tātad, ko izpaužas uzglabā TPP, acīmredzot? Tikai 1. Tātad citiem vārdiem sakot, TVP ir * a, * līdzeklis iet uz adresi, kas pašlaik, kas ir acīmredzot 123. Labi, šeit mēs esam pie 123 vietā, es redzu numuru 1, tāpēc es esmu gatavojas nodot numuru 1 tur. Tagad ko man darīt 2 līnijas, * = * b? Tas viens ir mazliet vairāk iesaistīties, jo tagad to, kas ir? Tas ir 123. Tātad * ir, ja? Labi, ja man bija pirms tam. Tā iet tur. Labi. Tagad, visbeidzot, un tad beidzot tas sāk jēgas, cerams, * B nozīmē to, kas b? 124. Tāpēc man vajag iet tur, kas ir 2. Tātad, ko man kur? 2 iet uz vietas, jo * b tērēta *. Tāpēc es darīšu to. Un jūs jau varat redzēt, varbūt, ka mēs esam tik daudz tuvāk lai atrisinātu šo stulba, vienkāršu problēmu pareizi pirmo reizi jo tagad mums vēl ir atmiņas par to, kas x bija, mums ir 2 kopijas, protams, y, bet līnija 3 tagad saka * b. Tātad, šeit ir b. * B līdzekļi iet tur. Tātad, ja ir vieta 124? Tas acīmredzot šeit. Tātad, ko man šeit? Acīmredzot, tmp. Tāpēc tagad es to izdarītu. Tāpēc man ir 1 Šeit un 2 šeit. Un tagad ko par visu šo, 123, 124, un 1? Tiklīdz mijmaiņas atdevi, šī atmiņa ir tikpat laba kā zaudēja jo tiklīdz swap atdevi, operētājsistēmu ir brīvi izmantot šo atmiņu atkal nākotnē. Tikai galvenās atmiņā apakšā šo tā saukto kaudze pielīp apkārt. Un tā mēs beidzot esam tagad darba versiju. Ļaujiet man iet swap.c, un paziņojums sekojošo. Augšpusē programmas es esmu mainījies mans prototips būs int * un int * b. Tātad vienīgā lieta es mainīts iet no sarkanā, kas bija slikti, uz zaļu, kas ir labs, ir I pievienotās šīs zvaigznes šodien. Bet tad noteikti šeit mijmaiņas sevi man bija, lai kopētu, ielīmētu, kas bija tikai slaidā. Man ir zvaigzne šeit, zvaigzne šeit - kas atbilst prototipu - un tad visas šīs lietas tagad ir zvaigznes, izņemot TMP jo izmantošana pagaidu mainīgo, tur nekas jauns tur. Man tikai vajag pagaidu uzglabāšanu int. Tāpēc mums nav vajadzīga zvaigzne tur. Mums tikai vajag zvaigzni, lai mēs varētu šķērsot šo veida patvaļīgas robežu starp šīm 2 kadri mana datora atmiņā. Bet viena pēdējā lieta ir jāmaina, un jūs varētu būt glimpsed jau. Kas cits līnija ir acīmredzami atšķirīgs tagad? >> [Students] & x. Yeah, tāpēc 25 ir pēdējā rindā kodu man jāmaina, lai tas darbotos. Pirms nedēļas un pat pirmdien 25 līnija izskatījās, mijmaiņas x un y, un tas bija tikai sadalīti, jo, ja jūs sakāt mijmaiņas (x, y) Jūs dodat kopijas x un y swap, tad tas dara savu lietu, bet jūs nekad tiešām mainās x un y pati. Tātad, pat ja jūs nekad neesmu redzējis šo raksturu pirms ar & zīmi ar kodu, lietojiet tikai minējums. Kāda zīme & darīt, acīmredzot? [Students] uzskata adresi. >> Uzskata adresi. Tātad zīme & saka man adresi x. Kurš zina, kur tas ir? Tas notiek, ir 123. Man vienalga. Tikai dod man adresi x. & Y nozīmē man adresi y. Un tajā brīdī stāsts ir lieliski saskan ar attēlu mēs vērsa pirms brīža. Tāpēc es ņemšu uzņemt norādes, protams man, kad es pirmo reizi sāku mācīties šo, bija noteikti viens no cieta lietas, lai wrap manu prātu apkārt. Bet saprast, it kā mēs turpināt spēlēt ar šīm lietām veidu, ja jūs sadalīt uz šo super vienkāršu veida intelektuāli neinteresantas problēmas gada vienkārši pārvietojas numurus apkārt, atbildi uz daudz neskaidrību ar norādes tiešām var iegūt no šiem ļoti pamata mehāniku. Lūk adresi. Iet tur ar zvaigzni. Vai otrādi, šeit zīme &. Skaitlis, ko adrese patiesībā ir. Labi. Tātad, ja ir visas šīs atmiņas nāk no? Mēs esam sastādīts šo attēlu pāris reizes, un es glabāt daudzsološs mēs atgriezties pie tā, bet šeit ir pārstāvība datora atmiņā tas nedaudz vairāk marķēti kā mūsu tāfeles šeit ir. Teksts segments augšā atspoguļo to, ko saistībā ar savu programmu? [Dzirdams studentu reaģēšanas] >> Atvaino? Atkārtoju vēlreiz. [Students] faktiskā programmas. >> Faktiskā programmas. Tik 0s un 1s ka jums ir apkopojusi pēc rakstot C kodu un tad darbojas šķindēt un radot 0s un 1s beidzas līdz kļūst tucked tur atmiņā jo, kad jūs dubultklikšķi uz ikonas uz jūsu Mac vai PC vai palaist komandu, piemēram, Mario pēc Jūsu tūlītēja, jūsu 0s un 1s no diska get ielādēta atmiņā, lai dators varētu manipulēt ar viņiem un izpildīt tos ātrāk. Tātad inicializēts dati un neinicializēts dati, mēs nevarēsim runāt daudz par tiem, bet tie ir tikai globālie mainīgie. Inicializēts nozīmē globālo mainīgo, ka jūs devāt vērtības; neinicializēts nozīmē globālo mainīgo, ka jums nav vēl dod vērtības. Tad tur ir šie vides mainīgos, ko es ņemšu pilnīgi vilnis savu roku pie, bet tie ir tur, un kas saglabā lietas, piemēram, jūsu lietotāja vārda un citu veida zemāka līmeņa detaļas. Bet juiciest gabalu no atmiņas izkārtojumu ir šo lietu sauc kaudze un kaudze. Kaudze atkal, lai būtu skaidrs, ir atmiņas, kas tiek izmantots, ja funkcijas sauc, ja ir vietējās mainīgie un ja ir parametri tiek nodots ap. Visi, kas notiek kaudze. Kaudze mēs neesam runājuši par to, bet ņem uzminēt, kas izmanto šo kaudze. Tikai atšķirīga rieciens atmiņas. Tas notiek, ko var izdarīt šeit augšā, bet tas ir patvaļīgs ilustrētā konvencija. Kurš acīmredzot bijis, izmantojot atmiņu no kaudzes nedēļas? Tas ir tehniski tu bet netieši. >> [Students] GetString. GetString un malloc. Tātad šeit ir būtiska atšķirība. Jūs zināt par pēdējo nedēļu, ka, ja jums ir nepieciešams atmiņas, tikai deklarēt mainīgo. Ja jums ir nepieciešams daudz atmiņas, deklarēt masīvu tiesības iekšpusē savu funkciju. Bet problēma, mēs esam tur saskaras, ir, ja jūs deklarēt mainīgos lokāli iekšpusē funkciju, tiklīdz funkcija atgriež, kas notiek ar atmiņu un tiem rādītājiem? Vienkārši veida tas vairs cieņā, vai ne? Tā vienkārši pazūd veida konceptuāli. Tas joprojām fiziski tur, acīmredzot, bet tas vairs nav jūsu tiesības izmantot. Tas ir acīmredzami problemātiska, ja jūs vēlaties rakstīt funkcijas dzīvē kas faktiski piešķirt atmiņu un nedod to atpakaļ uzreiz. Lieta punktā: GetString nolūks dzīvē ir būt ne jausmas iepriekš cik liels ir virknes es esmu gatavojas rakstīt uz klaviatūras, bet tas ir tagad, lai varētu piešķirt atmiņu turēt Dāvidu vai HELLO vai visa eseja, kas lietotājam varētu būt drukāti collas Tātad GetString ir bijis, izmantojot malloc. Malloc tāpēc jābūt izmantojot nevis kaudze; vietā tas ir, izmantojot šo lietu sauc kaudze. Tur nekas atšķirīgs par atmiņu. Tas nav ātrāk vai lēnāk, vai kaut kā tā. Tas ir tikai fiziski atrodas citā vietā. Bet noteikums ir tāds, ka atmiņa, kas ir piešķirti uz kaudzes nekad netiks ņemts prom no jums, kamēr jūs aicināt - ņem uzminēt - bez maksas. Savukārt, kāds atmiņas jūs lūgt uz skursteņa, tikai deklarējot masīvs vai deklarē mainīgo, piemēram, mēs esam bijuši dara nedēļas, ka pēc noklusējuma nonāk uz skursteņa. Un tas lieliski darbojas 90% no laika, bet par tiem retāk gadījumos kur jūs vēlaties piešķirt atmiņu un saglabāt to apkārt, tad jums ir nepieciešams, lai izmantotu funkciju, piemēram, malloc. Vai mēs esam izmantojuši funkcijas, piemēram GetString, kas savukārt izmanto malloc. Let 's redzēt, kur tas varētu sadalīt un tad palūrēt Binky. Mēs būsim atpakaļ, ka nākotnē. Te ir super vienkāršs programma, kas pirmajās 2 rindās ko dara? Angļu, ko darīt šie pirmie 2 rindas koda darīt iekšpusē galvenais? [Dzirdams studentu reaģēšanas] Uzmanīgiem. Tas nedod man adresi X vai Y. [Students] Dod norādes uz Ints. >> Labi. Dodiet man 2 norādes uz veseliem skaitļiem. Citiem vārdiem sakot, dod man 2 gabalos atmiņas, kas man uztur zīmējumu šodien, kaut gan es izdzēst to tagad, kā kvadrātu. Dodiet man 2 gabalos atmiņas, vienu sauc X, viens sauc y - agrāk es sauc viņus s un t - un kāda ir šī rieciens atmiņas veids? Tas notiek, lai saglabātu adresi. Tas ir tipa int *. Tātad no int adrese beidzot dzīvo x, no int adrese beidzot dzīvot y, bet sākotnēji, kas ir iekšā no x un y? Kas to lai zina? Atkritumu vērtības. Tā nav nekāda sakara ar norādes. Ja mēs esam salikti kaut ko tur, kas zina, ko patiesībā tur? Tagad, x. Kas notiek šeit? Tas ir legit tagad, jo x ir rādītājs. Tas int *. Tātad tas nozīmē, ka es varētu likt lietā X adresi kādu gabalu no atmiņas. Kāda malloc atgriezties? Ideāls, tas atgriež adreses, adrese pirmais baits visai rieciens atmiņas. Cik baiti ir tas acīmredzot piešķirot, piemēram, iekārtas? Kas no int izmērs? 4. Ja jūs domājat, atpakaļ uz 1 nedēļu, tas nav super svarīgi vienmēr atcerēties, ka, bet šajā gadījumā tas ir noderīgi zināt, 4 baiti. Tātad tas ir piešķirot uz kaudze 4 baiti un tas atgriežas adresi pirmā man patvaļīgi. Tagad, kas ir x dara? * X = 42 dara ko? Ja šajā brīdī stāsts mums ir x, kas izskatās kā tas ar dažiem atkritumu vērtību, tagad tas ir y ar kādu atkritumu vērtību, tagad 3 rindā esmu piešķirti 4 baiti. Šis attēls būtībā izskatās šādi. Vai precīzāk, ja tas ir patvaļīgs adrese 123 tas ir tas, ko mūsu stāsts tagad izskatās. * X = 42 tagad nozīmē ko? Tas nozīmē iet uz adresi 123 nodot skaits 42 tur. Man nav nepieciešams, lai pievērstu šīs līnijas, jo mēs nedarām stīgas. Es tikko rakstīts tā, kā šis, un tikai demonstrēšanai labad, 42 Kā int veida aizņem daudz vietas, 4 baiti. Tātad tas, kas noticis tur, bet tur ir problēma tagad. * Y = 13. Kas notiks šeit? Problēma ir * y mūsu vienkāršotā pasaulē nozīmē tikai iet uz adresi y. Kas y? Tas ir sava atkritumu vērtība. Tāpēc pieņemsim, ka atkritumu vērtība ir 5551212, kaut traks tāpat. * Y līdzekļiem iet risināt 5.551.212. Tas ir tāpat kā vairāk nekā šeit. Tas nav, piemēram. Tik * y izpaužas 13 līdzekļus es cenšos izdarīt 13 šeit. Tas neeksistē. Es esmu pārsniedza segmentā tāfeles. Ko es varu saņemt? Ka mistisks ziņu segmentācija vaina, jo es cenšos likt atmiņā vērtība kā 13 vietā, kas neeksistē. Programmas pārējā varētu strādāt labi, bet līdz tam punktam tā nav. Tāpēc pieņemsim mēģināt pastāstīt šo stāstu. Mēs būsim atpakaļ, ka reiz mēs esam runājuši par hex. Iesim atpakaļ uz šo un noslēgt ar šo lietu sauc Binky, kas atsaukšana ir Stenforda profesors sēžot mājās spēlē ar claymation, lai pastāstītu stāstu par tieši šo pašu programmu. Tas ir tikai apmēram 3 minūtes garš. Šeit mums ir Binky. [Vīrietis runātājs par video] Hei Binky, mosties. Ir pienācis laiks, lai rādītāja fun. [Binky] Kas tas ir? Uzziniet par norādes? Ak, našķis! [Vīrietis runātājs] Nu, lai sāktu, es domāju, mēs spēsim nepieciešams pāris norādes. [Binky] Labi. Šis kods piešķir 2 norādes, kas var norādīt uz veseliem skaitļiem. [Vīrietis runātājs] Labi. Nu, es redzu arī 2 norādes, bet tie nav, šķiet, ir vērsta uz neko. [Binky] Tieši tā. Sākotnēji norādes neliecina neko. Lietas tie norāda uz sauc pointees, un to izveidošanas ir atsevišķs solis. [Vīrietis runātājs] Ak, labi, labi. Es zināju, ka. Šie pointees ir atsevišķi. Er, tā kā jūs piešķirt pointee? [Binky] Labi. Šis kods piešķir jaunu veselu pointee, un šī daļa nosaka x norādīt uz to. [Vīrietis runātājs] Hei, ka izskatās labāk. Lai padarītu to darīt kaut ko. >> [Binky] Labi. Es ņemšu dereference rādītāju x saglabāt numuru 42 savā pointee. Par šo triks man nāksies savu burvju nūjiņu no dereferencing. [Vīrietis runātājs] Jūsu burvju nūjiņu no dereferencing? Tas ir lieliski. [Binky] Tas ir tas kods izskatās. Es ņemšu tikai izveidota skaitu un ... [Paukšķi] [Vīrietis runātājs] Hei izskatās, tur tas notiek. Šādi rīkojoties ar dereference uz X šādi bultiņa piekļūt tās pointee, Šajā gadījumā, lai saglabātu 42 tur. Hei, mēģināt to izmantot, lai saglabātu numuru 13 caur citu rādītāju, y. [Binky] Labi. Es ņemšu tikai iet pa šeit, lai y un saņemt Numurs 13 izveidoja un tad zizli par dereferencing un vienkārši ... [Buzzing skaņu] Eh! [Vīrietis runātājs] Ak hey, kas nestrādāja. Say, Binky, es nedomāju, ka dereferencing y ir laba ideja jo izveido pointee ir atsevišķs posms un es nedomāju, ka mēs kādreiz darīja. [Binky] Hmm, labs punkts. [Vīrietis runātājs] Jā. Mēs piešķirti rādītāju y, bet mēs nekad iestatīt tā, lai norādītu uz pointee. [Binky] Hmm, ļoti uzmanīgs. [Vīrietis runātājs] Hei, jūs meklējat labu tur, Binky. Vai jūs varat salabot tā, ka y norāda uz pašu pointee kā X? >> [Binky] Protams. Es izmantot savu burvju nūjiņu no rādītāja cesiju. [Vīrietis skaļrunis], ka būs problēmas, piemēram, pirms? [Binky] Nē, tas nav pieskarties pointees. Tas tikai maina 1 rādītāju norādīt uz to pašu kā cita. [Paukšķi] [Vīrietis runātājs] Ak, es redzu. Tagad y norāda uz to pašu vietu kā X. Tik jāgaida. Tagad y ir fiksēts. Tā ir pointee. Tātad jūs varat izmēģināt zizli par dereferencing atkal sūtīt uz 13 pāri. [Binky] Uh, labi. Šeit iet. [Paukšķi] [Vīrietis runātājs] Hei, apskatīt to. Tagad dereferencing darbus y. Un tāpēc, ka norādes ir dalīties, ka viens pointee, viņi gan redzēt 13. [Binky] Jā, koplietošanu. Neatkarīgi. Tāpēc mēs gatavojamies pāriet vietas tagad? [Vīrietis runātājs] Ak izskatās, mēs esam no laika. >> [Binky] Bet - [Vīrietis runātājs] Tikai atceraties 3 rādītāju normas. Numurs 1, pamata struktūra ir tāda, ka jums ir rādītājs, un tas norāda vairāk nekā uz pointee. Bet rādītājs un pointee ir atsevišķi, un visbiežāk pieļautajām kļūdām ir izveidot rādītāju bet aizmirst, lai dotu tai pointee. Numuru 2, rādītājs dereferencing sākas rādītāja un sekojoši tās bultiņas pa lai piekļūtu savu pointee. Kā mēs visi zinām, tas darbojas tikai tad, ja ir pointee, kāda veida izpaužas atpakaļ lemt numuru 1. Skaits 3, rādītājs piešķiršana aizņem vienu rādītāju un izmaiņas to norādīt uz to pašu pointee kā citu rādītāju. Tātad, pēc norīkojuma, ir pieejami 2 norādes norādīs uz to pašu pointee. Dažreiz tas sauc koplietošanu. Un tas viss notiek ar to tiešām. Ardievas tagad. Tas ir Binky. Tas ir CS50. Mēs redzēt jūs nākamajā nedēļā. [Aplausi] [CS50.TV]