1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [4 teden, Nadaljevanje] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Harvard University] 3 00:00:04,240 --> 00:00:07,290 [To je CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> To je CS50, in to je konec tedna 4. 5 00:00:11,290 --> 00:00:14,030 Torej nekaj dobrih novic in nekaj slabih novic. 6 00:00:14,030 --> 00:00:26,240 Brez predavanja v ponedeljek, ni problema določiti naslednji teden. [Študenti navijajo] 7 00:00:26,240 --> 00:00:28,680 Saj ne bo všeč, kam to pelje. 8 00:00:28,680 --> 00:00:31,590 Ampak imamo to namesto naslednjo sredo, 9 00:00:31,590 --> 00:00:37,740 in tam je tudi po predmetniku 1 predavanju petek naslednji petek, tako da lahko ostanejo na pravi poti. 10 00:00:37,740 --> 00:00:40,580 Vendar se bo vse posnel kot ponavadi, tako da ne skrbi. 11 00:00:40,580 --> 00:00:44,100 >> In glede na kvizu 0, kaj bomo storili proti koncu tedna 12 00:00:44,100 --> 00:00:47,140 se objavijo na domači strani teku je cs50.net pojasnilo 13 00:00:47,140 --> 00:00:50,160 za kakšno pravo ne bi smeli imeti, ko gre za prvi kviz. 14 00:00:50,160 --> 00:00:55,100 Na splošno bo več izbire, true-false, kratek odgovor, kratki kodiranje težave. 15 00:00:55,100 --> 00:00:57,360 Ne boš se pričakuje, da bo izvajanje enakovredno 16 00:00:57,360 --> 00:01:00,030 problem, ki bi ga vidite na pset, za katerega imate računalnik 17 00:01:00,030 --> 00:01:03,240 in razhroščevalnik in podobno, vendar pa bo mala kodiranje težave. 18 00:01:03,240 --> 00:01:06,900 >> In res najboljši vodnik, da bi dobili občutek, kaj CS50 kvizi so kot 19 00:01:06,900 --> 00:01:09,180 je, pojdite na cs50.net, pojdite na kvizi povezavo, 20 00:01:09,180 --> 00:01:11,920 in si lahko ogledate v zadnjih nekaj letih vredno kvizov. 21 00:01:11,920 --> 00:01:16,600 Zavedajte se, da je učni načrt ni bil vedno enak v preteklih letih. 22 00:01:16,600 --> 00:01:18,510 Včasih smo dodali, včasih odštevati, 23 00:01:18,510 --> 00:01:20,670 tako da, če boste videli nekaj temo na eni od tistih starih kvize 24 00:01:20,670 --> 00:01:25,380 da nimate pojma, kaj je govoril, da je bodisi, da smo si ga pokriva 25 00:01:25,380 --> 00:01:27,210 ali da nismo pokriti. 26 00:01:27,210 --> 00:01:31,110 Toda v obliki ocen, to nedeljo, ponedeljek in torek 27 00:01:31,110 --> 00:01:34,770 pa tudi seveda po vsej seji o pregledu v nedeljo zvečer - 28 00:01:34,770 --> 00:01:37,500 čas in kraj, da se objavi na spletni strani seveda je - 29 00:01:37,500 --> 00:01:40,120 da imajo vsi priložnost, da pregledamo z učnimi teku je štipendistov 30 00:01:40,120 --> 00:01:44,830 Material za letošnje leto, in sicer v delu, in kot cel razred, 31 00:01:44,830 --> 00:01:48,400 in bodo tisti posnet kot ponavadi, pa tudi. 32 00:01:48,400 --> 00:01:53,380 >> V redu. Torej, brez odlašanja, ena pripomba o ustreznosti / neustreznosti in dodajte / padec. 33 00:01:53,380 --> 00:01:57,980 Morda ste videli moje zapiske sinoči, in to je res samo nekaj dodatnih pozavarovalnih 34 00:01:57,980 --> 00:02:01,250 da, če ste med tistimi, še posebej manj udobno ali nekje vmes 35 00:02:01,250 --> 00:02:04,870 in imate občutek, samo malo čez glavo, 36 00:02:04,870 --> 00:02:08,430 zavedajo, da je res čisto normalno, in tam je ogromno podporne strukture v mestu, 37 00:02:08,430 --> 00:02:13,530 od katerih delovni čas so nameravali o izboljšanju vse več na moj e-poštni sinoči, 38 00:02:13,530 --> 00:02:16,520 in spoznali tudi, da je možnost, kot je / neustreznosti za razred, kot je ta 39 00:02:16,520 --> 00:02:21,540 Res je mišljena kot mehanizem, da sprejmejo robu off iz predmeta, kot je ta, 40 00:02:21,540 --> 00:02:24,200 tako da še enkrat, če ste preživeli te 10, 15, 20 ur 41 00:02:24,200 --> 00:02:28,160 samo poskušam dobiti nekaj pset za delo in veste, da ste 90-95% poti tja 42 00:02:28,160 --> 00:02:32,100 vendar ne morete najti nekaj prekleto napako, v / neustreznosti modela, ki je nekako v redu. 43 00:02:32,100 --> 00:02:36,230 >> Ideja je, da s tem mehanizmom, lahko pa gre poudarek na vaših drugih psets 44 00:02:36,230 --> 00:02:39,530 ali spi ali karkoli že je, da želite, da se osredotoči na. 45 00:02:39,530 --> 00:02:43,390 Torej zavedaš, da ste do tega prihaja torek - tehnično 5. ponedeljek, 46 00:02:43,390 --> 00:02:50,840 ampak to je praznik, tako da to prihaja torek - prehod od prelaza / ne stopenjske ali obratno. 47 00:02:50,840 --> 00:02:54,450 In če si res na prepad in se v mislih spuščanje v celoti, 48 00:02:54,450 --> 00:02:56,440 prosim ulov po predavanju ali mi poąljete. 49 00:02:56,440 --> 00:02:59,990 Radi bi vsaj klepet, preden ponudbo poslovi. 50 00:02:59,990 --> 00:03:03,470 V redu. Tako smo začeli jemati za usposabljanje kolesa off zadnjem času. 51 00:03:03,470 --> 00:03:06,030 Predvsem smo se osredotočili na vrvico. 52 00:03:06,030 --> 00:03:09,740 Niz je nekaj, kar je deklarirano v knjižnici CS50, 53 00:03:09,740 --> 00:03:14,340 posebej v datoteko, imenovano cs50.h ki jih bomo začeli iskati v tem tednu in dostavo. 54 00:03:14,340 --> 00:03:17,250 Toda niz je res samo nekaj poenostavitev 55 00:03:17,250 --> 00:03:20,980 To je malo več arcanely opisali kot char *. 56 00:03:20,980 --> 00:03:24,090 Char smo seznanjeni. To je samo en znak. 57 00:03:24,090 --> 00:03:28,010 Ampak * označena kot v ponedeljek kaj? >> [Študent] kazalec. 58 00:03:28,010 --> 00:03:31,290 Kazalec. In kaj je kazalec? >> [Študent] naslov. 59 00:03:31,290 --> 00:03:33,420 >> To je kot naslov, lokacija v pomnilniku. 60 00:03:33,420 --> 00:03:35,910 Kaj je naslov ali lokacijo ali spomin? 61 00:03:35,910 --> 00:03:40,290 Spet imamo vsi prenosniki s koncertom ali 2 GB RAM-a, najverjetneje v teh dneh, 62 00:03:40,290 --> 00:03:44,160 in to pomeni, da imate milijardo ali 2 v vrednosti milijardo bajtov pomnilnika. 63 00:03:44,160 --> 00:03:46,240 In to sploh ni važno, kaj je fizično izgleda, 64 00:03:46,240 --> 00:03:51,220 vendar se o veri, ki jih lahko oštevilčite vse posamezne bajte, da svoj prenosni računalnik ima - 65 00:03:51,220 --> 00:03:54,580 To je bajt 0, to je bajt 1, to je bajt 2 milijard EUR - 66 00:03:54,580 --> 00:03:56,100 in to je točno to, kar računalnik ne. 67 00:03:56,100 --> 00:04:00,030 Ko dodelitev prostora za en znak, na primer, 68 00:04:00,030 --> 00:04:02,480 je očitno mora nekje živeti v spomin računalnika, 69 00:04:02,480 --> 00:04:05,860 in morda je na številki 12345 bajtov, 70 00:04:05,860 --> 00:04:08,470 in da je nekje tukaj v spomin računalnika. 71 00:04:08,470 --> 00:04:12,630 In potem naslov tega učinka je 12345. 72 00:04:12,630 --> 00:04:16,140 >> Zdaj, v tednu 0 do zdaj tako daleč, da smo v resnici ne skrbijo 73 00:04:16,140 --> 00:04:19,170 kjer so stvari, shranjene v pomnilniku, saj se običajno uporabljajo simboli, 74 00:04:19,170 --> 00:04:22,540 spremenljivke, in nizi dejansko dobil na naših podatkov. 75 00:04:22,540 --> 00:04:24,950 Ampak kot v ponedeljek in vse več je danes, ste zdaj dogaja, da imajo 76 00:04:24,950 --> 00:04:27,710 vse bolj izrazite sposobnosti za pisanje programov 77 00:04:27,710 --> 00:04:31,330 da res manipulira z računalnikom spomin pa se vam zdi primerno, 78 00:04:31,330 --> 00:04:33,720 tako za dobre namene in slabih, 79 00:04:33,720 --> 00:04:39,620 napake pa zelo pogost rezultat na tej točki učenja te stvari. 80 00:04:39,620 --> 00:04:42,460 Toda kaj to v resnici pomeni, da je char *? 81 00:04:42,460 --> 00:04:46,140 Pojdimo nazaj - in se bomo vrnili k Binky, kot je obljubil danes. 82 00:04:46,140 --> 00:04:48,670 Pojdimo na preprost primer tukaj. 83 00:04:48,670 --> 00:04:53,060 Naj shrani sliko kot compare.c, in dovolite mi dobili nekaj predlogo kodo tukaj 84 00:04:53,060 --> 00:05:00,490 Tako so stdio.h, dovolite mi, da tudi sam vključujejo cs50.h. Jaz bom tam povečavo. 85 00:05:00,490 --> 00:05:05,850 Naj začnem pisati glavni int, glavne (ničen), zdaj pa želim narediti nekako takole: 86 00:05:05,850 --> 00:05:13,520 printf ("Daj mi niz:"), nato pa bom uporabil niza s gets GetString 87 00:05:13,520 --> 00:05:16,750 da bi dobili niz od uporabnika, nato pa bom vprašal si za drugo. 88 00:05:16,750 --> 00:05:21,870 ("Daj mi še niz:") in bom od njih zahteva, da se prek GetString to. 89 00:05:21,870 --> 00:05:27,020 Poklical bom to t, saj ne prihaja po tem, ko je in s je lepo ime za niz, če je precej splošen. 90 00:05:27,020 --> 00:05:30,030 Torej GetString, zdaj pa želim narediti sanity check in bom rekel 91 00:05:30,030 --> 00:05:39,770 if (i == t), potem bom samo povedal, da si printf ("Vnesli enako \ n!"); 92 00:05:39,770 --> 00:05:45,520 pa bom izpisal nekaj podobnega ("ste vnesli nekaj drugega! \ n") 93 00:05:45,520 --> 00:05:48,460 ali karkoli se bo stavka bo. Torej nekaj takega. 94 00:05:48,460 --> 00:05:52,200 Potem pa kot ponavadi, se bom vrnil 0, ki je pomenil le, da ni nič slabega zgodilo, 95 00:05:52,200 --> 00:05:54,400 in bom, da gredo naprej in Prevedite in poženite ta program. 96 00:05:54,400 --> 00:05:56,540 >> Ampak v ponedeljek sva tekla ta program, 97 00:05:56,540 --> 00:06:00,420 in so bili dejansko povedal, da ni HELLO Pozdravljeni in adijo ni poslovila. 98 00:06:00,420 --> 00:06:03,140 Obnašanje smo videli, je bilo malo več kot to. 99 00:06:03,140 --> 00:06:11,450 Naj grem v mojo izvornega imenika povečaj tukaj, dajmo narediti primerjavo. 100 00:06:11,450 --> 00:06:14,570 Zbrani v redu. Naj teče primerjati. Daj mi niz: Pozdravljeni. 101 00:06:14,570 --> 00:06:16,300 Daj mi še eno zahtevo: Pozdravljeni. 102 00:06:16,300 --> 00:06:18,000 Ste vnesli nekaj drugega! 103 00:06:18,000 --> 00:06:22,650 No, naj jaz poskusim nekaj enostavnejša kot 50, 50 let. Ste vnesli nekaj drugega! 104 00:06:22,650 --> 00:06:25,740 hi, hi. Torej je jasno, kaj se dogaja tukaj. 105 00:06:25,740 --> 00:06:28,440 Ampak kaj je razlaga, zakaj? 106 00:06:28,440 --> 00:06:33,850 Očitno je linija 12 je popolnoma disfunkcionalna. 107 00:06:34,300 --> 00:06:39,430 Kaj je temeljni problem tukaj? Ja. >> [Študent] To primerjavo naslove. 108 00:06:39,430 --> 00:06:41,850 Ja, točno tako. To je pravzaprav primerjali naslove 109 00:06:41,850 --> 00:06:44,580 , v katerem so shranjeni in HELLO Pozdravljeni. 110 00:06:44,580 --> 00:06:48,290 Ni primerjave s črkama HELLO znova in znova, 111 00:06:48,290 --> 00:06:52,370 zato, ker je tisto, kar se je res zgodilo, ves ta čas smo bili z GetString - 112 00:06:52,370 --> 00:06:56,130 Ta tabla je spet našega računalnika pomnilnika, 113 00:06:56,130 --> 00:07:00,100 in recimo, da sem poklical GetString po razglasitvi spremenljivke s. 114 00:07:00,100 --> 00:07:01,930 Kaj pa moj spomin videti? 115 00:07:01,930 --> 00:07:07,070 Naj povem, da je samovoljno izgleda takole. To je kvadrat. 116 00:07:07,070 --> 00:07:09,040 In precej kadarkoli sem narisal košček spomina na zaslonu 117 00:07:09,040 --> 00:07:12,860 če je 32 bitov sem bila risba kvadratov, kot je ta, ker seveda v napravo, 118 00:07:12,860 --> 00:07:17,380 kazalec, naslov, je 32 bitov. To je enako kot pri notr. 119 00:07:17,380 --> 00:07:19,420 To je lahko različen glede na računalniški sistem. 120 00:07:19,420 --> 00:07:24,630 Tisti, ki so vsaj bežno seznanjen z dejstvom, da je vaš Mac ali PC je 64 bitov, 121 00:07:24,630 --> 00:07:28,120 ki dejansko pomeni, da je vaš računalnik uporablja 64-bitne kazalce, 122 00:07:28,120 --> 00:07:33,730 64-bitne naslove, in med upsides, da je v vaši računalniki 123 00:07:33,730 --> 00:07:35,560 Lahko imajo veliko več RAM-a, kot minulih dni. 124 00:07:35,560 --> 00:07:39,240 Skratka, nazaj v dan, ko računalniki uporablja le 32 bitov 125 00:07:39,240 --> 00:07:42,740 za zastopanje naslovov, lahko največje število bajtov, ki ga predstavljate 126 00:07:42,740 --> 00:07:46,280 v tem primeru je bilo kaj, če imate 32 bitov? 127 00:07:46,280 --> 00:07:49,590 Torej 4 milijarde EUR, prav, ker 2 do 32 znaša 4 milijarde EUR. 128 00:07:49,590 --> 00:07:51,370 Ta številka je bila ponovitev v teku. 129 00:07:51,370 --> 00:07:55,240 >> Torej, če imate samo 32 bitov, kar je najvišja številka lahko računate, da je približno 4 milijarde. 130 00:07:55,240 --> 00:07:58,750 Toda to je bilo temeljno omejitev računalnikov do pred nekaj leti 131 00:07:58,750 --> 00:08:01,180 ker če se lahko štejejo le v višini 4 milijarde EUR, 132 00:08:01,180 --> 00:08:05,270 ni važno, če ste kupili 8 GB RAM-a ali celo 5 GB RAM-a; 133 00:08:05,270 --> 00:08:07,780 ne moreš računati, da so visoke, tako da je bilo zaman. 134 00:08:07,780 --> 00:08:11,430 Lahko samo do prve 3 ali 4 GB pomnilnika računalnika. 135 00:08:11,430 --> 00:08:14,410 To je manj vprašanje zdaj, in lahko kupite MacBook Pros in Dells 136 00:08:14,410 --> 00:08:17,680 z 8 GB RAM-a ali celo več teh dneh. 137 00:08:17,680 --> 00:08:24,100 Ampak, če sem namenijo preprosto v tem programu kazalec, kazalec se imenuje i, 138 00:08:24,100 --> 00:08:28,370 je lahko videti takole na zaslonu, saj res moramo nazaj lupino tej plasti. 139 00:08:28,370 --> 00:08:33,520 Držim rekel niz, ampak kot ponedeljek, niz je res char * 140 00:08:33,520 --> 00:08:35,590 naslov neke značaja. 141 00:08:35,590 --> 00:08:39,280 Dajmo torej, da se usposabljanje kolesa off, čeprav bomo še naprej uporabljali GetString za zdaj. 142 00:08:39,280 --> 00:08:42,600 Tako sem prijavljeni s, in to je kos pomnilnika, 32 bitov. 143 00:08:42,600 --> 00:08:47,370 Kaj je tukaj v spomin na privzeto? >> [Neslišno študentski odziv] 144 00:08:47,370 --> 00:08:50,040 Kaj je to? >> [Študent] Garbage. >> Garbage. Točno tako. 145 00:08:50,040 --> 00:08:54,610 Če ste programer ne dajo vrednosti v spremenljivko, ki ve, kaj je to? 146 00:08:54,610 --> 00:08:57,990 Včasih boste dobili srečo in da je 0, kar je nekako lepo, čisto privzete vrednosti, 147 00:08:57,990 --> 00:09:00,310 ampak kot smo videli v ponedeljek, včasih je popoln nesmisel, 148 00:09:00,310 --> 00:09:04,130 nekateri res velik pozitivno ali negativno število, ki je prišel od kje? 149 00:09:05,350 --> 00:09:07,010 Ja. >> [Študent] Funkcija prej. >> Ja. 150 00:09:07,010 --> 00:09:10,170 >> Pogosto je funkcija, ki se imenuje dobil prej, saj se spomnite, 151 00:09:10,170 --> 00:09:13,920 kot praviš funkcije v spominu, da zavzamejo več prostora od spodaj navzgor, 152 00:09:13,920 --> 00:09:17,040 in takoj, ko se vrne, dobi ponovno, da spomin 153 00:09:17,040 --> 00:09:20,890 z moškimi, ki dobi poimenovanje, ki je s svojim isti kos pomnilnika. 154 00:09:20,890 --> 00:09:23,450 In če ste levi smeti tam, prejšnje vrednosti, 155 00:09:23,450 --> 00:09:28,190 lahko bi zamenjali S imajo neko vrednost, če res nismo ničesar dal tja. 156 00:09:28,190 --> 00:09:30,960 Torej, naša RAM v tem trenutku izgleda. 157 00:09:30,960 --> 00:09:36,030 Sedaj na desni strani proge 7 smo kličeš GetString, 158 00:09:36,030 --> 00:09:40,150 ki smo jih zdaj počne nekaj tednov, vendar kaj GetString res delaš? 159 00:09:40,150 --> 00:09:43,350 GetString napisal CS50 osebja je malo inteligentni 160 00:09:43,350 --> 00:09:46,500 v tem, da takoj, ko uporabnik začne tipkanje tipke in zadetki Enter, 161 00:09:46,500 --> 00:09:50,010 GetString številke, koliko tipkanja naredil uporabnik, hit 162 00:09:50,010 --> 00:09:53,360 koliko znakov moram dodeliti pomnilnika za. 163 00:09:53,360 --> 00:09:55,660 In če to RAM prihaja, kdo ve? 164 00:09:55,660 --> 00:09:58,930 To je nekje na 2 GB računalnika ali drugih malenkosti spomina. 165 00:09:58,930 --> 00:10:05,200 Vendar pa si predstavljajmo, da je računalnik najti prostor za besedo HELLO tukaj. 166 00:10:05,200 --> 00:10:08,710 Beseda sem tipkal je H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 In če potegnemo to kot zaporedje znakov, bi jih lahko pripravi takole. 168 00:10:13,510 --> 00:10:17,860 Ampak moram storiti, 1 dodatno stvar. Kaj spada na koncu vsakega niza v C? 169 00:10:17,860 --> 00:10:20,710 Null lik, ki smo ga napisali v \ 0. 170 00:10:20,710 --> 00:10:23,980 To je tehnično številka 0, vendar poševnico naredi vse jasnejši 171 00:10:23,980 --> 00:10:28,150 da je to dobesedno število 0, je celo število 0; 172 00:10:28,150 --> 00:10:32,440 ni, na primer, citiram, konec citata 0, da bi vpišete na tipkovnici. 173 00:10:32,440 --> 00:10:33,940 Torej, to je Pozdravljeni. 174 00:10:33,940 --> 00:10:36,350 >> In kaj smo rekli v ponedeljek, da deluje kot GetString 175 00:10:36,350 --> 00:10:39,580 je dejansko vrnil vse te tedne? 176 00:10:39,580 --> 00:10:43,960 To se ne vrne niz, ki sama po sebi, saj ne res so se torej 177 00:10:43,960 --> 00:10:47,710 ker strune ne obstajajo. Oni so neke vrste izdelavo v CS50 knjižnici. 178 00:10:47,710 --> 00:10:51,300 Kaj je res niz, bolj tehnično? >> [Študent] To je prvi znak. 179 00:10:51,300 --> 00:10:55,950 Točno tako. To je čisto preprosto naslov prvega znaka, da si vtipka 180 00:10:55,950 --> 00:11:02,810 Torej, če je moja beseda HELLO ga konča pri bajti 123 številko, potem pa na številko 124 bajtov, 181 00:11:02,810 --> 00:11:08,320 125, 126 in tako naprej, če sem številne moje bajte od 0 gor, 182 00:11:08,320 --> 00:11:12,650 kaj res GetString se vrača dobesedno številka 123. 183 00:11:12,650 --> 00:11:19,270 Torej, kdo bo dal vs je številka 123, ne črka H, ​​ni beseda HALO, 184 00:11:19,270 --> 00:11:23,130 preprosto naslov, na katerem je mogoče najti prvo črko Pozdravljeni. 185 00:11:23,130 --> 00:11:26,500 Toda to ne zdi dovolj. Vprašal sem te za niz in ne znak. 186 00:11:26,500 --> 00:11:32,970 Torej, kako bomo vedeli, ali je računalnik, ki Ello nekako prišel skupaj s H? 187 00:11:35,760 --> 00:11:37,460 Kaj je vrsta pogodbe, kar imamo? Ja. 188 00:11:37,460 --> 00:11:40,100 [Študent] Drži se govori, da bi našli nekaj več znakov. >> Točno tako. 189 00:11:40,100 --> 00:11:44,570 >> Tam je ta človek-računalnik, s katerim konvencija, ko se ukvarjajo s strunami, 190 00:11:44,570 --> 00:11:49,410 sicer znano že kot char zvezd, preprosto morali ugotoviti, 191 00:11:49,410 --> 00:11:54,350 kjer je konec vsakega niza v življenju, ki jih res samo ponavljanjem nad njo z za zanke, 192 00:11:54,350 --> 00:11:57,820 while zanko, karkoli, tako da, ko je bil konec niza 193 00:11:57,820 --> 00:12:02,160 Zdaj lahko sklepala, oh, cela beseda je bila Pozdravljeni. 194 00:12:02,160 --> 00:12:04,820 Tisti, ki ste se s predhodnim izkušenj pri načrtovanju morda ve v Javi 195 00:12:04,820 --> 00:12:09,880 lahko samo pokličite. dolžina in tudi v drugih jezikih, lahko pokličete dolžino ali podobno. 196 00:12:09,880 --> 00:12:14,060 To je zato, ker v veliko jezikov, še posebej stvari, ki se imenuje objektno usmerjenih jezikov, 197 00:12:14,060 --> 00:12:18,580 dolžina nekaj, kar je nekako Encapsulated notranjosti kosa podatke sam, 198 00:12:18,580 --> 00:12:24,000 toliko, kot smo Encapsulated ID in imena hiš in stanovanj v notranjosti, da je študent v ponedeljek. 199 00:12:24,000 --> 00:12:28,700 Ampak C je precej nižja raven. Ni predmete ali razrede, če ste slišali te besede prej. 200 00:12:28,700 --> 00:12:31,490 Vse, kar morate res pomnilniške naslove. 201 00:12:31,490 --> 00:12:35,540 Torej, to je nekako staromoden način predstavljajo zanimive podatkovne strukture. 202 00:12:35,540 --> 00:12:38,760 Imate začetno vrednost, kot je naslov prvega znaka 203 00:12:38,760 --> 00:12:42,340 in potem samo nekateri samovoljni dogovor, da se vsi strinjamo, da jim sledijo. 204 00:12:42,340 --> 00:12:46,420 Torej, kako je dolžina niza izvaja, pa predlagamo? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, ki ste nekateri zdaj uporablja nekajkrat. To je zelo preprosto, kajne? 206 00:12:51,360 --> 00:12:53,060 Je kot 2 vrstic kode. 207 00:12:53,060 --> 00:12:56,140 To je precej za zanko neke vrste, morda z dodatnimi lokalne spremenljivke. 208 00:12:56,140 --> 00:13:00,540 Ampak strlen mora samo sprejeti kazalec in nato začne iskati \ 0. 209 00:13:00,540 --> 00:13:05,190 >> In takoj, ko ga najde, se lahko vrne skupno število korakov, ki jih je bilo sprejetih v nizu. 210 00:13:05,190 --> 00:13:07,150 Tako lahko sklepamo iz tega, kar se dogaja naprej. 211 00:13:07,150 --> 00:13:11,850 Recimo, potem izjavljam, t, kot sem naredil v vrstico 10. 212 00:13:11,850 --> 00:13:14,280 To je nekaj smeti vrednost. Kdo ve, na prvi pogled? 213 00:13:14,280 --> 00:13:18,490 Toda na desni strani črte 10 kličem GetString znova. 214 00:13:18,490 --> 00:13:20,050 Kdo ve, če je to konča? 215 00:13:20,050 --> 00:13:23,830 Naj povem, da samovoljno operacijski sistem najti prostor za to pot tukaj. 216 00:13:23,830 --> 00:13:28,610 Slučajno sem po naključju tip H-E-L-L-O znova 217 00:13:28,610 --> 00:13:31,260 in tako lahko potegnemo enake slike. 218 00:13:31,260 --> 00:13:34,290 Toda dejstvo, da sem novo razdelila to sliko je namerno 219 00:13:34,290 --> 00:13:37,720 ker je to drugačna HELLO od tega. 220 00:13:37,720 --> 00:13:43,920 Torej, tukaj je lahko to mesto 456, to je 457, in tako naprej. 221 00:13:43,920 --> 00:13:47,170 Torej, kaj naj dobi, kjer je bil nekoč vprašaj? 222 00:13:47,170 --> 00:13:50,190 V tem primeru 456. 223 00:13:50,190 --> 00:13:53,540 Mi smo pobral te številke samovoljno, ker res danes po 224 00:13:53,540 --> 00:13:57,110 mi ne bo mar, kaj je naslov, je vse. 225 00:13:57,110 --> 00:14:02,690 Vse nas skrbi, je, da lahko ugotovimo, naslov neki kos podatkov, kot Pozdravljeni. 226 00:14:02,690 --> 00:14:07,100 >> Torej, res tisto, kar večina ljudi v računalništvu, ko govorimo o pomnilniških naslovov 227 00:14:07,100 --> 00:14:10,210 in govori o kazalci posebej, 228 00:14:10,210 --> 00:14:14,220 ne trudi ugotoviti, 123 - koga briga, če je ta stvar sploh je, 229 00:14:14,220 --> 00:14:17,440 Vemo samo, da je na neki številčni naslov - 230 00:14:17,440 --> 00:14:22,180 poenostavimo svet in samo rečem, da je to kaže na značaj 231 00:14:22,180 --> 00:14:25,080 in ne kaže na to značaja. 232 00:14:25,080 --> 00:14:27,430 In dejstvo, da je puščica je povsem namerno 233 00:14:27,430 --> 00:14:31,610 ker dobesedno zdaj je obrnjen na uro in t kaže na drugi H 234 00:14:31,610 --> 00:14:34,720 saj na koncu dneva, to ni važno, kaj je naslov, 235 00:14:34,720 --> 00:14:40,240 vendar pa glede na to, da imamo možnost, da izrazijo ta naslov z nekaj del kode. 236 00:14:40,240 --> 00:14:42,730 Nismo res manipulira teh naslovov samo še 237 00:14:42,730 --> 00:14:47,770 tako da bomo videli, kje bomo lahko interject in nekako stvari s kazalci, 238 00:14:47,770 --> 00:14:52,030 vendar za zdaj 12 v skladu dobesedno katere vrednosti smo primerjali 239 00:14:52,030 --> 00:14:55,500 v skladu s to zgodbo v vrstici 12? 240 00:14:56,570 --> 00:15:01,290 Mi smo rekli, je enaka višini 123 456? In to zagotovo ne velja. 241 00:15:01,290 --> 00:15:05,320 In celo pojmovno, ta kazalec vsekakor ni isto kot to 242 00:15:05,320 --> 00:15:09,500 ker si poklical GetString dvakrat, in GetString ne poskuša biti super pameten, 243 00:15:09,500 --> 00:15:12,470 ne poskuša uresničiti, oh, ki ste ga vnesli HELLO 5 min; 244 00:15:12,470 --> 00:15:15,090 Naj vam dam enako kot kazalec sem ti dal prej, 245 00:15:15,090 --> 00:15:18,450 je samo dodeli novo kos pomnilnika, vsakič, ko ga pokličete. 246 00:15:18,450 --> 00:15:20,350 >> Torej, kako bomo rešili ta problem? 247 00:15:20,350 --> 00:15:24,270 Če višja stopnja želim primerjati nize Pozdravljeni in HELLO - 248 00:15:24,270 --> 00:15:28,680 Me ne zanima kazalci - kako naj grem o odgovoru na vprašanje, 249 00:15:28,680 --> 00:15:31,980 si uporabnik vnesite isto stvar? Kaj je treba tu? Ja. 250 00:15:31,980 --> 00:15:35,200 [Študent] Uporabite funkcijo. >> Morem uporabiti funkcijo iz škatle. 251 00:15:35,200 --> 00:15:38,170 Lahko uporabite funkcijo imenovano strcmp, s-t-r-c-m-p, 252 00:15:38,170 --> 00:15:41,190 samo skrajšano različico rekel niz rezultatov. 253 00:15:41,190 --> 00:15:45,070 In če gremo v, na primer, primerjati 2, ki je med zapiski današnjih 254 00:15:45,070 --> 00:15:46,690 Jaz storiti točno to. 255 00:15:46,690 --> 00:15:51,750 Obdržal sem vse, kar je ostalo od iste črte na 1 do 26 ali tako, 256 00:15:51,750 --> 00:15:54,360 in zdaj opazil ta del se je spremenila le malo. 257 00:15:54,360 --> 00:15:57,690 Naj prezreti linijo 28 za trenutek in se osredotočiti samo na to. 258 00:15:57,690 --> 00:16:00,410 Kaj smo rekli, da je ponedeljek str primerjati ne? 259 00:16:00,410 --> 00:16:05,200 Skrbi proces sprejemanja 2 kazalce, s in t, v tem primeru, 260 00:16:05,200 --> 00:16:08,480 nekako tako rekoč uvrstila prstom na tiste 2 črk 261 00:16:08,480 --> 00:16:11,530 in kaj je treba storiti, je nekaj podobnega, medtem ko zanke ali za zanke, 262 00:16:11,530 --> 00:16:16,050 in pravi, da je to isto? Če je tako, se premika prste, ali kazalce naprej. 263 00:16:16,050 --> 00:16:17,970 Ali so ti isti, ti isti, to isto, 264 00:16:17,970 --> 00:16:22,710 ti isti, to isto? In oh, sem na koncu niza, tako na s in t. 265 00:16:22,710 --> 00:16:26,780 Nisem našel nobenega protislovja. Ja, ti nizi so enake. 266 00:16:26,780 --> 00:16:31,940 In kaj str primerjavo donosov, če 2 niza sta enaka, očitno? Zero. 267 00:16:31,940 --> 00:16:35,900 Torej, 0 je dobro v tem primeru, ker če se vrne -1 ali 1, 268 00:16:35,900 --> 00:16:40,560 to pomeni, da je slučajno prišel pred t po abecedi ali po t. 269 00:16:40,560 --> 00:16:43,760 In zakaj bi bilo koristno imeti funkcijo, ki vam pove, kateri niz prihaja do 270 00:16:43,760 --> 00:16:46,720 ali po v slovarju? 271 00:16:46,720 --> 00:16:48,740 [Študent] iskanja. Iskanje >> in razvrščanju. 272 00:16:48,740 --> 00:16:51,730 >> Tako lahko narediš stvari, kot binarno iskanje ali mehurček razvrstite ali zlivanjem 273 00:16:51,730 --> 00:16:53,230 , kjer boste morali primerjati stvari. 274 00:16:53,230 --> 00:16:56,420 Tako daleč smo že vrsto zmanjšanje nekaterih kotičke in samo govorili o razvrščanju 275 00:16:56,420 --> 00:16:59,430 v okviru številk, ker je lepo in enostavno govoriti, 276 00:16:59,430 --> 00:17:02,430 vendar lahko zagotovo primerjati nize, jabolka in banane, 277 00:17:02,430 --> 00:17:05,349 ker če je jabolko znano, da pridejo do banan, podobno, 278 00:17:05,349 --> 00:17:09,319 lahko premikate po nize v spomin, tako kot Rob naredil z neke združevanje v videoposnetku 279 00:17:09,319 --> 00:17:15,880 in smo tukaj na odru z izbiro vrste, vstavljanja vrste, in mehurček razvrstite. 280 00:17:15,880 --> 00:17:18,710 Torej, kam bomo lahko to? Poskusimo tole. 281 00:17:18,710 --> 00:17:23,980 Naj nekako pozabili, da je lekcija za trenutek in poskusite zdaj, in kopiranje 1.c storiti naslednje. 282 00:17:23,980 --> 00:17:26,800 21 V skladu pravim tiskanje nekaj, 283 00:17:26,800 --> 00:17:28,520 potem grem niz od uporabnika, 284 00:17:28,520 --> 00:17:30,690 potem bom to v redu. 285 00:17:30,690 --> 00:17:33,620 Nismo zares prišel v to navado še ni, vendar naj zdaj to. 286 00:17:33,620 --> 00:17:40,990 Poglejmo resnici Odlepite tej plasti. To je res char *. Ta tip je res char *. 287 00:17:40,990 --> 00:17:45,690 Torej, kaj to pomeni, da se preveri, če ih == NULL? 288 00:17:45,690 --> 00:17:48,380 Izkazalo se je, da če pokličete funkcijo kot GetString 289 00:17:48,380 --> 00:17:51,540 ali bolj na splošno samo od računalnika, da vam nekaj pomnilnika, 290 00:17:51,540 --> 00:17:53,030 kaj bi lahko šlo narobe. 291 00:17:53,030 --> 00:17:56,630 Lahko bi bilo noro in prosi računalnik za terabajt pomnilnika 292 00:17:56,630 --> 00:18:01,780 ga prosi za miljard bajtov pomnilnika, ki ga preprosto ne obstajajo v računalniku, 293 00:18:01,780 --> 00:18:05,130 ampak GetString in druge funkcije potrebujejo nek način kričati na vas 294 00:18:05,130 --> 00:18:06,820 če ste zahtevali preveč. 295 00:18:06,820 --> 00:18:10,450 In tako GetString pa je to, če ste zahtevali več pomnilnika 296 00:18:10,450 --> 00:18:14,250 kot je na voljo v računalniku, tudi če je to zelo, zelo majhna verjetnost 297 00:18:14,250 --> 00:18:17,730 ker nihče od nas ne bodo vnesite bilijon znakov in nato pritisnite tipko Enter, 298 00:18:17,730 --> 00:18:21,980 vendar majhna verjetnost, čeprav je morda, jaz še vedno želim, da preverite to samo v primeru, 299 00:18:21,980 --> 00:18:26,120 in posebno vrednost, ki GetString, odgovor, in druge funkcije vrne 300 00:18:26,120 --> 00:18:30,630 če je kaj narobe, je NULL v vseh kape. 301 00:18:30,630 --> 00:18:36,520 >> In kaj je NULL? NULL prav tako se zgodi, da predstavlja kazalec. To je pomnilniški naslov 0. 302 00:18:36,520 --> 00:18:40,800 Svet je odločil, da samovoljno, če je to moj računalnik pomnilnik - veste kaj? - 303 00:18:40,800 --> 00:18:46,260 bomo ukradli samo 1 bajt pomnilnika vsakega računalnika, in to je mesto 0. 304 00:18:46,260 --> 00:18:49,560 Gremo mu dala vzdevek NULL, in bomo obljubljajo 305 00:18:49,560 --> 00:18:52,660 da ne bomo nikoli dejansko dal pravih podatkov ni 306 00:18:52,660 --> 00:18:56,770 saj smo samo arbitrarno potrebujejo posebno vrednost, 0, alias NULL, 307 00:18:56,770 --> 00:19:00,230 tako da bomo lahko kričati na uporabnike, če gre kaj narobe. 308 00:19:00,230 --> 00:19:03,590 V nasprotnem primeru morda ne vedo, ne pomeni, 0 dal nekaj tukaj 309 00:19:03,590 --> 00:19:05,490 ali to pomeni, kaj je šlo narobe? 310 00:19:05,490 --> 00:19:09,190 Moramo se vsi strinjamo, da NULL pomeni nič, je bila vrnjena, 311 00:19:09,190 --> 00:19:11,700 nima dejanskega naslova, je bila vrnjena. 312 00:19:11,700 --> 00:19:15,210 Zdaj, tukaj sem samo svoje ljudi sprejetju konvencije o vrnem 1 od glavnega 313 00:19:15,210 --> 00:19:17,040 če gre kaj narobe. 314 00:19:17,040 --> 00:19:20,650 To je zato, ker vrnitev konvencija glavnih je, da se vrnete 0, če je dober, 315 00:19:20,650 --> 00:19:22,990 1 ali kakšno drugo vrednost, če je slabo. 316 00:19:22,990 --> 00:19:28,200 Toda GetString in vsako nalogo, ki se ukvarja v spomin vrne null, če gre kaj narobe. 317 00:19:28,200 --> 00:19:33,480 >> Ok. Torej, žal, linija 27, super enostavno, čeprav je popolnoma ne kopirajte niz. 318 00:19:33,480 --> 00:19:35,740 Zakaj? To lahko vidimo na naslednji način. 319 00:19:35,740 --> 00:19:40,120 Jaz sem trdila v skladu 27, da se kar kopijo s in pozval, da t. 320 00:19:40,120 --> 00:19:45,790 Torej, jaz ne sprašuje uporabnika za 2 strun tokrat, pravim samo vrednost v ih 321 00:19:45,790 --> 00:19:47,870 treba vzpostaviti tudi t. 322 00:19:47,870 --> 00:19:52,890 Torej, zdaj samo pokazati, kako napačno je to v skladu 29 dalje, kaj počnem? 323 00:19:52,890 --> 00:19:56,980 Najprej sem preverjanje, če je dolžina večja od t 0. 324 00:19:56,980 --> 00:19:59,330 Nekaj ​​niz tam. Vtipkali nekaj palcev 325 00:19:59,330 --> 00:20:03,410 Kaj je linija 32 početje, na videz? 326 00:20:03,410 --> 00:20:08,910 [Neslišno študentski odziv] >> desno. Lahko nekako izhajati iz tega, kar sem rekel, da to počne. 327 00:20:08,910 --> 00:20:13,200 Ampak tehnično, kaj je to delaš? t [0] pomeni kaj? 328 00:20:13,200 --> 00:20:15,140 [Študent] znak 0.. >> [Malan] znak 0.. 329 00:20:15,140 --> 00:20:19,620 Ali pa bolj človeški, kot so, prvi znak na t, karkoli že to je, H morda v tem primeru. 330 00:20:19,620 --> 00:20:24,990 In toupper ne, kaj piše. To izkorišča na 0. značaj ton in ga spremeni. 331 00:20:24,990 --> 00:20:28,430 Torej to pomeni, da je 0. značaj t, bi bilo veliko začetnico, 332 00:20:28,430 --> 00:20:30,320 in ga spravil nazaj v istem mestu. 333 00:20:30,320 --> 00:20:35,540 Torej, če sem tip zdravo z malimi črkami, je treba to spremeniti male črke h na kapitalski H. 334 00:20:35,540 --> 00:20:41,400 Ampak problem je, da v vrsticah 35 in 36, kar sem storil je izpisal nam s in t. 335 00:20:41,400 --> 00:20:43,120 In kaj je tvoja slutnja? 336 00:20:43,120 --> 00:20:47,250 Kaj bom dejansko dogaja, da vidim, če sem tipkal v zdravo v vseh male? 337 00:20:47,250 --> 00:20:52,280 Kaj se dogaja, da se natisne? >> [Neslišno študentski odziv] >> Kaj je to? 338 00:20:52,280 --> 00:20:58,360 [Študent] Big H in ostale majhne. >> Veliki H, ostalo majhno, za katera je ali ne? 339 00:20:58,360 --> 00:21:03,170 [Študent] Oboje. >> Oboje. Točno tako. Torej, poglejmo, kaj se tu dogaja. 340 00:21:03,170 --> 00:21:08,380 >> Naj gredo naprej in zbira to. To je copy1, zato poskrbite copy1. V redu. 341 00:21:08,380 --> 00:21:14,840 Zoom noter Naj gredo naprej in zagon copy1, Enter Reci nekaj: Pozdravi z malimi tiskanimi črkami. 342 00:21:14,840 --> 00:21:19,570 To začetnico kopijo, vendar je očitno kapitalizirana izvirniku, kot tudi, 343 00:21:19,570 --> 00:21:22,070 ker tisto, kar se zdaj dogaja v tej zgodbi? 344 00:21:22,070 --> 00:21:27,030 27 V skladu mi dejansko ne zdi, da kopirate niz, 345 00:21:27,030 --> 00:21:30,450 vendar pa bi čeprav ste intuitivno upali, da bo v primeru, 346 00:21:30,450 --> 00:21:33,680 Če menite, da o tej sliki kaj so res sem naredil? 347 00:21:33,680 --> 00:21:35,410 Polovica slike je enaka. 348 00:21:35,410 --> 00:21:39,390 Torej roll nazaj v čas, tako da ne še ne obstaja v zgodbi. 349 00:21:39,390 --> 00:21:43,160 S prisotna v zgodbi, ampak kaj je zdravo male tokrat. 350 00:21:43,160 --> 00:21:46,710 Torej, naj določi, kaj sem dejansko vtipka 351 00:21:46,710 --> 00:21:51,280 V tem primeru imamo tukaj h-e-l-L-o. 352 00:21:51,280 --> 00:21:58,050 Mi bomo pripraviti kot zaporedje znakov, dal moje separator linij tu in moja \ 0. 353 00:21:58,050 --> 00:22:05,980 Torej, to je, če smo takoj linije 1 do 24-ish, gor ali dol, so usmrtili. 354 00:22:05,980 --> 00:22:07,800 To je slika mojega spomina. 355 00:22:07,800 --> 00:22:10,800 Ko pridem v skladu 27, kaj se zgodi? 356 00:22:10,800 --> 00:22:14,730 Tako kot prej, sem dobil kazalec, ki ga bom kot pripravo tega trga. 357 00:22:14,730 --> 00:22:19,740 To se imenuje t. In kaj je njena vrednost privzeto? Kdo ve? Nekatere smeti vrednost. 358 00:22:19,740 --> 00:22:22,060 >> Torej bom abstraktna, da stran, kot vprašajem. 359 00:22:22,060 --> 00:22:27,670 In takoj, ko je desna stran vrstice 27 izvaja, kaj sem dajanje znotraj t? 360 00:22:27,670 --> 00:22:30,770 Ista stvar, ki je v s. 361 00:22:30,770 --> 00:22:34,120 Torej, če se za trenutek odstraniti to abstrakcijo puščice in rečemo, 362 00:22:34,120 --> 00:22:40,330 Oh, to je spomin obremenitev naslov 123, ko rečeš ne dobi s, podpičje, 363 00:22:40,330 --> 00:22:42,700 ste dobesedno dajanje 123 tukaj. 364 00:22:42,700 --> 00:22:45,200 Zdaj, če smo nekako poenostaviti naš svet spet s slikami, 365 00:22:45,200 --> 00:22:48,750 kaj ste res storili, je pravkar dodali še eno puščico na vašem svetu 366 00:22:48,750 --> 00:22:52,910 , ki je usmerjen od t isti točen niz. 367 00:22:52,910 --> 00:22:59,730 Torej, če je v skladu 31 in 32 sem dejansko šel o spreminjanju t [0] 368 00:22:59,730 --> 00:23:05,580 kaj je t [0] očitno sinonim za zdaj? s [0] 369 00:23:05,580 --> 00:23:07,030 Tako, da je vse, kar se dogaja. 370 00:23:07,030 --> 00:23:09,900 In čeprav je ta vrsta počuti malo nizka stopnja in arcane 371 00:23:09,900 --> 00:23:12,760 in to nekako zdi, kot bi morda intuitivno to so samo delali - 372 00:23:12,760 --> 00:23:15,410 Naredil sem kopije stvari prej in je samo delal - 373 00:23:15,410 --> 00:23:18,590 če ste dejansko pomisli, kaj niz res, da je char *. 374 00:23:18,590 --> 00:23:21,700 Torej, kaj je to? To je naslov nekega učinka. 375 00:23:21,700 --> 00:23:24,930 Potem je to morda še bolj smiselno, da ko boste poskušali narediti nekaj 376 00:23:24,930 --> 00:23:29,220 super videz preprosto, kot je ta, vse, kar delaš, je kopiranje pomnilnika naslov. 377 00:23:29,220 --> 00:23:32,530 Ti si dejansko ne počne nič z vrvico sam. 378 00:23:32,530 --> 00:23:37,500 Torej, tudi če nimate pojma, kako bi lahko rešili ta problem v kodi, 379 00:23:37,500 --> 00:23:45,080 visoki ravni, konceptualno, kaj moramo storiti, da bi TA prepis s, očitno? 380 00:23:46,670 --> 00:23:48,820 Ja. >> [Študent] Daj novo lokacijo? >> Točno tako. 381 00:23:48,820 --> 00:23:50,800 >> Moramo dati T a povsem novo lokacijo. 382 00:23:50,800 --> 00:23:55,230 Moramo nekako ustvariti svet, v katerem smo dobili nov kos pomnilnika, 383 00:23:55,230 --> 00:24:00,090 ki samo zaradi večje preglednosti bom pripraviti tik pod to, pač pa mu ni treba biti tam. 384 00:24:00,090 --> 00:24:04,880 Vendar pa mora biti enake velikosti, tako da bom pripravi te navpične črte na istem mestu. 385 00:24:04,880 --> 00:24:09,720 To je v redu, če je to vse smeti na začetku. Kdo ve, kaj je bilo tam? 386 00:24:09,720 --> 00:24:13,850 Ampak korak 1 se bo moral, da bi me dal toliko pomnilnika, kot rabim 387 00:24:13,850 --> 00:24:18,630 namestiti kopijo zdravo, nato ugotovimo, kako kopirati h tu e tukaj, 388 00:24:18,630 --> 00:24:20,390 sem tukaj in tako naprej. 389 00:24:20,390 --> 00:24:24,880 Vendar bi to že počutim malo jasno, čeprav nekatere podrobnosti še vedno abstraktna. 390 00:24:24,880 --> 00:24:28,690 Če želite kopirati ta niz v to, da je samo za zanke ali while zanko 391 00:24:28,690 --> 00:24:31,580 ali kaj podobnega, s katerim ste postali vse bolj pozna. 392 00:24:31,580 --> 00:24:35,970 Torej, kaj je poskusiti. Naj gredo v copy2.c. 393 00:24:35,970 --> 00:24:43,270 V copy2.c imamo skoraj enak program, razen za linijo 27. 394 00:24:43,270 --> 00:24:47,260 Videti je malo zapleteno, ampak če ga razgradi košček za koščkom, 395 00:24:47,260 --> 00:24:48,950 Na levi strani je isto. 396 00:24:48,950 --> 00:24:52,790 Char * t ustvari ta stvar v spominu, čeprav z vprašajem 397 00:24:52,790 --> 00:24:54,680 saj ne vemo, kaj je tam privzeto. 398 00:24:54,680 --> 00:24:57,920 Na desni strani smo zdaj uvaja novo funkcijo, malloc, 399 00:24:57,920 --> 00:25:00,640 za dodelitev pomnilnika, da mi spomin, 400 00:25:00,640 --> 00:25:06,900 in je očitno potrebno, koliko argumentov, koliko stvari znotraj oklepajev? 401 00:25:09,660 --> 00:25:12,130 Slišal sem mrmljanje po 1 in 2, vendar pa je le 1. 402 00:25:12,130 --> 00:25:15,320 Ni vejica, kar pomeni, da je samo 1 stvar v oklepajih. 403 00:25:15,320 --> 00:25:17,720 Kljub temu, da je drugi oklepajev, naj poudari 404 00:25:17,720 --> 00:25:21,460 kaj je v najbolj oddaljenih oklepaju, in to je to izraz: 405 00:25:21,460 --> 00:25:25,880 (Strlen (s) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Torej, če bi dejansko mislijo to skozi, to je rekel, da mi, koliko je. 407 00:25:29,190 --> 00:25:34,440 Zakaj sem, čeprav, dodaja 1 na dolžino? >> [Neslišno študentski odziv] 408 00:25:34,440 --> 00:25:40,200 Točno tako. Potrebujemo prostor za tega fanta na repu, 6. znakov, ki nima pomena English 409 00:25:40,200 --> 00:25:42,250 vendar pa imajo poseben programski pomen. 410 00:25:42,250 --> 00:25:46,800 >> Torej potrebujemo + 1 za to, ker strlen vrne človeško pričakovanj dolžine, 411 00:25:46,800 --> 00:25:50,890 Pozdravljeni ali 5, se vam ne daje dodatne značaj null. 412 00:25:50,890 --> 00:25:52,980 Tako sem ročno dodati to z + 1. 413 00:25:52,980 --> 00:25:56,060 In potem to * velikost (char), nismo videli že prej. 414 00:25:56,060 --> 00:25:57,480 To ni tehnično funkcijo. 415 00:25:57,480 --> 00:26:04,150 To je posebna ključna beseda, ki samo vam pove, kaj je velikost nekega tipa podatkov na računalniku 416 00:26:04,150 --> 00:26:06,980 ker v resnici, nekateri od nas ima 32-bitne računalnike. 417 00:26:06,980 --> 00:26:10,900 Imam precej star računalnik doma, in to šele uporablja 32 bitov za zastopanje kazalca. 418 00:26:10,900 --> 00:26:13,900 In tako, če sem velikost vrsto podatkov, je lahko 32 bitov. 419 00:26:13,900 --> 00:26:18,300 Ampak, če sem z mojo novo fancy računalnik, lahko pridem nazaj v vrednosti 64 bitov 420 00:26:18,300 --> 00:26:20,510 Za kaj takega naslova. 421 00:26:20,510 --> 00:26:25,400 Torej, v tem primeru samo, da je zelo varno, da mi ne bo težko nekaj podobnega kode - 422 00:26:25,400 --> 00:26:28,740 No, kaj je velikost char glede na tisto, kar smo rekli tako daleč? 423 00:26:28,740 --> 00:26:34,450 Smo precej dejal, verbalno, da je 1 bajt, in to je res precej čez krov. 424 00:26:34,450 --> 00:26:37,000 Ampak še enkrat, predpostavke ponavadi slabo. 425 00:26:37,000 --> 00:26:40,850 Slednji vodijo k Otroški voziček programske opreme, če ljudje uporabljajo programsko opremo na način, da ni nameraval. 426 00:26:40,850 --> 00:26:44,750 Torej, kaj je abstraktna to stran, samo bolj generično reči 427 00:26:44,750 --> 00:26:46,830 Rabim to veliko kose pomnilnika 428 00:26:46,830 --> 00:26:50,210 in bi vsak kos pomnilnika je enaka velikosti značaja, 429 00:26:50,210 --> 00:26:54,870 ki je v bistvu enaka 1 v tem primeru, ampak to je bolj splošen način pisanja. 430 00:26:54,870 --> 00:27:00,460 Torej, če je beseda zdravo, koliko bajtov se malloc očitno dodeliti halo? 431 00:27:00,460 --> 00:27:04,980 [Študent] Šest. >> Šest. Točno toliko, kot smo vprałaje na zaslonu. 432 00:27:04,980 --> 00:27:07,800 In nato ugibati zdaj temelji na razumevanju GetString 433 00:27:07,800 --> 00:27:12,790 kaj malloc verjetno vrnil? >> [Študent] naslov. 434 00:27:12,790 --> 00:27:17,020 Naslov kaj? Od 1. kos pomnilnika. 435 00:27:17,020 --> 00:27:20,670 >> Ne vemo, kaj je tam zato, ker nekatere druge funkcije 436 00:27:20,670 --> 00:27:23,010 bi bilo mogoče z uporabo te spomin prej. 437 00:27:23,010 --> 00:27:28,380 Ampak malloc, kot GetString, vrne naslov prvega bajta pomnilnika 438 00:27:28,380 --> 00:27:30,540 da je v prahi za vas. 439 00:27:30,540 --> 00:27:38,380 Vendar, kaj ne storiti je, da izpolnite ta slepega z znakom poševnice nazaj null 440 00:27:38,380 --> 00:27:43,030 ker se je izkazalo, lahko uporabite malloc dodeliti vse: ints, nizi, nizi, 441 00:27:43,030 --> 00:27:45,700 plava, študentske strukture. 442 00:27:45,700 --> 00:27:47,750 Lahko uporabite malloc povsem generičen. 443 00:27:47,750 --> 00:27:51,470 Ne skrbi, ali pa mora vedeti, kaj dodeljevanju pomnilnika za. 444 00:27:51,470 --> 00:27:55,810 Zato bi bilo drzno za knjižnične funkcije malloc postaviti \ 0 445 00:27:55,810 --> 00:27:58,340 Na koncu vsakega kos pomnilnika, vas bo to daje 446 00:27:58,340 --> 00:28:02,620 ker je to \ 0 stvar je samo dogovor za godala. 447 00:28:02,620 --> 00:28:06,310 To se ne uporablja za ints, se ne uporablja za plovila, se ne more uporabiti za študente. 448 00:28:06,310 --> 00:28:11,730 In tako kavelj z knjižnične funkcije malloc je, da je breme popolnoma na vas programer 449 00:28:11,730 --> 00:28:16,790 da se spomnimo, koliko bajtov se dodeli in kdaj ne uporabljajo za zanko 450 00:28:16,790 --> 00:28:21,570 ali pa zanke in šel mimo meje kos pomnilnika, ki smo vam jih dali. 451 00:28:21,570 --> 00:28:23,540 Povedano drugače, kakor hitro dodeliti pomnilnika, 452 00:28:23,540 --> 00:28:28,510 ne morete zahtevati od operacijskega sistema, oh, mimogrede, kako velik kos pomnilnika, je bilo to? 453 00:28:28,510 --> 00:28:32,080 To je povsem odvisno od vas, da se spomnite, če boste morali to vrednost. 454 00:28:32,080 --> 00:28:34,330 >> Torej, poglejmo, kako nadaljevati uporabo te spomin. 455 00:28:34,330 --> 00:28:38,430 V skladu 28 in 29, zakaj počnem to? 456 00:28:39,850 --> 00:28:42,260 Samo skupaj Razum pregled. 457 00:28:42,260 --> 00:28:45,110 Samo v primeru, gre kaj narobe, sem prosil za nekaj norega količino pomnilnika 458 00:28:45,110 --> 00:28:48,690 ali sem toliko stvari, ki se izvajajo na računalniku, da enostavno ni dovolj pomnilnika, 459 00:28:48,690 --> 00:28:51,780 nekaj takega sem vsaj želeli preveriti za nično. 460 00:28:51,780 --> 00:28:55,260 V resnici, bo večina računalnikov vam iluzijo, da vsak program 461 00:28:55,260 --> 00:28:57,080 Lahko uporabite celoto vašega RAM-a, 462 00:28:57,080 --> 00:29:00,740 ampak kljub temu, če uporabnik vnese v nekaj norega dolg niz morda zato, ker si slab človek 463 00:29:00,740 --> 00:29:03,440 in oni so dejansko poskuša crash vaš program ali kramp v to, 464 00:29:03,440 --> 00:29:07,300 želite vsaj preveri vrnjeno vrednost knjižnične funkcije malloc in ali je enaka nič. 465 00:29:07,300 --> 00:29:11,630 In če ne, kaj je pravkar nehal prav zdaj, ker ne vem, kaj naj naredim v tem primeru. 466 00:29:11,630 --> 00:29:13,950 Kako kopiram niz? Tukaj je nekaj načinov, da to storijo. 467 00:29:13,950 --> 00:29:18,850 Obstajajo str kopiranje funkcij v C, vendar je super enostavno za nas, da to stori na staromoden način. 468 00:29:18,850 --> 00:29:23,110 >> Najprej naj ugotovimo, kaj je dolžina s je. 469 00:29:23,110 --> 00:29:26,930 Lahko bi dal to v zanko, ampak sem ga dal ven zaradi jasnosti. 470 00:29:26,930 --> 00:29:30,610 Torej sedaj n shrani dolžino prvotne niza, ki je očitno 5. 471 00:29:30,610 --> 00:29:35,290 Potem pa po mojem za zanko bom ponavljanjem od 0 do n o, 472 00:29:35,290 --> 00:29:40,940 in na vsaki ponovitvi bom dal s [i] v t [i]. 473 00:29:40,940 --> 00:29:45,060 Tako da je tisto, kar je pomenilo z mojimi prsti kazali na 2 strune prej. 474 00:29:45,060 --> 00:29:49,260 Ker je ta zanka se ponovi, kot je ta, da bom lahko kopirate h na tukaj, 475 00:29:49,260 --> 00:29:52,890 e na tu, sem na tem mestu, ker je to govorite, to je t. 476 00:29:52,890 --> 00:29:58,770 In potem končno, v vrstici 35 zakaj počnem to? 477 00:29:58,770 --> 00:30:03,770 Moram poskrbeti, da bom končal niz t. 478 00:30:03,770 --> 00:30:06,170 In sem ga na ta način, da je zelo jasna. 479 00:30:06,170 --> 00:30:09,510 Toda predlagam, nekoga, če bi lahko, na drugačen način to. 480 00:30:09,510 --> 00:30:13,930 Res ne potrebujejo linijo 35. Obstaja še en način, da to storijo. 481 00:30:13,930 --> 00:30:18,880 Ja. >> [Neslišno študentski odziv] >> Povej naglas. 482 00:30:18,880 --> 00:30:20,960 [Študent] Manj kot ali enaka. >> Točno tako. 483 00:30:20,960 --> 00:30:24,450 Mi lahko samo povem, manjša ali enaka n, ki je bil na splošno slabo 484 00:30:24,450 --> 00:30:28,190 ker skoraj vedno, ko gremo na enako stvar, ki smo si za štetje 485 00:30:28,190 --> 00:30:30,000 gremo 1 korak predaleč. 486 00:30:30,000 --> 00:30:32,170 Ampak zapomni si, koliko bajtov smo dodelijo? 487 00:30:32,170 --> 00:30:37,210 Smo namenili za strlen s, 5 + 1, torej za skupno 6. 488 00:30:37,210 --> 00:30:39,980 Torej, v tem primeru bi lahko naredil kaj takega 489 00:30:39,980 --> 00:30:46,450 tako da smo kopiranje ne le zdravo, ampak tudi \ 0 na samem koncu. 490 00:30:46,450 --> 00:30:49,860 Druga možnost je, da uporabite funkcijo imenovano str kopija, strcpy, 491 00:30:49,860 --> 00:30:51,700 vendar to ne bi bilo skoraj tako zabavno. 492 00:30:51,700 --> 00:30:54,000 Ampak to je vse, kar počne pod pokrovom. 493 00:30:54,000 --> 00:30:56,050 Potem končno, delamo isto kot prej. 494 00:30:56,050 --> 00:31:01,620 Sem izkoristil t, nato pa trdim, da je prvotna izgleda tako, in izgleda, da je kopija. 495 00:31:01,620 --> 00:31:08,570 Torej, kaj je zdaj to poskusil. Pusti me tukaj. Naredite copy2. Bomo povečanje in zagon copy2. 496 00:31:08,570 --> 00:31:13,840 Grem, da tip v zdravo z malimi črkami, in res sem dobil male zdravo kot izvirnik 497 00:31:13,840 --> 00:31:16,930 ampak glavno Pozdravljeni za kopijo. 498 00:31:16,930 --> 00:31:20,300 Ampak jaz nisem naredil še. Moram narediti še nekaj 1 tukaj. 499 00:31:20,300 --> 00:31:28,000 46 in 47, je jasno sprostiti spomin, toda kaj to pravzaprav pomeni? 500 00:31:28,000 --> 00:31:33,250 Kaj počnem, misliš, da s pozivom linijo 46 in linijo 47? 501 00:31:33,250 --> 00:31:38,900 Kakšen učinek ima to? Ja. 502 00:31:38,900 --> 00:31:43,140 [Neslišno študentski odziv] >> Točno tako. 503 00:31:43,140 --> 00:31:46,380 >> Vi ste samo govoril operacijski sistem, hej, hvala za ta spomin. 504 00:31:46,380 --> 00:31:48,320 Sedaj lahko uporabite za nekoga drugega. 505 00:31:48,320 --> 00:31:50,790 In tu je odličen primer za smeti vrednosti. 506 00:31:50,790 --> 00:31:55,430 Pravkar sem se uporablja ta spomin zapisati besedo Pozdravljeni v 2 prostorih, 507 00:31:55,430 --> 00:31:57,490 tukaj, tukaj, tukaj in tukaj. 508 00:31:57,490 --> 00:32:00,910 Torej, to je h-e-l-l-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Potem pa sem poklical linijo 46 in linijo 47, in veš, kaj se tam dogaja, glede na sliki? 510 00:32:06,960 --> 00:32:10,010 Pravzaprav, počakaj, ta slika je stara. 511 00:32:10,010 --> 00:32:12,550 Ko naredimo kopijo, ta tip je dejansko kaže tukaj, 512 00:32:12,550 --> 00:32:16,110 tako da je odstranitev številke in samo abstraktna stran kot naše puščice znova. 513 00:32:16,110 --> 00:32:19,370 Kaj se bo zgodilo na tej sliki, ko sem pokličete na brezplačno? 514 00:32:19,370 --> 00:32:22,750 [Neslišno študentski odziv] >> Niti. 515 00:32:22,750 --> 00:32:29,510 Če pokličem na brezplačno S in T - nekakšen trik vprašanje - ta slika ne spremeni sploh 516 00:32:29,510 --> 00:32:33,880 ker kliče s in t kliče samo pove, operacijski sistem, 517 00:32:33,880 --> 00:32:39,010 hej, lahko uporabite ta spomin še enkrat, ampak to ne spremeni na null 518 00:32:39,010 --> 00:32:41,840 ali kakšen poseben znak, to ne spremeni tega, 519 00:32:41,840 --> 00:32:47,350 to ne spremeni h ali E ali l ali l ali Ö v vsakem mestu na karkoli drugega. 520 00:32:47,350 --> 00:32:51,610 Glede na sliko, takoj pokličite brezplačno, nič sprememb. 521 00:32:51,610 --> 00:32:56,570 In v tem je izvor smeti vrednosti, ker če bom kasneje v tem programu 522 00:32:56,570 --> 00:33:01,010 vprašajte operacijski sistem za več pomnilnika s GetString ali malloc ali kaj podobnega 523 00:33:01,010 --> 00:33:04,900 in operacijski sistem pravi, seveda, imam 12 bitov pomnilnika tako razbremenila, 524 00:33:04,900 --> 00:33:08,080 Uporabite jih, kaj se dogaja, da se predali? 525 00:33:08,080 --> 00:33:10,830 Ti boš, da se izroči kos pomnilnika, ki bi običajno pripravi 526 00:33:10,830 --> 00:33:13,700 z vprašaji, ampak kaj so ti vprašljiva? 527 00:33:13,700 --> 00:33:17,000 Se zgodi, da bo h-e-l-l-o, h-e-l-l-o. 528 00:33:17,000 --> 00:33:20,940 To so naši novi smetarska vrednosti takoj, ko se sprostite, da je spomin. 529 00:33:20,940 --> 00:33:22,750 >> Tam je resnični svet posledice tu. 530 00:33:22,750 --> 00:33:24,720 To se zgodi storiti z RAM-a, ampak si računalnike 531 00:33:24,720 --> 00:33:26,720 dejansko storijo enako stvar z diska. 532 00:33:26,720 --> 00:33:30,620 Bomo govorili o tem, zlasti s prihodnjo problem, ki se osredotoča na forenzike. 533 00:33:30,620 --> 00:33:36,170 Toda kaj se dejansko zgodi, če imate nekaj občutljivo finančno sliko na namizju 534 00:33:36,170 --> 00:33:39,600 ali nekaj površno JPEG in jo povlecite v koš, 535 00:33:39,600 --> 00:33:44,390 kaj se zgodi, ko jo povlecite v koš ali v koš? 536 00:33:44,390 --> 00:33:47,240 Vedela si, kaj sem govoril. [Smeh] 537 00:33:47,240 --> 00:33:52,370 Kaj se zgodi, ko ste vlekli teh dokazov v koš ali koša? 538 00:33:52,370 --> 00:33:55,920 [Neslišno študentski odziv] 539 00:33:55,920 --> 00:33:58,000 No, tako previden. Kaj se zgodi, ko si to naredil? 540 00:33:58,000 --> 00:34:01,030 Kratek odgovor je nič, kajne? 541 00:34:01,030 --> 00:34:04,790 Sketchy ali občutljive datoteka je še vedno sedel tam nekje na trdem disku. 542 00:34:04,790 --> 00:34:07,940 Večina nas je vsaj naučili na težji način, da morate izprazniti koš 543 00:34:07,940 --> 00:34:10,429 ali koš za dejansko brisanje datotek. 544 00:34:10,429 --> 00:34:13,440 In res, ko desno kliknite ali Control in kliknite na koš se lahko 545 00:34:13,440 --> 00:34:15,580 ali izberite Datoteka, Empty Trash ali karkoli 546 00:34:15,580 --> 00:34:21,420 in ti dejansko izpraznite koša ali koš, kaj se dejansko dogaja potem te slike? 547 00:34:22,810 --> 00:34:25,969 Več nič. Torej, nič se dejansko dogaja na disku. 548 00:34:25,969 --> 00:34:30,880 >> In če bomo le začasno Zastraniti in pisati - bom samo na zadnjo stran tega. 549 00:34:30,880 --> 00:34:34,639 Torej, zdaj zgodba se spreminja iz RAM-a, ki je, če obstajajo programi 550 00:34:34,639 --> 00:34:39,250 ko ste jih izvaja, na disk, ki je, če so shranjeni dolgoročno 551 00:34:39,250 --> 00:34:42,920 tudi takrat, ko moč ugasne, za zdaj - in se bomo vrnili na to v prihodnosti - 552 00:34:42,920 --> 00:34:46,380 kaj je samo pretvarjal, da je to trdi disk notranjosti računalnika 553 00:34:46,380 --> 00:34:50,110 ker je nazaj v dan, so nekoč okrogle diske, podobno kot diskete. 554 00:34:50,110 --> 00:34:55,130 Torej, če imate nekaj občutljivo datoteko Excel, lahko traja ta kos pomnilnika 555 00:34:55,130 --> 00:34:59,770 na disku računalnika, in sem samo risbo enako samovoljno 1s in 0s. 556 00:34:59,770 --> 00:35:03,970 Ko povlečete datoteko, kot je ta v koš ali pa lahko koš, 557 00:35:03,970 --> 00:35:07,750 dobesedno nič ne zgodi zato, ker so Apple in Microsoft je pravkar odločila, 558 00:35:07,750 --> 00:35:10,450 koša in koš je res samo začasno ogrado. 559 00:35:10,450 --> 00:35:14,710 Morda bo sčasoma OS jo izpraznite zate, vendar je običajno, da ne stori ničesar, 560 00:35:14,710 --> 00:35:17,090 vsaj dokler ste res zmanjkuje prostora. 561 00:35:17,090 --> 00:35:20,870 >> Vendar, ko greš na prazen koš ali s praznim košem, 562 00:35:20,870 --> 00:35:23,460 Podobno se nič ne zgodi, da te slike. 563 00:35:23,460 --> 00:35:28,590 Vse, kar se dogaja drugje na vašem računalniku, je neke vrste tabele. 564 00:35:28,590 --> 00:35:35,400 To je nekako kot malo stanja goljufija, ki pravi, da je, recimo, resume.doc, 565 00:35:35,400 --> 00:35:40,920 tako da svoj življenjepis v datoteko programa Microsoft Word, ki se uporablja za živi na voljo 123 na trdem disku, 566 00:35:40,920 --> 00:35:43,710 ni v spomin in ne v RAM-a na trdem disku, 567 00:35:43,710 --> 00:35:49,050 in vaše skicirana JPEG živi na 456 in vaš Excel datotek živi na 789 ali kamorkoli. 568 00:35:49,050 --> 00:35:53,640 Ko izbrišete datoteke, ki jih dejansko praznjenje smeti ali koš, 569 00:35:53,640 --> 00:35:59,530 Ta slika ne spremeni. The 0s in 1s na trdem disku, ne gredo nikamor. 570 00:35:59,530 --> 00:36:03,930 Ampak ta miza, ta mala zbirka sort, ne spremembe. 571 00:36:03,930 --> 00:36:08,750 Ko izbrišete svoj življenjepis, je, kot da je datoteka izbrisana v nekem smislu, 572 00:36:08,750 --> 00:36:12,790 ampak vse se računalnik ne pozabite, če se ta stvar živi na trdem disku. 573 00:36:12,790 --> 00:36:17,870 The 0s in 1s, da sestavite svoj življenjepis ali katero koli od teh drugih datotek, so še vedno nedotaknjene. 574 00:36:17,870 --> 00:36:21,960 >> Torej, če ste to naredili po nesreči, še vedno ni nič verjetnost 575 00:36:21,960 --> 00:36:25,800 da lahko povračilo vaše podatke z Norton Utilities ali kakšno poslovno programsko opremo 576 00:36:25,800 --> 00:36:29,810 katerih namen v življenju je, da je bil 0s in 1s, da so neke vrste sirota, 577 00:36:29,810 --> 00:36:33,300 pozabil sem pa pustil tukaj, tako da lahko dobite podatke nazaj. 578 00:36:33,300 --> 00:36:38,410 Ali bi forenzični preiskovalci s policijo in FBI dejansko lahko trdi disk 579 00:36:38,410 --> 00:36:42,550 in dejansko iščejo vzorce 0s in 1s, ki izgleda kot JPEG, izgledajo kot Excelove datoteke, 580 00:36:42,550 --> 00:36:46,400 in izterja jim na ta način, tudi če je računalnik pozabil tam. 581 00:36:46,400 --> 00:36:49,820 Zato je edini način, res izbrisati podatke, saj bomo razpravljali v prihodnosti, 582 00:36:49,820 --> 00:36:54,190 je za čiščenje ali izbrisati datoteko ali trdi disk - 583 00:36:54,190 --> 00:36:56,540 Saj ne morem znebiti 0s in 1s 584 00:36:56,540 --> 00:36:59,440 ker drugače boš začel z GB trdega diska 585 00:36:59,440 --> 00:37:02,380 in boš na koncu z megabajt trdega diska, če ste nenehno bilo brisanje 586 00:37:02,380 --> 00:37:04,380 dobesedno 0s in 1s. 587 00:37:04,380 --> 00:37:06,310 Torej, kaj bi naredil, če si res želel zakriti sledi 588 00:37:06,310 --> 00:37:10,510 in temeljni problem je, da je še vedno 0 in 1s na disku? 589 00:37:10,510 --> 00:37:14,930 Vidim nekoga, ki bi jo z rokami opletajočega fizično prekinil napravo. To bo delovalo. 590 00:37:14,930 --> 00:37:19,600 [Smeh] Ampak če je to neke vrste drage rešitve, kaj bi bilo bolj smiselno? 591 00:37:19,600 --> 00:37:23,270 Ja. >> [Študent] jih prepisati. >> Prepiši jih s čim? >> [Študent] Drugi podatki. 592 00:37:23,270 --> 00:37:29,070 Ostali podatki. Lahko samo prepisati disk z 0s ali 1S ali vse 0s, vse 1s. 593 00:37:29,070 --> 00:37:31,230 >> In to je tisto, kar res nekaj programske opreme, ne. 594 00:37:31,230 --> 00:37:33,570 Lahko kupite programsko opremo ali celo brezplačno programsko opremo, 595 00:37:33,570 --> 00:37:36,610 in celo vgrajena v operacijski sistem Mac OS teh dneh, manj pa v operacijskem sistemu Windows, 596 00:37:36,610 --> 00:37:38,660 je sposobnost za varno brisanje. 597 00:37:38,660 --> 00:37:41,960 Pravzaprav, če želite, da vsi vodijo domov danes, če imate Mac in to, 598 00:37:41,960 --> 00:37:45,740 če imaš lahko nekatere stvari v koš, lahko to storite Secure Empty Trash, 599 00:37:45,740 --> 00:37:47,610 ki počne točno to. 600 00:37:47,610 --> 00:37:53,350 Namesto da samo brisanje datotek, tukaj se ne zbriše 0s in 1s tukaj, 601 00:37:53,350 --> 00:38:01,240 ne, samo spreminja vse tako, na primer, 0 in pika, pika, pika. 602 00:38:01,240 --> 00:38:05,330 Tako bo eden od vaših prihodnjih psets dejansko namenoma povrnitev podatkov - 603 00:38:05,330 --> 00:38:08,430 Fotografije, ki smo ga sprejeti ljudi, krajev in stvari na univerzi 604 00:38:08,430 --> 00:38:12,810 za katere bomo pripravili izvedensko sliko pomnilnika digitalnega fotoaparata kartice 605 00:38:12,810 --> 00:38:17,120 , ki je popolnoma enaka ideja - in ne boste imeli, da bi izpodbijala dejansko najti 606 00:38:17,120 --> 00:38:20,160 vzorci, ki predstavljajo JPEG na trdem disku, 607 00:38:20,160 --> 00:38:23,610 podobno kot to bivšega študenta, čigar e-naslov sem prebral pred nekaj tedni naredil 608 00:38:23,610 --> 00:38:25,860 obnoviti svoje sestre fotografije. 609 00:38:25,860 --> 00:38:30,300 Zakaj ne vzamemo 5-minutni odmor tukaj, pa bomo združil z več pomnilnika. 610 00:38:33,030 --> 00:38:38,610 Torej, tukaj je, če se stvari malo um-upogibni, vendar je to zelo močan korak 611 00:38:38,610 --> 00:38:40,480 k razumevanju tega vse več. 612 00:38:40,480 --> 00:38:42,900 Tukaj je program, imenovan pointers.c. 613 00:38:42,900 --> 00:38:45,430 To je med današnjim vzorčne kode. 614 00:38:45,430 --> 00:38:51,280 Obvestilo, da je v prvih nekaj vrstic, 19 do 22, vsi delamo, je nekaj podobnega GetString 615 00:38:51,280 --> 00:38:54,460 in vračanje naslov, jo shranite v ih. 616 00:38:54,460 --> 00:38:58,380 Odslej za pset celo 3, če želite, vendar pset 4 in na 617 00:38:58,380 --> 00:39:01,030 kjer boste lahko začeli jemati te vrste usposabljanja koles od sebe, 618 00:39:01,030 --> 00:39:04,030 ni nobenega razloga, da se pretvarjamo, da strune obstaja več. 619 00:39:04,030 --> 00:39:07,030 Vsekakor je prav, da to šele začetek pravi char *. 620 00:39:07,030 --> 00:39:12,610 >> Naj omenim, da v spletnih referenc in v knjigah lahko pogosto videli zvezdo poleg spremenljivke. 621 00:39:12,610 --> 00:39:15,600 Morda boste celo videli prostore okoli obeh straneh. 622 00:39:15,600 --> 00:39:17,680 Vse to so funkcionalno pravilna. 623 00:39:17,680 --> 00:39:21,180 Za zdaj, čeprav bomo standardizirali podlagi tega pristopa, da bi zelo jasno 624 00:39:21,180 --> 00:39:24,000 da char *, je, kot pravi značaj kazalec. 625 00:39:24,000 --> 00:39:25,680 To je vrsta podatkov. 626 00:39:25,680 --> 00:39:28,730 In potem je ime spremenljivke je v tej zadevi. 627 00:39:28,730 --> 00:39:31,180 Tako smo gotten niz in smo poimenovali s. 628 00:39:31,180 --> 00:39:35,180 In potem tukaj opazil, da sem dejansko delal malo trikov. 629 00:39:35,180 --> 00:39:39,080 To se imenuje aritmetično kazalec, ki je neke vrste super enostavno. 630 00:39:39,080 --> 00:39:41,790 To samo pomeni, dodajajo ali odvzemajo številke kazalca. 631 00:39:41,790 --> 00:39:43,660 Ampak to dejansko deluje. 632 00:39:43,660 --> 00:39:49,170 Ta program je očitno natisne v nizu s 1 znak na vrstico, kot da je končni rezultat - 633 00:39:49,170 --> 00:39:54,920 Samo tako bomo lahko pokvari, če se to dogaja, da napotke, teči napotke, naj povečate palca 634 00:39:54,920 --> 00:39:58,940 Zdaj pa mi tip nekaj podobnega HELLO in vrsta vnesite 635 00:39:58,940 --> 00:40:01,080 in se natisne 1 znak na vrstico. 636 00:40:01,080 --> 00:40:04,730 Do pred sekundo, bi bile to storili s kvadratno notacijo nosilec. 637 00:40:04,730 --> 00:40:09,760 Morali bi za zanko in bi naredil printf of s [i] in sva še enkrat in še enkrat in še enkrat 638 00:40:09,760 --> 00:40:11,950 z poševnice nazaj n na koncu vsake vrstice. 639 00:40:11,950 --> 00:40:16,800 Vendar pa je ta program drugačen. Ta program se uporablja, dobesedno, računanje. 640 00:40:16,800 --> 00:40:18,860 Torej, kaj se dogaja tukaj? 641 00:40:18,860 --> 00:40:24,720 Najprej, preden se ta zanka izvede še kaj, samo, da je jasno, je, je pravzaprav? 642 00:40:24,720 --> 00:40:27,270 S to? >> [Študent] naslov. >> Naslov. 643 00:40:27,270 --> 00:40:32,980 >> In to je naslov, v primeru hello, prvi znak v tej besedi, ki je h. 644 00:40:32,980 --> 00:40:37,370 Tako je, je v tem posebnem primeru je naslov h. 645 00:40:37,370 --> 00:40:41,850 Torej, kaj to pomeni, da naredimo + i? 646 00:40:41,850 --> 00:40:46,280 No, jaz se začne pri 0 V ta zanka. Naredili smo, da veliko krat. 647 00:40:46,280 --> 00:40:49,760 Sem, da bo šel do dolžine niza, očitno. 648 00:40:49,760 --> 00:40:53,950 Torej na prvi ponovitvi te zanke, i je seveda 0. 649 00:40:53,950 --> 00:41:01,740 Torej, ta izraz je rekel i + i - raje se s +0--to je seveda samo s. 650 00:41:01,740 --> 00:41:04,320 Torej, kaj je * e tukaj? 651 00:41:04,320 --> 00:41:08,530 Zdaj smo z zvezdo na nekoliko drugačen način. 652 00:41:08,530 --> 00:41:13,080 Naj gredo naprej in se znebite t ker smo storili govorimo o t in kopij je. 653 00:41:13,080 --> 00:41:15,540 Zdaj smo samo želim, da povem zgodbo, ki vključuje s. 654 00:41:15,540 --> 00:41:20,090 In tako se v tem trenutku, potem ko so tipa string, naš svet izgleda precej kot je to storila pred 655 00:41:20,090 --> 00:41:26,630 s samo s shranjevanjem naslov uro in bolj na splošno kaže na niz zdravo. 656 00:41:26,630 --> 00:41:33,170 Če bi sedaj naredil podobno vrstico * (i + i), poskusimo to. 657 00:41:33,170 --> 00:41:40,140 Tako * (i + i). Naj poenostavitev zaradi tega, ker je to 0, tako da je to * (y 0). 658 00:41:40,140 --> 00:41:43,790 No, počakaj malo. Poenostavite naprej. To je * (ov). 659 00:41:43,790 --> 00:41:47,020 No, zdaj so oklepaji malo butast, sedaj pa si pač * i. 660 00:41:47,020 --> 00:41:50,540 Torej, v prvi ponovitvi te zanke, da črto, ki je poudarila, 26, 661 00:41:50,540 --> 00:41:53,650 je precej enakovredna tiskanje to. 662 00:41:53,650 --> 00:41:56,040 Kaj je podatkovni tip * i? 663 00:41:56,040 --> 00:42:00,770 V zvezi s tem, ker je zvezda zgodi, da se ob ih sam, 664 00:42:00,770 --> 00:42:04,930 še bolj pa, ker smo se več ne razglasitvi s, 665 00:42:04,930 --> 00:42:09,730 ne bomo ustvariti spremenljivko več, ni omembe char * v skladu 26, 666 00:42:09,730 --> 00:42:14,280 ni omenjen niz ključnih besed, smo samo z imenom spremenljivke y, 667 00:42:14,280 --> 00:42:19,650 Izkazalo se je sedaj zvezda nekoliko drugače, in sicer, zmedeno pomen. 668 00:42:19,650 --> 00:42:26,590 * S tu pomeni pojdi na naslov vs in tiskanje, kar je tam. 669 00:42:26,590 --> 00:42:33,750 Torej je tu, * s - nekako kot Chutes in lestve, sledite puščico - tukaj. 670 00:42:33,750 --> 00:42:35,850 Torej, to je * e. 671 00:42:35,850 --> 00:42:39,060 >> Torej, kaj dobi natisnjena na prvi ponovitvi te zanke v skladu 26? 672 00:42:39,060 --> 00:42:42,170 Sem izpisal% C, kar je ogrado za znak, 673 00:42:42,170 --> 00:42:48,520 Nato \ n za novo linijo. * (I + i), kjer je i 0 je samo to. 674 00:42:48,520 --> 00:42:53,670 Torej, kaj zna moram postaviti v za% c? H. 675 00:42:53,670 --> 00:42:56,900 V naslednjem ponovitev zanke - boste verjetno videli, kam to pelje - 676 00:42:56,900 --> 00:43:01,350 naslednja ponovitev i je seveda 1, to pomeni, da je 1, 677 00:43:01,350 --> 00:43:05,580 nato pa zdaj mi potrebujemo oklepajev, ker zdaj zvezda mora pisati 678 00:43:05,580 --> 00:43:08,620 pojdite na naslov pomnilnika ih +1. 679 00:43:08,620 --> 00:43:14,170 Kaj je s? Naj roll nazaj v čas, da si to puščica sedaj dejansko ne gre nam vse usluge. 680 00:43:14,170 --> 00:43:18,450 Naj je še posebej povedati, da je to shranjevanje številko 123 681 00:43:18,450 --> 00:43:25,110 ker začetek tega niza Pozdravljeni, to je naslov 123, to je 124, in tako naprej. 682 00:43:25,110 --> 00:43:30,550 Torej, na drugi ponovitvi, ko sem rekel S 1, ki je, kot pravi, 123 1, 683 00:43:30,550 --> 00:43:35,340 drugače poznan kot 124, tako da kaj dobi znak je natisnjen na drugo ponovitev? 684 00:43:35,340 --> 00:43:37,850 E na 124 pomnilniškega naslova. 685 00:43:37,850 --> 00:43:44,440 Potem pa spet +, 125, 126, 127, in to zanko na srečo ustavi, preden smo prišli sem 686 00:43:44,440 --> 00:43:49,040 ker sem z strlen se prepričajte, da jaz ne šteje previsoka. 687 00:43:49,040 --> 00:43:50,810 Tako, da je to preveč. 688 00:43:50,810 --> 00:43:55,000 Tudi to je tako, kot če bi to storili pred tednom dni. 689 00:43:55,000 --> 00:43:59,200 Naj jo napišite na črto spodaj, čeprav ne želimo storiti oboje. 690 00:43:59,200 --> 00:44:02,500 To je enako zdaj to. 691 00:44:02,500 --> 00:44:08,310 >> Torej, čeprav je je niz, kot smo ga že kliče več tednov, je res char *. 692 00:44:08,310 --> 00:44:13,270 Torej, če želimo, da bo super analno, to je res primerno, da napišete poseben značaj 693 00:44:13,270 --> 00:44:17,490 na lokaciji i uporabi te številske naslove in to zvezdicami operaterja, 694 00:44:17,490 --> 00:44:20,470 vendar odkrito povedano, to je samo toliko čistejši. Torej, to ni slabo. 695 00:44:20,470 --> 00:44:26,720 Ni razloga za ustavitev dela linijo 27 tukaj, ampak 26 je funkcionalno enaka, 696 00:44:26,720 --> 00:44:31,570 in to je funkcionalno enaka natanko razlogov, ki smo jih do sedaj razpravljamo. 697 00:44:31,570 --> 00:44:33,650 In nenazadnje, 29 je le dobra praksa. 698 00:44:33,650 --> 00:44:38,420 Klicanje brez-ih pomeni, da zdaj ti vrača spomin, ki ti je dal GetString 699 00:44:38,420 --> 00:44:41,630 ker še enkrat, kot sem že omenil v ponedeljek, GetString tedne 700 00:44:41,630 --> 00:44:44,180 je bila uvedba napako v kodi. 701 00:44:44,180 --> 00:44:46,490 Vaša koda za tedne je imel spomin razpoka 702 00:44:46,490 --> 00:44:49,970 , s katerim ste se sprašuje GetString za spomin, vendar še nikoli niste bili jo vrniti. 703 00:44:49,970 --> 00:44:53,410 In da je bil namerno izbrali mi pedagoško 704 00:44:53,410 --> 00:44:55,880 ker je le preveč razmišljati že na začetku. 705 00:44:55,880 --> 00:44:57,710 Sedaj pa potrebujemo več simetrije. 706 00:44:57,710 --> 00:45:00,830 Če vprašate računalnik za spomin, kot je to veljalo za GetString, 707 00:45:00,830 --> 00:45:02,820 kot je v primeru očitno za knjižnične funkcije malloc, 708 00:45:02,820 --> 00:45:07,970 morate zdaj pset 4 naprej tudi brez takšen spomin. 709 00:45:07,970 --> 00:45:11,650 Obvestilo je drugačen od rekel int n. 710 00:45:11,650 --> 00:45:15,040 Ni vam treba sprostiti, ker nisi poklical GetString 711 00:45:15,040 --> 00:45:16,890 in nisi poklical malloc. 712 00:45:16,890 --> 00:45:20,610 >> In tudi če si klical GetInt kot bomo sčasoma videli, 713 00:45:20,610 --> 00:45:25,520 GetInt ne dodeljuje pomnilnik za vas, saj lahko dejansko prenesti okoli celih 714 00:45:25,520 --> 00:45:29,430 in plava in nabora znakov samo način smo počeli že več tednov. 715 00:45:29,430 --> 00:45:33,960 Strune, čeprav so nekaj posebnega, saj res oni podaljšek več znakov. 716 00:45:33,960 --> 00:45:37,450 Torej, oni so samo drugačna od znakov in plovcev in ints in podobno. 717 00:45:37,450 --> 00:45:39,980 Ampak bomo prišli nazaj, da kmalu. 718 00:45:39,980 --> 00:45:44,920 Vsa vprašanja v zvezi s tem potem začetku kazalcev? Ja. 719 00:45:44,920 --> 00:45:49,690 [Neslišno študentski vprašanje] 720 00:45:49,690 --> 00:45:51,440 Ah, zelo dobro vprašanje. 721 00:45:51,440 --> 00:45:55,790 Ena izmed redkih stvari, C, v resnici počne, za vas, ki je priročno, 722 00:45:55,790 --> 00:46:00,110 Številke je za vas kakšne velikosti je podatkovni tip 723 00:46:00,110 --> 00:46:03,060 nato pa, da je vrsta razmnoževanja za vas. 724 00:46:03,060 --> 00:46:06,610 To je pomembno v primeru znakov, saj je skoraj vedno znak je 1 bajt, 725 00:46:06,610 --> 00:46:08,150 tako da to preprosto deluje. 726 00:46:08,150 --> 00:46:11,220 Toda zaradi razprave, če bi dejansko tiskanje števil 727 00:46:11,220 --> 00:46:15,500 in ti so poskušali natisniti nekaj je vrednost, ki je kazal na celo število 728 00:46:15,500 --> 00:46:20,720 se prav tako ne bi bilo treba storiti + 4 * i samo zato, ker int je 4 bajte. 729 00:46:20,720 --> 00:46:25,780 Kazalec Aritmetična pomeni, da prevajalnik C in storiti vse, da se matematika za vas. 730 00:46:25,780 --> 00:46:29,190 Vse, kar morate skrbeti je štetje v nekakšno človeškem smislu. Ja. 731 00:46:29,190 --> 00:46:35,200 [Študent] Če ugotovi niz notranjost za zanke, imaš, da ga osvobodi kasneje? 732 00:46:35,200 --> 00:46:36,760 Dobro vprašanje. 733 00:46:36,760 --> 00:46:41,390 >> Če ste prijavljeni niz notranjost za zanke, se boste morali sprostiti kasneje? 734 00:46:41,390 --> 00:46:47,520 Morate le, da sprostite pomnilnik, ki ga dodeli z GetString ali knjižnične funkcije malloc. 735 00:46:47,520 --> 00:46:53,110 Torej, če si rekel kaj takega - naj povem zavitih oklepajih zdaj tako povezan vse kode. 736 00:46:53,110 --> 00:46:58,580 Če si naredil nekaj, čeprav je buggily, kot je ta, char * t = y, 737 00:46:58,580 --> 00:47:03,450 vam ni potrebno, ker brez t t ne vključuje nobene omembe knjižnične funkcije malloc ali GetString. 738 00:47:03,450 --> 00:47:08,960 Če, nasprotno, da si to, GetString, potem je odgovor pritrdilen, bi morali brez t. 739 00:47:08,960 --> 00:47:14,350 In v resnici, tvoja edina priložnost, da to, da je zdaj znotraj te zanke za isto vprašanje področja 740 00:47:14,350 --> 00:47:16,060 , ki smo jih obravnavali v preteklosti. 741 00:47:16,060 --> 00:47:18,830 V nasprotnem primeru bi se lahko dodeljevanje pomnilnika, dodeljevanje pomnilnika, dodeljevanje pomnilnika, 742 00:47:18,830 --> 00:47:21,230 in na koncu programa, ker ste izven te zanke, 743 00:47:21,230 --> 00:47:24,240 Ne, ne obstaja, ampak nikoli povedal operacijski sistem 744 00:47:24,240 --> 00:47:26,750 da vam ni treba, da je spomin več. 745 00:47:26,750 --> 00:47:30,430 In kmalu za pset 4 ali 5, vas bomo opremili s programom, imenovanim Valgrind, 746 00:47:30,430 --> 00:47:34,160 , ki je podoben duh v gdb, da je ni dobil nekoliko starodavnega vmesnik, 747 00:47:34,160 --> 00:47:35,750 ampak je njen namen v življenju je, da vam pomaga. 748 00:47:35,750 --> 00:47:39,380 In Valgrind je program, ki bo v prihodnosti iskati svoje programe 749 00:47:39,380 --> 00:47:42,550 išče spomin razpoka, bodisi od GetString ali malloc, 750 00:47:42,550 --> 00:47:47,800 ki jih bomo začeli uporabljati še toliko bolj, kot smo prenehali uporabljati CS50 knjižnice toliko. 751 00:47:47,800 --> 00:47:53,030 Končno smo zdaj nekako besedišča in vrsta duševnih modela v teoriji 752 00:47:53,030 --> 00:47:55,170 , s katerimi bi rešili ta zlomljeno program. 753 00:47:55,170 --> 00:47:59,410 >> Torej, v tem programu, lomljeni, swap deluje znotraj zamenjave, 754 00:47:59,410 --> 00:48:05,280 vendar dejansko nikoli ni delal v glavnem zato, ker glavna sprejet x in y, odpoklic, 755 00:48:05,280 --> 00:48:07,260 in so bili tisti, sprejet v vrednosti, ki jih, tako rekoč. 756 00:48:07,260 --> 00:48:09,330 Kopije njimi je bila dana, da bi zamenjali. 757 00:48:09,330 --> 00:48:12,520 Do konca zamenjave, je bilo res in b izmenjanih 758 00:48:12,520 --> 00:48:16,120 seveda pa je x in y, kot smo razpravljali v ponedeljek, ni bilo. 759 00:48:16,120 --> 00:48:19,940 Torej, jaz predlagam v zeleni tukaj, da je to pravzaprav rešitev tukaj. 760 00:48:19,940 --> 00:48:22,640 In dejansko, mi premakniti moje zvezde, samo da je v skladu 761 00:48:22,640 --> 00:48:24,440 čeprav, spet, funkcionalno to ni važno. 762 00:48:24,440 --> 00:48:28,730 V prihodnjih tednih bomo razložili, kdaj in zakaj je ne zadeva. 763 00:48:28,730 --> 00:48:30,600 Torej, v zeleni barvi, zdaj je rešitev. 764 00:48:30,600 --> 00:48:33,700 Odkrito povedano, je videti cel kup umazani, ker imam vse te zvezde. 765 00:48:33,700 --> 00:48:35,380 Naj opozoriti na eno stvar. 766 00:48:35,380 --> 00:48:40,040 V zgornji vrstici tukaj, kjer piše int * int * in b 767 00:48:40,040 --> 00:48:42,820 je v osnovi počne isto stvar, kot je vedno. 768 00:48:42,820 --> 00:48:47,070 To je razglasila 2 argumentov ali parametrov, da bi zamenjali, 769 00:48:47,070 --> 00:48:49,940 prvi, ki je int kazalec pozval, 770 00:48:49,940 --> 00:48:53,100 2. ki je int kazalec imenovano b. 771 00:48:53,100 --> 00:48:55,770 Edina stvar, ki je nova v tem trenutku, je dejstvo, da je zvezda tam. 772 00:48:55,770 --> 00:48:59,340 >> Kaj to pomeni? Ni int b ni int. 773 00:48:59,340 --> 00:49:04,100 Je naslov notr in b je naslov drugega notr. 774 00:49:04,100 --> 00:49:06,980 Tukaj, to je, če priznam, C postane zmedeno. 775 00:49:06,980 --> 00:49:09,790 Zdaj smo z zvezdo, vendar ima drugačen pomen v tem kontekstu. 776 00:49:09,790 --> 00:49:13,150 Ker nismo razglasitvi kazalce, kot smo tukaj, 777 00:49:13,150 --> 00:49:15,500 Tukaj smo Dereferenciranje stvari. 778 00:49:15,500 --> 00:49:21,520 Torej, tehnično, je zvezda v tem okviru prvega, drugi in tretji liniji notranjost zamenjave 779 00:49:21,520 --> 00:49:24,560 se dereference subjekta, ki pomeni le tja. 780 00:49:24,560 --> 00:49:27,400 Torej, tako kot moj prst slediti puščico na uro, 781 00:49:27,400 --> 00:49:31,100 * Sredstvo pojdi na ta naslov in mi najdi int, da je tam. 782 00:49:31,100 --> 00:49:34,250 * B pomeni, pojdite na naslov in mimo mene, kaj je tam. 783 00:49:34,250 --> 00:49:40,730 Torej izvlečete slike iz ponedeljek zdaj uporabljajo sveženj okvirjev, 784 00:49:40,730 --> 00:49:43,130 dno od katerih se bo glavni, 785 00:49:43,130 --> 00:49:47,600 zgornja od katerih se bo zamenjave, 786 00:49:47,600 --> 00:49:50,880 tako da je naš svet je videti, tako kot v ponedeljek, kot je ta. 787 00:49:50,880 --> 00:49:53,620 Tukaj je kos pomnilnika, glavna bo uporabil. 788 00:49:53,620 --> 00:49:56,520 >> Spomnimo se, da je od ponedeljka program, samo je 2 spremenljivk, 789 00:49:56,520 --> 00:50:01,930 ena se imenuje x in y 1, imenovan, in sem dal številke od 1 in 2 obstaja. 790 00:50:01,930 --> 00:50:06,580 Zdaj, ko sem poklical zamenjati, kot sem storil v ponedeljek, 791 00:50:06,580 --> 00:50:11,000 prej, ko sem uporabil rdečo različico tega programa, ki izgleda tako, 792 00:50:11,000 --> 00:50:17,470 Imam 2 parametrov, A in B, in kaj pišemo tukaj in tukaj? 793 00:50:17,470 --> 00:50:21,160 Samo 1 in 2, dobesedno kopije x in y. 794 00:50:21,160 --> 00:50:23,070 Danes spremeniti. 795 00:50:23,070 --> 00:50:28,510 Danes namesto potujejo ints in b bomo mimo v 2 naslovov. 796 00:50:28,510 --> 00:50:34,290 Ti naslovi se zgodi, da kaže na ints, vendar ti naslovi niso sami ints. 797 00:50:34,290 --> 00:50:37,330 So naslovi. To je kot poštni naslov namesto tega. 798 00:50:37,330 --> 00:50:40,580 Torej, zdaj moramo samo dam malo več podrobnosti na zaslonu. 799 00:50:40,580 --> 00:50:43,250 To je moj računalnik spomin, kot je bilo ves dan. 800 00:50:43,250 --> 00:50:45,120 Zdaj moramo nekaj samovoljno oštevilčenja sistema. 801 00:50:45,120 --> 00:50:50,580 Torej, kaj je pravkar rekel, samo po naključju, da je to pomnilniški naslov, 123, 124. 802 00:50:50,580 --> 00:50:55,660 Recimo, da je to 125, to je 126, in tako naprej, ampak to je povsem samovoljno. 803 00:50:55,660 --> 00:50:58,590 Potrebujemo samo nekaj številk shemo v mojem spominu. 804 00:50:58,590 --> 00:51:04,030 Torej, zdaj, ko sem dejansko preide v X in Y, ne bom, da preide v x in y; 805 00:51:04,030 --> 00:51:08,400 Grem mimo v poštnem naslovu, tako rekoč od x in y 806 00:51:08,400 --> 00:51:11,870 tako da to, kar se shrani tukaj in tukaj ni 1 in 2, 807 00:51:11,870 --> 00:51:16,030 če pa si lahko ogledate mojo majhno besedilo, dobi tisto, kar sprejet v tukaj in tukaj? 808 00:51:16,030 --> 00:51:23,340 [Neslišno študentski odziv] >> Točno tako. 123 gets tukaj in 124 dal postaviti dobi tukaj. 809 00:51:23,340 --> 00:51:28,910 >> Zdaj, ker sem uporabil zvezdo v tem zelo prvi način zasedba tukaj na vrhu, 810 00:51:28,910 --> 00:51:34,340 moj program samo ve, da je 123 in 124, čeprav je to seveda cela 811 00:51:34,340 --> 00:51:40,160 da bi vsak človek opazil, jih je treba razlagati tako, da naslove, numerične naslove. 812 00:51:40,160 --> 00:51:43,250 Niso same po sebi ints, oni so naslovi, 813 00:51:43,250 --> 00:51:46,120 in to zato, ker sem eksplicitno zvezde tam. 814 00:51:46,120 --> 00:51:51,360 Torej, zdaj v svojem prvem, drugi in tretji vrsti dejanske kode Kaj se dogaja tukaj? 815 00:51:51,360 --> 00:51:53,380 Naj pripravijo ostale slike. 816 00:51:53,380 --> 00:51:56,980 NTU je tako kot je bilo v ponedeljek. Nič posebnega tmp. 817 00:51:56,980 --> 00:52:03,060 To je samo lokalna spremenljivka 32 bitov, in notranjost, da sem očitno shranjevanje vrednosti *. 818 00:52:03,060 --> 00:52:08,580 Zdaj, če sem rekel tmp =, kaj bi jaz dal tukaj? >> [Študent] 123. 819 00:52:08,580 --> 00:52:10,370 123. Ampak to ni tisto, kar počnem. 820 00:52:10,370 --> 00:52:13,670 Pravim tmp = *. Star način tja. 821 00:52:13,670 --> 00:52:19,370 Torej, tukaj je, 123. Kako do tja? Pretvarjaj se, kot da je puščica. 822 00:52:19,370 --> 00:52:24,460 No, to je to, 1. Torej, kaj gets shranjeni v tmp, očitno? Samo 1. 823 00:52:24,460 --> 00:52:29,620 Torej, z drugimi besedami, je tmp * a *, sredstvo pojdite na naslov, ki je trenutno v, 824 00:52:29,620 --> 00:52:31,320 ki je očitno 123. 825 00:52:31,320 --> 00:52:33,910 >> V redu, tukaj smo na lokaciji 123, vidim številko 1 826 00:52:33,910 --> 00:52:35,670 tako da bom dal številko 1 tam. 827 00:52:35,670 --> 00:52:39,020 No, kaj naj storim v vrstici 2 * = * b? 828 00:52:39,020 --> 00:52:44,570 Tole je malo bolj vključeni, ker, kaj je zdaj? To je 123. 829 00:52:44,570 --> 00:52:50,220 Tako * je kje? Točno tam, kjer sem bil prej. Torej pojdi tja. Ok. 830 00:52:50,220 --> 00:52:53,420 Zdaj, na koncu in se na koncu bo to začelo smisla, upajmo, 831 00:52:53,420 --> 00:53:00,280 * B pomeni, kaj je v B? 124. Torej moram iti tja, kar je 2. 832 00:53:00,280 --> 00:53:03,430 Torej, kaj sem dal kam? 833 00:53:03,430 --> 00:53:10,100 2 gre v tem mestu, ker * b * gre v. Torej bom naredil. 834 00:53:10,100 --> 00:53:13,120 In lahko že videli, morda, da smo toliko bolj 835 00:53:13,120 --> 00:53:17,710 k reševanju tega neumnega, preprost problem pravilno prvič 836 00:53:17,710 --> 00:53:20,920 ker zdaj imamo še vedno spominjam, kaj je bilo x, 837 00:53:20,920 --> 00:53:23,230 imamo 2 kopije, priznam, y, 838 00:53:23,230 --> 00:53:25,850 ampak vrstica 3 zdaj pravi * b. 839 00:53:25,850 --> 00:53:31,080 Torej, tukaj je b. * B sredstvo tja. Torej, kje je lokacija 124? 840 00:53:31,080 --> 00:53:35,560 To je pravzaprav tu. Torej, kaj sem dal tu? Očitno je, da tmp. 841 00:53:35,560 --> 00:53:39,600 Zdaj sem to storiti. Torej imam tukaj in 1 2 tukaj. 842 00:53:39,600 --> 00:53:43,560 In kaj o vsem tem, je 123, je 124 in 1? 843 00:53:43,560 --> 00:53:47,910 Takoj po zamenjavi donosov, ta spomin je tako dober, kot izgubljeno 844 00:53:47,910 --> 00:53:51,070 ker kakor hitro zamenljivih vračanja, operacijski sistem 845 00:53:51,070 --> 00:53:54,190 je prost za uporabo tega spomina tudi v prihodnje. 846 00:53:54,190 --> 00:53:58,870 Samo spomin je glavni na dnu tega ti dimnika palice okoli. 847 00:53:58,870 --> 00:54:01,470 >> In tako smo zdaj končno delujočo različico. 848 00:54:01,470 --> 00:54:06,310 Naj gredo v swap.c in opazili naslednje. 849 00:54:06,310 --> 00:54:11,280 Na vrhu programa sem spremenil moj prototip za int * int * in b. 850 00:54:11,280 --> 00:54:15,000 Torej, edina stvar, ki sem spremenila, da gredo iz rdečega, ki je bila slaba, zeleno, kar je dobro, 851 00:54:15,000 --> 00:54:17,350 Dodal sem se te zvezde danes. 852 00:54:17,350 --> 00:54:21,520 Ampak potem sem dol v sam zamenjal sem moral kopirati, prilepiti, kar je bilo ravno na diapozitivu. 853 00:54:21,520 --> 00:54:24,140 Imam zvezdo tukaj, tukaj zvezda - ki se ujema prototip - 854 00:54:24,140 --> 00:54:27,930 in potem vse te stvari zdaj zvezde, razen tmp 855 00:54:27,930 --> 00:54:30,680 ker uporaba začasne spremenljivke, ni nič novega. 856 00:54:30,680 --> 00:54:33,040 Potrebujem samo začasno skladiščenje za notr. 857 00:54:33,040 --> 00:54:34,820 Torej ne potrebujemo zvezdo tam. 858 00:54:34,820 --> 00:54:39,310 Potrebujemo samo zvezdo, tako da bomo lahko čez te vrste samovoljno meje 859 00:54:39,310 --> 00:54:42,900 med temi 2 posnetkov v spomin mojega računalnika. 860 00:54:42,900 --> 00:54:45,630 Ampak ena stvar je treba spremeniti, in ti so morda zagledali že. 861 00:54:45,630 --> 00:54:48,810 Kakšna druga vrstica je očitno zdaj drugače? >> [Študent] in x. 862 00:54:48,810 --> 00:54:53,270 >> Ja, 25 je zadnja vrstica kode moram spremeniti, za to delo. 863 00:54:53,270 --> 00:54:58,360 Pred tednom dni in še v ponedeljek, linija 25 izgledala tako, zamenjajte X in Y, 864 00:54:58,360 --> 00:55:02,020 in je bil to samo zato, ker pokvarjen, če boste rekli swap (x, y) 865 00:55:02,020 --> 00:55:05,660 dajete kopije x in y, da bi zamenjali, potem počne svoje stvari, 866 00:55:05,660 --> 00:55:09,080 vendar si ni nikoli dejansko spreminja x in y sam. 867 00:55:09,080 --> 00:55:12,880 Torej, tudi če še niste videli ta znak pred s Znak za v kodo, 868 00:55:12,880 --> 00:55:15,860 vzemite odgovor. Kaj Znak za to očitno? 869 00:55:15,860 --> 00:55:17,890 [Študent] meni naslov. >> Meni naslov. 870 00:55:17,890 --> 00:55:21,160 Torej, znak pove, je rekel, da mi naslov x. 871 00:55:21,160 --> 00:55:25,590 Kdo ve, kje je? To se zgodi, da bo 123. Me ne zanima. Daj mi naslov x. 872 00:55:25,590 --> 00:55:28,340 & Y pomeni, da mi naslov y. 873 00:55:28,340 --> 00:55:34,450 In na tej točki se zgodba je popolnoma v skladu s sliko smo narisal pred nekaj trenutki. 874 00:55:34,450 --> 00:55:38,310 >> Torej bom priznam kazalci, seveda za mene, ko sem začel učenje tega, 875 00:55:38,310 --> 00:55:40,570 so zagotovo ena izmed najtežjih stvari za zavijanje okoli moje misli. 876 00:55:40,570 --> 00:55:43,760 Toda zavedati, še posebej, ko smo igrali z tovrstnimi stvarmi, 877 00:55:43,760 --> 00:55:48,030 če ga razčleniti na ti super enostavno nekakšno intelektualno nezanimiva težave 878 00:55:48,030 --> 00:55:52,270 za malo gibljejo okoli številke, odgovor na veliko zmede s kazalci 879 00:55:52,270 --> 00:55:56,590 Res je mogoče izpeljati iz teh zelo osnovne mehanike. 880 00:55:56,590 --> 00:55:59,070 Tukaj je naslov. Pojdi tja z zvezdico. 881 00:55:59,070 --> 00:56:03,830 Ali obratno, tukaj je znak pove. Ugotoviti, kaj je pravzaprav naslov. 882 00:56:03,830 --> 00:56:06,270 V redu. 883 00:56:06,270 --> 00:56:09,000 Torej, če je vse to prihaja iz spomina? 884 00:56:09,000 --> 00:56:12,360 Mi smo sestavljeni to sliko nekaj časa, in jaz vztrajati obeta se bomo vrnili k njim, 885 00:56:12,360 --> 00:56:14,920 ampak tu je zastopanje spomin računalnika 886 00:56:14,920 --> 00:56:17,420 To je malo več označen kot naš tablo tukaj. 887 00:56:17,420 --> 00:56:21,590 Besedilo odsek na vrhu predstavlja, kaj v zvezi s svojim programom? 888 00:56:21,590 --> 00:56:26,090 [Neslišno študentski odziv] >> Oprosti? Ponovi. 889 00:56:26,090 --> 00:56:28,660 [Študent] pravi program. >> Dejanski program. 890 00:56:28,660 --> 00:56:32,430 >> Torej 0s in 1s, da ste pripravljeni po pisanju C kodo in nato teče Jek 891 00:56:32,430 --> 00:56:35,910 in pridobivanje ustvarjanje 0s in 1s do konca pritegnjen je v spomin 892 00:56:35,910 --> 00:56:38,570 ker ko boste dvakrat kliknite na ikono na vašem Mac ali PC 893 00:56:38,570 --> 00:56:43,010 ali pa zaženite ukaz kot Mario na vaš poziv, vaš 0s in 1s iz diska 894 00:56:43,010 --> 00:56:45,700 se naloži v pomnilnik, tako da lahko računalnik njimi manipulirajo 895 00:56:45,700 --> 00:56:47,540 in jih izvaja hitreje. 896 00:56:47,540 --> 00:56:50,880 Torej initialized podatkov in nezaceto podatkov ne bomo veliko govorili o tistih, 897 00:56:50,880 --> 00:56:52,420 ampak to so samo globalne spremenljivke. 898 00:56:52,420 --> 00:56:54,710 Inicializiran pomeni globalnih spremenljivk, ki jih je dal vrednosti; 899 00:56:54,710 --> 00:56:59,300 nezaceto pomeni globalnih spremenljivk, ki jih še ni dala vrednosti. 900 00:56:59,300 --> 00:57:01,900 Potem je tu še ti spremenljivke okolja, ki bom popolnoma Wave roko na, 901 00:57:01,900 --> 00:57:04,860 vendar so tam in da shranjuje stvari, kot so vaše uporabniško ime 902 00:57:04,860 --> 00:57:08,090 in druga vrsta manjših podrobnostih ravni. 903 00:57:08,090 --> 00:57:12,880 Toda juiciest kosov postavitev tvoj spomin je ta stvar imenovano kup in kup. 904 00:57:12,880 --> 00:57:17,470 Kup še enkrat, mora biti jasno, je spomin, ki je uporabljena, kadar se imenujejo funkcije, 905 00:57:17,470 --> 00:57:19,710 ko so lokalne spremenljivke 906 00:57:19,710 --> 00:57:22,120 in vedno, kadar obstajajo parametri kroži. 907 00:57:22,120 --> 00:57:24,490 Vse to se dogaja v sklad. 908 00:57:24,490 --> 00:57:29,570 Kup nismo govorili, pa predvidevate, ki uporablja kup. 909 00:57:31,120 --> 00:57:32,690 Samo drug kos pomnilnika. 910 00:57:32,690 --> 00:57:36,620 To se zgodi, da se potegne na vrhu, toda to je poljubno slikovno konvencije. 911 00:57:36,620 --> 00:57:41,670 Kdo je bil očitno uporablja pomnilnik iz kup tedne? 912 00:57:41,670 --> 00:57:44,830 To je tehnično ti pa posredno. >> [Študent] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString in malloc. Torej, tukaj je bistvena razlika. 914 00:57:47,950 --> 00:57:51,300 >> Veš, v zadnjih nekaj tednih, če potrebujete spomin, samo ugotovi spremenljivko. 915 00:57:51,300 --> 00:57:54,560 Če potrebujete veliko pomnilnika, razglasi niz pravice znotraj svojega delovanja. 916 00:57:54,560 --> 00:57:59,620 Ampak problem, ki smo jih hrani sooča je, če ugotovi, spremenljivke lokalno znotraj funkcije, 917 00:57:59,620 --> 00:58:05,340 takoj, ko se vrne, kaj se dogaja v spominu in teh spremenljivk? 918 00:58:05,340 --> 00:58:09,620 Samo ena vrsta ni več tvoja, kajne? To je preprosto izginil nekako konceptualno. 919 00:58:09,620 --> 00:58:13,950 To je še vedno fizično obstaja, seveda, ampak to ni več vaša pravica za uporabo. 920 00:58:13,950 --> 00:58:17,160 To je seveda problematično, če želite napisati funkcij v življenju 921 00:58:17,160 --> 00:58:20,440 ki dejansko dodeliti pomnilnika in je ne dam nazaj takoj. 922 00:58:20,440 --> 00:58:24,180 Zadeva točke: Namen GetString v življenju je, da nimam pojma, vnaprej 923 00:58:24,180 --> 00:58:26,390 kako velik niz jo bom s tipom na tipkovnici, 924 00:58:26,390 --> 00:58:30,390 vendar je dobil, da bi lahko dodelitev pomnilnika, da imajo Davida ali hello 925 00:58:30,390 --> 00:58:32,860 ali celo naloga, da bi lahko uporabnik vtipka 926 00:58:32,860 --> 00:58:35,280 Torej GetString je bil z malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc Zato je treba uporabo ne sveženj; 928 00:58:38,910 --> 00:58:40,770 namesto tega pa se je s to stvarjo, imenovano kup. 929 00:58:40,770 --> 00:58:44,430 Nič ni drugačnega pomnilnika. To ni hitreje ali počasneje ali kaj podobnega. 930 00:58:44,430 --> 00:58:46,570 To je samo fizično na drugi lokaciji. 931 00:58:46,570 --> 00:58:50,120 >> Toda pravilo je, da je spomin, ki je razdeljena na kupu 932 00:58:50,120 --> 00:58:56,180 nikoli ne bomo vzeli od vas, dokler ne boste klic - predvidevate - brezplačno. 933 00:58:56,180 --> 00:59:00,510 Nasprotno, vsak spomin prosite za na kup le za razglasitev niz 934 00:59:00,510 --> 00:59:03,320 ali razglasitvi spremenljivke, kot smo počeli nekaj tednov, 935 00:59:03,320 --> 00:59:05,640 da privzeto konča na kupu. 936 00:59:05,640 --> 00:59:09,550 In to tovarna velik 90% časa, ampak na tiste redke priložnosti 937 00:59:09,550 --> 00:59:12,470 če želite dodeliti pomnilnika in ga hranite v okolici, 938 00:59:12,470 --> 00:59:14,730 potem boste morali uporabiti funkcijo kot knjižnične funkcije malloc. 939 00:59:14,730 --> 00:59:19,370 Ali smo uporabili funkcijo kot GetString, ki spet uporablja malloc. 940 00:59:19,370 --> 00:59:23,300 Poglejmo, če bi to lahko pokvari in nato pokukati na Binky. 941 00:59:23,300 --> 00:59:25,820 Pridemo nazaj, da tudi v prihodnje. 942 00:59:25,820 --> 00:59:29,270 Tukaj je super preprost program, ki je v prvih 2 vrstic, kaj? 943 00:59:29,270 --> 00:59:33,460 V angleščini, kaj pa ti prvi 2 vrstic kode narediti znotraj main? 944 00:59:33,460 --> 00:59:35,600 [Neslišno študentski odziv] 945 00:59:35,600 --> 00:59:37,880 Previdno. Ne daj mi naslov x ali y. 946 00:59:37,880 --> 00:59:41,840 [Študent] daje napotke za ints. Dobro >>. Daj mi 2 napotke na cela števila. 947 00:59:41,840 --> 00:59:45,130 Z drugimi besedami, daj mi 2 kose pomnilnika, da sem danes vodijo risbo, 948 00:59:45,130 --> 00:59:46,950 čeprav sem ga izbrisali zdaj, ko kvadratov. 949 00:59:46,950 --> 00:59:50,000 Dajte mi 2 kose pomnilnika, 1 x pozval, ena imenovana y - 950 00:59:50,000 --> 00:59:54,320 Poklical sem jih prej s in t - in kaj je tip ta kos pomnilnika? 951 00:59:54,320 --> 00:59:57,160 To se dogaja, da shranite naslov. 952 00:59:57,160 --> 00:59:59,110 To je tipa int *. 953 00:59:59,110 --> 01:00:01,630 >> Tako bo naslov notr na koncu živeli v x, 954 01:00:01,630 --> 01:00:03,860 naslov notr bo na koncu živeli v y, 955 01:00:03,860 --> 01:00:08,460 ampak najprej, kaj je notri x in y? Kdo ve? Garbage vrednosti. 956 01:00:08,460 --> 01:00:10,180 To nima nič opraviti s kazalci. 957 01:00:10,180 --> 01:00:12,720 Če nismo dal nekaj, kdo ve, kaj se je dejansko tam? 958 01:00:12,720 --> 01:00:18,950 Zdaj x. Kaj se dogaja tukaj? To je zakonit zdaj, ker je x kazalec. To je int *. 959 01:00:18,950 --> 01:00:21,870 Torej to pomeni, da bom lahko dal v x naslov neke kos pomnilnika. 960 01:00:21,870 --> 01:00:25,120 Kaj malloc vrne? Odlično, se vrne naslove, 961 01:00:25,120 --> 01:00:28,510 naslov prvega bajta v celoti kos pomnilnika. 962 01:00:28,510 --> 01:00:31,140 Koliko zlogov je to očitno razporeditev, na primer v napravo? 963 01:00:31,140 --> 01:00:33,510 Kakšna je velikost notr? 4. 964 01:00:33,510 --> 01:00:36,600 Če menite, da nazaj v 1 tednu, to ni zelo pomembno, da se vedno spomnim, da 965 01:00:36,600 --> 01:00:38,870 vendar v tem primeru je koristno vedeti, 4 bajte. 966 01:00:38,870 --> 01:00:41,770 Torej, to je dodeljevanje na kup 4 bajte 967 01:00:41,770 --> 01:00:46,110 in to je vračanje naslov prvega do mene samovoljno. 968 01:00:46,110 --> 01:00:47,700 Zdaj, kaj je x delaš? 969 01:00:47,700 --> 01:00:52,200 * X = 42 počne kaj? 970 01:00:52,200 --> 01:00:57,150 Če na tej točki v zgodbi imamo x, ki je videti takole z nekaj smeti vrednosti, 971 01:00:57,150 --> 01:01:04,120 to je zdaj y z nekaj smeti vrednosti, ki je zdaj v 3. vrstici sem dodeljena 4 bajte. 972 01:01:04,120 --> 01:01:06,950 Ta slika bistvu izgleda tako. 973 01:01:06,950 --> 01:01:12,010 Ali natančneje, če je to samovoljno naslov 123, to je tisto, kar naša zgodba sedaj izgleda. 974 01:01:12,010 --> 01:01:23,940 * X = 42 zdaj pomeni kaj? To pomeni, da gredo na naslovu 123, in to število 42 tam. 975 01:01:23,940 --> 01:01:26,220 Ne rabim, da pripravi te vrstice, ker mi ne gre niti. 976 01:01:26,220 --> 01:01:29,480 >> Moral bi samo napisal takole, in samo zaradi demonstracijskega je, 977 01:01:29,480 --> 01:01:33,240 42 kot int vrste zavzema veliko prostora, 4 bajte. 978 01:01:33,240 --> 01:01:35,960 Tako da je tisto, kar se je zgodilo, vendar pa je problem zdaj. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Kaj se bo zgodilo tukaj? 980 01:01:40,580 --> 01:01:46,470 Problem je * y v našem svetu poenostavljeno pomeni samo, pojdite na naslov v y. 981 01:01:46,470 --> 01:01:48,590 Kaj je v y? To je nekaj smeti vrednost. 982 01:01:48,590 --> 01:01:53,150 Torej, kaj je domnevati, da smeti vrednost je 5551212, nekaj noro všeč. 983 01:01:53,150 --> 01:01:56,750 * Y sredstva šla za reševanje 5551212. 984 01:01:56,750 --> 01:02:00,450 To je všeč tukaj. To ne obstaja, na primer. 985 01:02:00,450 --> 01:02:05,310 Tako * y dobi 13 pomeni, da sem poskušal oblikovati 13 tukaj. To ne obstaja. 986 01:02:05,310 --> 01:02:08,790 Sem presegla segment tabli. Kaj dobim? 987 01:02:08,790 --> 01:02:14,930 To skrivnostno sporočilo segmentacije krivda, ker sem poskušal dati v spomin 988 01:02:14,930 --> 01:02:19,470 vrednost kot 13 na mestu, ki ne obstaja. 989 01:02:19,470 --> 01:02:23,900 Preostali del programa bo delovalo v redu, ampak do takrat pa ne. 990 01:02:23,900 --> 01:02:25,350 Torej, kaj je poskušal povedati to zgodbo. 991 01:02:25,350 --> 01:02:27,830 Vrnili se bomo v tem, ko smo govorili o hex. 992 01:02:27,830 --> 01:02:30,290 Vrnimo se k temu, in sklene s to stvarjo, imenovano Binky, 993 01:02:30,290 --> 01:02:33,710 ki odpoklic je profesor na Stanfordu sedel doma igrajo z claymation, 994 01:02:33,710 --> 01:02:36,380 povedati zgodbo o povsem isti program. 995 01:02:36,380 --> 01:02:40,580 To je le približno 3 minut. Tukaj imamo Binky. 996 01:02:40,580 --> 01:02:45,030 [Moški govornik na videu] Hej Binky, zbudi se. Čas je za zabavo kazalca. 997 01:02:45,030 --> 01:02:50,080 [Binky] Kaj je to? Več o kazalci? Oh, vrlina! 998 01:02:50,080 --> 01:02:53,700 [Moški govorec] No, za začetek, mislim, da bomo potrebovali nekaj nasvetov. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Ok. Ta koda razdeli 2 kazalce, ki lahko opozorijo na cela števila. 1000 01:02:57,890 --> 01:03:02,220 [Moški govorec] Ok. No, vidim 2 kazalci, vendar se ne zdi, da je treba poudariti, da nič. 1001 01:03:02,220 --> 01:03:05,550 [Binky] Tako je prav. Sprva kazalci ne kažejo ničesar. 1002 01:03:05,550 --> 01:03:09,270 Stvari, ki jih kažejo, da so ti pointees in njihovo vzpostavitvijo, je ločen korak. 1003 01:03:09,270 --> 01:03:12,330 [Moški govorec] Oh, v redu, v redu. Vedel sem, da je. V pointees sta ločena. 1004 01:03:12,330 --> 01:03:15,630 Hm, tako da kako dodeliti pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Ok. Ta koda dodeli novo celo število pointee, in ta del določa x opozoriti na to. 1006 01:03:21,510 --> 01:03:23,500 [Moški govorec] Ej, to izgleda bolje. 1007 01:03:23,500 --> 01:03:26,030 Zato bi bilo nekaj narediti. >> [Binky] Ok. 1008 01:03:26,030 --> 01:03:30,300 Jaz bom dereference kazalca x shranite številko 42 v svojem pointee. 1009 01:03:30,300 --> 01:03:34,410 Za ta trik bom potreboval mojo čarobno palico Dereferenciranje. 1010 01:03:34,410 --> 01:03:38,610 [Moški govorec] Vaš čarobno palico za Dereferenciranje? To je super. 1011 01:03:38,610 --> 01:03:44,230 [Binky] To je tisto, kar koda izgleda. Jaz bom ustanovil številko in ... [Živahen zvok] 1012 01:03:44,230 --> 01:03:46,100 [Moški govorec] Hej, poglej, tam gre. 1013 01:03:46,100 --> 01:03:50,990 Tako početje dereference na naslednji način x arrow dostop do svojega pointee, 1014 01:03:50,990 --> 01:03:53,230 v tem primeru za shranjevanje 42 tam. 1015 01:03:53,230 --> 01:03:57,630 Hej, poskusite z uporabo shranite številko 13 po drugi kazalec, y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Ok. Jaz bom šel tja do y in dobil številko 13, ustanovljen 1017 01:04:03,250 --> 01:04:08,360 in nato z palico Dereferenciranje in ... [Brenčanje zvok] Vau! 1018 01:04:08,360 --> 01:04:10,980 [Moški govorec] Oh, hej, to ni delovalo. 1019 01:04:10,980 --> 01:04:14,870 >> Recimo, Binky, jaz ne mislim, Dereferenciranje y je dobra ideja 1020 01:04:14,870 --> 01:04:17,880 ker vzpostavitev pointee je ločen korak 1021 01:04:17,880 --> 01:04:19,850 in jaz ne mislim, da smo ga sploh je. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hm, dobra točka. 1023 01:04:21,770 --> 01:04:26,640 [Moški govorec] Ja. Smo namenili kazalca y, vendar mi nikoli ne nastavite tako, da pokažete na pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, zelo pazljiv. 1025 01:04:28,780 --> 01:04:30,690 [Moški govorec] Hej, ti si videti dobro tam, Binky. 1026 01:04:30,690 --> 01:04:34,160 Ali lahko to popravimo tako, da y opozarja na istem pointee kot x? >> [Binky] Seveda. 1027 01:04:34,160 --> 01:04:37,100 Uporabil bom svojo čarobno palico naloge kazalca. 1028 01:04:37,100 --> 01:04:39,070 [Moški govorec] je, da bo problem, kot prej? 1029 01:04:39,070 --> 01:04:40,840 [Binky] No, to ne dotikajte pointees. 1030 01:04:40,840 --> 01:04:44,780 Prav tako se spreminja 1 kazalec, ki kaže na isto stvar kot drugi. [Živahen zvok] 1031 01:04:44,780 --> 01:04:48,570 [Moški govorec] Oh, vidim. Zdaj y opozarja na istem mestu kot x. 1032 01:04:48,570 --> 01:04:51,140 Torej, počakajte. Zdaj je določen y. Ima pointee. 1033 01:04:51,140 --> 01:04:54,520 Tako lahko poskusite palico Dereferenciranje ponovno poslati 13 več. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Uh, v redu. Tukaj gre. [Živahen zvok] 1035 01:04:58,130 --> 01:05:01,250 [Moški govorec] Hej, poglej si tole. Zdaj Dereferenciranje dela na y. 1036 01:05:01,250 --> 01:05:05,200 In ker so kazalci v skupni rabi, da je ena pointee, ki jih tako videli 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Ja, souporaba. Karkoli. 1038 01:05:06,910 --> 01:05:08,880 >> Torej bomo izbrati kraje zdaj? 1039 01:05:08,880 --> 01:05:11,420 [Moški govorec] Oh poglej, zmanjkalo nam je časa. >> [Binky] Ampak - 1040 01:05:11,420 --> 01:05:13,880 [Moški govorec] Samo spomnite 3 kazalec pravila. 1041 01:05:13,880 --> 01:05:18,630 Številka 1, osnovna struktura je, da imate kazalec, in poudarja več na pointee. 1042 01:05:18,630 --> 01:05:23,120 Toda kazalec in pointee ločena in pogosta napaka je, da se vzpostavi kazalec 1043 01:05:23,120 --> 01:05:25,680 ampak, da bi pozabili, da ga pointee. 1044 01:05:25,680 --> 01:05:29,580 Številka 2, kazalec Dereferenciranje začne s kazalcem in sledi svojemu puščico nad 1045 01:05:29,580 --> 01:05:31,060 dostop do svojega pointee. 1046 01:05:31,060 --> 01:05:34,340 Kot vsi vemo, je to deluje le, če je pointee, 1047 01:05:34,340 --> 01:05:36,460 katere vrste vrne odločiti številko 1. 1048 01:05:36,460 --> 01:05:39,870 Številka 3, kazalec naloga traja en kazalec in ga spremeni 1049 01:05:39,870 --> 01:05:42,390 točko na isti pointee kot drugi kazalec. 1050 01:05:42,390 --> 01:05:45,890 Torej, po prenosu, bodo kazalci kažejo na 2 iste pointee. 1051 01:05:45,890 --> 01:05:47,800 Včasih se to imenuje delitev. 1052 01:05:47,800 --> 01:05:50,910 >> In to je vse kar je z njo res. Adijo zdaj. 1053 01:05:50,910 --> 01:05:55,840 To je Binky. To je CS50. Vidimo se naslednji teden. [Aplavz] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]