1 00:00:00,000 --> 00:00:06,030 >> [Predvaja glasba] 2 00:00:06,030 --> 00:00:08,390 >> Doug LLOYD: ptičarji, tukaj smo. 3 00:00:08,390 --> 00:00:11,080 To je verjetno, da najtežje temo 4 00:00:11,080 --> 00:00:12,840 da govorimo o v CS50. 5 00:00:12,840 --> 00:00:15,060 In če ste prebrali kaj o kazalci 6 00:00:15,060 --> 00:00:19,080 preden vas bo morda malo zastrašujoče dogaja v tem videu. 7 00:00:19,080 --> 00:00:21,260 Res je, da kazalci Se vam omogočajo sposobnost 8 00:00:21,260 --> 00:00:23,740 da morda zajebal precej slabo, ko ste 9 00:00:23,740 --> 00:00:27,450 delo s spremenljivkami, in podatkov, in povzroča vaš program crash. 10 00:00:27,450 --> 00:00:30,490 Ampak oni so dejansko res uporabno in so nam res odličen način omogoči 11 00:00:30,490 --> 00:00:33,340 prenesti podatke nazaj in tja med funkcijami, 12 00:00:33,340 --> 00:00:35,490 da smo drugače ne more storiti. 13 00:00:35,490 --> 00:00:37,750 >> In kaj smo v resnici želite storiti, tukaj je vlak 14 00:00:37,750 --> 00:00:41,060 da imaš dober kazalec disciplino, tako da lahko učinkovito uporabljati kazalce 15 00:00:41,060 --> 00:00:43,850 da bo svoje programe, da je veliko bolje. 16 00:00:43,850 --> 00:00:48,220 Kot sem rekel kazalci nam drugačen način, da prenese podatke med funkcijami. 17 00:00:48,220 --> 00:00:50,270 Zdaj, če se spomnimo iz prejšnji video, ko 18 00:00:50,270 --> 00:00:53,720 smo govorili o spremenljivka področje, sem omenil 19 00:00:53,720 --> 00:01:00,610 da so vsi podatki, ki se peljemo med Funkcije v C je po vrednosti. 20 00:01:00,610 --> 00:01:03,070 In morda ne bom uporabil, da Izraz, kaj sem mislil tam 21 00:01:03,070 --> 00:01:07,170 je bila, da smo se mimo kopije podatkov. 22 00:01:07,170 --> 00:01:12,252 Ko se peljemo spremenljivko v funkciji smo dejansko ne gre za spremenljivko 23 00:01:12,252 --> 00:01:13,210 na funkcijo, kajne? 24 00:01:13,210 --> 00:01:17,670 Mi smo mimo kopijo da so podatki na funkcijo. 25 00:01:17,670 --> 00:01:20,760 Funkcija počne tisto, kar ga bo in izračunava nekaj vrednosti, 26 00:01:20,760 --> 00:01:23,180 in morda bomo uporabili, da je vrednost ko ga vrača. 27 00:01:23,180 --> 00:01:26,700 >> Tam je bila ena izjema to pravilo prenosa po vrednosti, 28 00:01:26,700 --> 00:01:31,210 in bomo prišli nazaj na tisto, ki je malo kasneje v tem videu. 29 00:01:31,210 --> 00:01:34,880 Če bomo namesto tega uporabiti kazalce z uporabo spremenljivk, 30 00:01:34,880 --> 00:01:38,180 ali namesto z uporabo spremenljivk sami ali kopije spremenljivk, 31 00:01:38,180 --> 00:01:43,790 bomo lahko sedaj mimo spremenljivk okrog med funkcijami na drugačen način. 32 00:01:43,790 --> 00:01:46,550 To pomeni, da če naredimo sprememba v eno funkcijo, 33 00:01:46,550 --> 00:01:49,827 ta sprememba bo dejansko vzeti vpliva na drugačno funkcijo. 34 00:01:49,827 --> 00:01:52,160 Tudi to je nekaj, kar nismo mogli storiti že prej, 35 00:01:52,160 --> 00:01:56,979 in če ste že kdaj poskusili, da bi zamenjali vrednost dveh spremenljivk v funkciji, 36 00:01:56,979 --> 00:01:59,270 da ste opazili ta problem nekako plazeče gor, kajne? 37 00:01:59,270 --> 00:02:04,340 >> Če želimo, da bi zamenjali X in Y, in smo da gredo na funkcijo imenovano swap, 38 00:02:04,340 --> 00:02:08,680 notranjost funkcijo zamenjave spremenljivke storiti menjalne vrednosti. 39 00:02:08,680 --> 00:02:12,600 Ena postane dve, dve postane ena, vendar ne bomo dejansko 40 00:02:12,600 --> 00:02:16,890 ničesar spremeniti v izvirniku Funkcija v klicatelja. 41 00:02:16,890 --> 00:02:19,550 Ker ne moremo, smo samo delo s kopijami njimi. 42 00:02:19,550 --> 00:02:24,760 S kazalci, čeprav smo lahko dejansko prenese X in Y na funkcijo. 43 00:02:24,760 --> 00:02:26,960 To funkcijo lahko storite kaj z njimi. 44 00:02:26,960 --> 00:02:29,250 In tiste spremenljivke vrednosti dejansko lahko spremenite. 45 00:02:29,250 --> 00:02:33,710 Tako da je precej spremenila naša sposobnost za delo s podatki. 46 00:02:33,710 --> 00:02:36,100 >> Preden se spustimo v kazalci, mislim, da je vredno 47 00:02:36,100 --> 00:02:38,580 ob nekaj minut do iti nazaj k osnovam tukaj. 48 00:02:38,580 --> 00:02:41,000 In si oglejte, kako računalniških pomnilnih dela 49 00:02:41,000 --> 00:02:45,340 ker ti dve temi se dogaja dejansko precej povezana. 50 00:02:45,340 --> 00:02:48,480 Kot verjetno veste, na vašem računalniškem sistemu 51 00:02:48,480 --> 00:02:51,310 imate trdi disk ali morda SSD, 52 00:02:51,310 --> 00:02:54,430 nekakšna lokacijo za shranjevanje datotek. 53 00:02:54,430 --> 00:02:57,950 To je ponavadi nekje v soseski 250 gigabajtov 54 00:02:57,950 --> 00:02:59,810 da morda nekaj terabajtov zdaj. 55 00:02:59,810 --> 00:03:02,270 In to je, če vse vaše Datoteke končno živeti, 56 00:03:02,270 --> 00:03:04,870 tudi ko je vaš računalnik zaustavite off, lahko vklopite 57 00:03:04,870 --> 00:03:09,190 in boste našli vaše datoteke obstajajo znova, ko boste ponovno zagnati sistem. 58 00:03:09,190 --> 00:03:14,820 Vendar diskov, kot trdi disk, diskov HDD ali SSD, SSD, 59 00:03:14,820 --> 00:03:16,050 so le prostor za shranjevanje. 60 00:03:16,050 --> 00:03:20,400 >> Mi dejansko ne morejo storiti ničesar s Podatki, ki so na trdem disku, 61 00:03:20,400 --> 00:03:22,080 ali v trdnem stanju pogon. 62 00:03:22,080 --> 00:03:24,950 Da bi dejansko spremenili podatkov ali pa ga premikate, 63 00:03:24,950 --> 00:03:28,800 moramo, da se premaknete RAM, bralno-pisalnega pomnilnika. 64 00:03:28,800 --> 00:03:31,170 Zdaj RAM, imate veliko manj v vašem računalniku. 65 00:03:31,170 --> 00:03:34,185 Morda imate nekje v soseski 512 megabajtov 66 00:03:34,185 --> 00:03:38,850 če imate starejši računalnik, da morda dve, štiri, osem, 16, 67 00:03:38,850 --> 00:03:41,820 morda celo malo več gigabajtov pomnilnika. 68 00:03:41,820 --> 00:03:46,390 Torej, to je veliko manjši, vendar je to kjer vsi hlapnih podatkov obstaja. 69 00:03:46,390 --> 00:03:48,270 To je, če bomo lahko spremenili stvari. 70 00:03:48,270 --> 00:03:53,350 Toda, ko zavijemo naš računalnik izklopite, vsi podatki v RAM uniči. 71 00:03:53,350 --> 00:03:57,150 >> Torej, to je, zakaj moramo imeti trdi disk za bolj trajno lokacijo nje, 72 00:03:57,150 --> 00:03:59,720 tako da je exists- da bi res slabo, če bi vsakič, ko smo 73 00:03:59,720 --> 00:04:03,310 obrnil naš računalnik off, vsak Datoteka v našem sistemu je bilo izbrisano. 74 00:04:03,310 --> 00:04:05,600 Torej delamo znotraj RAM. 75 00:04:05,600 --> 00:04:09,210 In vsakič, ko govorimo o spomin, precej, v CS50, 76 00:04:09,210 --> 00:04:15,080 govorimo o RAM, ne trdega diska. 77 00:04:15,080 --> 00:04:18,657 >> Torej, ko smo premakniti stvari v spomin, da prevzame določeno količino prostora. 78 00:04:18,657 --> 00:04:20,740 Vse vrste podatkov, ki smo delali z 79 00:04:20,740 --> 00:04:23,480 zavzamejo drugačni Zneski prostora v RAM. 80 00:04:23,480 --> 00:04:27,600 Torej, vsakič, ko boste ustvarili celo spremenljivi, štiri bajte spomina 81 00:04:27,600 --> 00:04:30,750 so v prahi v RAM, tako vas lahko dela s tem celo število. 82 00:04:30,750 --> 00:04:34,260 Lahko razglasi celo število, spremeniti, ga dodelite 83 00:04:34,260 --> 00:04:36,700 v vrednosti 10 poveča za z enim, tako naprej in tako naprej. 84 00:04:36,700 --> 00:04:39,440 Vse, kar se mora zgoditi v RAM, in dobiš štiri bajte 85 00:04:39,440 --> 00:04:42,550 delati za vsak celo, da si ustvarite. 86 00:04:42,550 --> 00:04:45,410 >> Vsak pismenko ustvariti dobi en bajt. 87 00:04:45,410 --> 00:04:48,160 To je samo, koliko prostora je potrebno shraniti značaj. 88 00:04:48,160 --> 00:04:51,310 Vsak float, pravi številko, dobi štiri bajte 89 00:04:51,310 --> 00:04:53,390 razen če gre za dvojni natančnosti s plavajočo vejico 90 00:04:53,390 --> 00:04:56,510 Številka, ki vam omogoča, da imajo natančnejše ali več cifer 91 00:04:56,510 --> 00:04:59,300 decimalno vejico brez izgube natančnosti, 92 00:04:59,300 --> 00:05:01,820 ki traja do osem bajtov pomnilnika. 93 00:05:01,820 --> 00:05:06,730 Dolgi hrepeni, res velika cela števila, tudi do osem bajtov pomnilnika. 94 00:05:06,730 --> 00:05:09,000 Koliko bajtov pomnilnika ne strune traja? 95 00:05:09,000 --> 00:05:12,990 No, kaj je dal pin na to vprašanje za zdaj, ampak bomo prišli nazaj na to. 96 00:05:12,990 --> 00:05:17,350 >> Torej nazaj na to idejo spominu kot velik nabor Byte velikih celic. 97 00:05:17,350 --> 00:05:20,871 To je res vse, kar je, da je samo ogromna množica celic, 98 00:05:20,871 --> 00:05:23,370 tako kot katera koli druga polja, ki ste seznanjeni z in glej, 99 00:05:23,370 --> 00:05:26,430 razen vsakega elementa je en bajt širok. 100 00:05:26,430 --> 00:05:30,030 In tako kot matriko, Vsak element ima naslov. 101 00:05:30,030 --> 00:05:32,120 Vsak element matrike ima indeks, in smo 102 00:05:32,120 --> 00:05:36,302 Lahko uporabite to kazalo storiti tako imenovane random access na paleto. 103 00:05:36,302 --> 00:05:38,510 Nimamo začeti na začetek matrike, 104 00:05:38,510 --> 00:05:40,569 Ponovil skozi vsak posamezen element Pogodbe, 105 00:05:40,569 --> 00:05:41,860 da bi našli tisto, kar iščete. 106 00:05:41,860 --> 00:05:45,790 Lahko samo rečem, želim priti do 15. element ali 100. element. 107 00:05:45,790 --> 00:05:49,930 In lahko samo prenese na to številko in dobili vrednost, ki jo iščete. 108 00:05:49,930 --> 00:05:54,460 >> Prav vsaka lokacija V spominu ima naslov. 109 00:05:54,460 --> 00:05:57,320 Torej vaš spomin morda izgledala nekako takole. 110 00:05:57,320 --> 00:06:01,420 Tukaj je zelo majhen kos pomnilnik, to je 20 bajtov pomnilnika. 111 00:06:01,420 --> 00:06:04,060 Prvih 20 bajtov, ker moj Obravnava je na dnu 112 00:06:04,060 --> 00:06:08,890 sta 0, 1, 2, 3, in zato na vse tja do 19. 113 00:06:08,890 --> 00:06:13,190 In ko Izjavljam spremenljivk in Ko začnem delati z njimi, 114 00:06:13,190 --> 00:06:15,470 Sistem bo nastavljena prahi nekaj prostora za mene 115 00:06:15,470 --> 00:06:17,595 v tem pomnilniku za delo z mojimi spremenljivk. 116 00:06:17,595 --> 00:06:21,610 Torej lahko rečem, char c enak kapital H. In kaj se bo zgodilo? 117 00:06:21,610 --> 00:06:23,880 No, sistem se bo prahi za mene en bajt. 118 00:06:23,880 --> 00:06:27,870 V tem primeru se je odločila bajt številko štiri, bajt na naslovu štiri, 119 00:06:27,870 --> 00:06:31,310 in to se dogaja, da shranite črka H tam za mene. 120 00:06:31,310 --> 00:06:34,350 Če sem nato rekel, int hitrost Meja je enak 65, to je 121 00:06:34,350 --> 00:06:36,806 bo razveljavilo štiri bajtov pomnilnika za mene. 122 00:06:36,806 --> 00:06:39,180 In to se dogaja za zdravljenje tistih, štiri bajte kot eno enoto 123 00:06:39,180 --> 00:06:41,305 kajti to, kar delamo s je celo število tukaj. 124 00:06:41,305 --> 00:06:44,350 In to se dogaja, da shranite 65 tam. 125 00:06:44,350 --> 00:06:47,000 >> Zdaj je že, da sem nekako Vam povem malo laž, 126 00:06:47,000 --> 00:06:50,150 prav, saj vemo, da računalniki delo v binarno. 127 00:06:50,150 --> 00:06:53,100 Oni ne razumejo nujno, kaj je kapital H 128 00:06:53,100 --> 00:06:57,110 ali kaj 65 pomeni, da so le razumejo binarni, ničel in enic. 129 00:06:57,110 --> 00:06:59,000 In tako pravzaprav kaj smo shranjevanje tja 130 00:06:59,000 --> 00:07:03,450 ni črka H in številko 65, ampak binarne predstavitve 131 00:07:03,450 --> 00:07:06,980 Pogodbe, ki je videti malo kaj takega. 132 00:07:06,980 --> 00:07:10,360 In zlasti v kontekst celoštevilski spremenljivki, 133 00:07:10,360 --> 00:07:13,559 to ne dogaja, da ga pljuvaš v, to ne dogaja, da ga obravnavajo kot enega štirih 134 00:07:13,559 --> 00:07:15,350 bajt kos nujno, to je dejansko dogaja 135 00:07:15,350 --> 00:07:19,570 da ga obravnavajo kot štiri en bajt koščkih, ki bi izgledala nekako takole. 136 00:07:19,570 --> 00:07:22,424 In tudi to ni čisto res, bodisi, 137 00:07:22,424 --> 00:07:24,840 zaradi nečesa, kar se imenuje vrstnega reda zlogov, ki nismo 138 00:07:24,840 --> 00:07:26,965 tekoč priti v zdaj, ampak če ste radovedni, 139 00:07:26,965 --> 00:07:29,030 si lahko preberete gor na malo in velik vrstnega reda zlogov. 140 00:07:29,030 --> 00:07:31,640 Ampak zaradi tega argumenta, zavoljo tega videa, 141 00:07:31,640 --> 00:07:34,860 kaj je samo domnevati, da je, v Dejstvo, kako številko 65 bi 142 00:07:34,860 --> 00:07:36,970 zastopana v spomin na vsakem sistemu, 143 00:07:36,970 --> 00:07:38,850 čeprav to ni čisto res. 144 00:07:38,850 --> 00:07:41,700 >> Ampak kaj je pravzaprav šele zaslužiti znebite vseh binarno celoti, 145 00:07:41,700 --> 00:07:44,460 in samo pomislite, kot je H in 65, to je veliko lažje 146 00:07:44,460 --> 00:07:47,900 razmišljati o tem, kot da kot človeško bitje. 147 00:07:47,900 --> 00:07:51,420 Vse je v redu, tako da se zdi tudi morda malo random da I've- moj sistem 148 00:07:51,420 --> 00:07:55,130 me ni dala bajtov 5, 6, 7, in 8 za shranjevanje celo število. 149 00:07:55,130 --> 00:07:58,580 Obstaja razlog za to, preveč, kar ne bomo dobili v tem trenutku, ampak zadostuje, 150 00:07:58,580 --> 00:08:00,496 to pomeni, da tisto, kar računalnik počne tukaj 151 00:08:00,496 --> 00:08:02,810 je verjetno dobra poteza, na svoji strani. 152 00:08:02,810 --> 00:08:06,020 Da mi ne daje spomin, ki je nujno na hrbtni strani. 153 00:08:06,020 --> 00:08:10,490 Čeprav se dogaja, da to storite zdaj če želim, da bi dobili še en niz, 154 00:08:10,490 --> 00:08:13,080 imenuje priimek, in želim, postaviti Lloyd tam. 155 00:08:13,080 --> 00:08:18,360 Bom potreboval, da se prilega eno značaj, vsako pismo, ki je 156 00:08:18,360 --> 00:08:21,330 dogaja, da zahtevajo enega lik, en bajt pomnilnika. 157 00:08:21,330 --> 00:08:26,230 Torej, če sem lahko dal Lloyd v mojo paleto kot je ta, da sem kar dobro iti, kajne? 158 00:08:26,230 --> 00:08:28,870 Kaj manjka? 159 00:08:28,870 --> 00:08:31,840 >> Ne pozabite, da je vsak niz delamo z v C konča s poševnico ničelno, 160 00:08:31,840 --> 00:08:33,339 in ne moremo izpustiti, da je tukaj, bodisi. 161 00:08:33,339 --> 00:08:36,090 Moramo prahi en bajt spomina ugotovil, da, zato smo 162 00:08:36,090 --> 00:08:39,130 vedo, kdaj je naš niz končal. 163 00:08:39,130 --> 00:08:41,049 Torej, spet ta dogovor o načinu, kako stvari 164 00:08:41,049 --> 00:08:42,799 pojavljajo v spominom biti malo naključno, 165 00:08:42,799 --> 00:08:44,870 vendar je v resnici, kako večina sistemi so zasnovani. 166 00:08:44,870 --> 00:08:48,330 Da jih line up na večkratnikih štirih razlogov, spet 167 00:08:48,330 --> 00:08:50,080 da nam ni potrebno priti v prav zdaj. 168 00:08:50,080 --> 00:08:53,060 Ampak to, da je dovolj, da rečemo, da Po teh treh vrstic kode, 169 00:08:53,060 --> 00:08:54,810 To je tisto, kar bi spomin izgledal. 170 00:08:54,810 --> 00:08:58,930 Če moram spominskih lokacij 4, 8 in 12, da imajo moje podatke, 171 00:08:58,930 --> 00:09:01,100 To je tisto, kar bi moj spomin izgledal. 172 00:09:01,100 --> 00:09:04,062 >> In samo še zlasti Pedantan tukaj, ko 173 00:09:04,062 --> 00:09:06,020 govorimo o spominu naslovi ponavadi 174 00:09:06,020 --> 00:09:08,390 počne s pomočjo šestnajstiških zapiske. 175 00:09:08,390 --> 00:09:12,030 Torej, zakaj ne bomo spremeniti vse te od decimalko do šestnajstiškem zapisu 176 00:09:12,030 --> 00:09:15,010 samo zato, ker je to na splošno kako smo se nanašajo na spomin. 177 00:09:15,010 --> 00:09:17,880 Torej, namesto da bi 0 skozi 19, kar imamo, je nič 178 00:09:17,880 --> 00:09:20,340 x nič skozi ničelno x1 tri. 179 00:09:20,340 --> 00:09:23,790 Tisti, ki so 20 bajtov pomnilnika, ki smo so ali pa gledaš na to sliko 180 00:09:23,790 --> 00:09:25,540 točno tukaj. 181 00:09:25,540 --> 00:09:29,310 >> Torej, vse to pa je dejal, kaj je korak stran od pomnilnika za sekundo 182 00:09:29,310 --> 00:09:30,490 in nazaj na kazalcev. 183 00:09:30,490 --> 00:09:32,420 Tu je najbolj pomembno, stvar, da se spomnimo 184 00:09:32,420 --> 00:09:34,070 kot smo začeli delati s kazalci. 185 00:09:34,070 --> 00:09:36,314 Kazalec je nič več kot naslovom. 186 00:09:36,314 --> 00:09:38,230 Jaz bom še enkrat, ker pravijo, to je, da je pomembno, 187 00:09:38,230 --> 00:09:42,730 kazalec ni nič več kot naslovom. 188 00:09:42,730 --> 00:09:47,760 Kazalci so naslove lokacij v spomin, kjer spremenljivke živeti. 189 00:09:47,760 --> 00:09:52,590 Vedoč, da postane upajmo malo lažje delati z njimi. 190 00:09:52,590 --> 00:09:54,550 Druga stvar, ki mi je všeč storiti je, da imajo neke 191 00:09:54,550 --> 00:09:58,510 diagramov vizualno predstavlja, kaj je dogaja z različnimi vrstic kode. 192 00:09:58,510 --> 00:10:00,660 In bomo to nekaj storiti krat v kazalcev, 193 00:10:00,660 --> 00:10:03,354 in ko govorimo o dinamični dodeljevanje pomnilnika, kot dobro. 194 00:10:03,354 --> 00:10:06,020 Ker mislim, da so ti načrti je lahko še posebej koristno. 195 00:10:06,020 --> 00:10:09,540 >> Torej, če rečem, na primer, int k v moji kodi, kaj se dogaja? 196 00:10:09,540 --> 00:10:12,524 No, kaj se v bistvu dogaja se Dobivam pomnilnika v prahi za mene, 197 00:10:12,524 --> 00:10:14,690 ampak sploh ne želi razmišljati o tem, kot da sem 198 00:10:14,690 --> 00:10:16,300 želeli, da razmišljajo o tem, kot škatla. 199 00:10:16,300 --> 00:10:20,090 Imam škatlo in to je obarvana zeleno, ker sem 200 00:10:20,090 --> 00:10:21,750 lahko dal celih zelenih poljih. 201 00:10:21,750 --> 00:10:23,666 Če je bil znak sem morda modro polje. 202 00:10:23,666 --> 00:10:27,290 Ampak jaz vedno pravim, če sem ustvariti polje, ki lahko ima cela števila 203 00:10:27,290 --> 00:10:28,950 da box je obarvana zeleno. 204 00:10:28,950 --> 00:10:33,020 In vzamem stalno marker in pišem k ob strani njej. 205 00:10:33,020 --> 00:10:37,590 Torej imam škatlo, imenovano k, v katero sem lahko dal cela. 206 00:10:37,590 --> 00:10:41,070 Torej, ko sem rekel, int k, ki je kaj se dogaja v moji glavi. 207 00:10:41,070 --> 00:10:43,140 Če rečem, k je enako pet, kaj počnem? 208 00:10:43,140 --> 00:10:45,110 No, jaz sem dajanje pet v polje, desno. 209 00:10:45,110 --> 00:10:48,670 To je precej preprosta, če Pravim int k, ustvarite polje imenovano k. 210 00:10:48,670 --> 00:10:52,040 Če rečem, k je enak 5, dal pet v polje. 211 00:10:52,040 --> 00:10:53,865 Upajmo, da ni preveč preskok. 212 00:10:53,865 --> 00:10:55,990 Tukaj je, če stvari gredo malo zanimivo, čeprav. 213 00:10:55,990 --> 00:11:02,590 Če rečem, int * pk, pa tudi če ne bom vem, kaj je to nujno pomeni, 214 00:11:02,590 --> 00:11:06,150 to je očitno dobil nekaj opraviti s celo število. 215 00:11:06,150 --> 00:11:08,211 Tako da bom za barvanje to polje zeleno-ish, 216 00:11:08,211 --> 00:11:10,210 Vem, da je dobil nekaj storiti s celo število, 217 00:11:10,210 --> 00:11:13,400 vendar to ni celo sam, ker je int zvezda. 218 00:11:13,400 --> 00:11:15,390 Nekaj ​​je nekoliko razlikujejo o tem. 219 00:11:15,390 --> 00:11:17,620 Torej vpleteni celo je, sicer pa je to 220 00:11:17,620 --> 00:11:19,830 ni preveč drugačna od kaj smo govoriš. 221 00:11:19,830 --> 00:11:24,240 To je polje, svoje dobil oznako, to je nosil PK etiket, 222 00:11:24,240 --> 00:11:27,280 in je sposoben gospodarstva int zvezde, ne glede na tiste, ki so. 223 00:11:27,280 --> 00:11:29,894 Imajo nekaj storiti s števil, jasno. 224 00:11:29,894 --> 00:11:31,060 Tukaj je zadnja vrstica, čeprav. 225 00:11:31,060 --> 00:11:37,650 Če rečem, pk = & k, vau, kaj se je zgodilo, kajne? 226 00:11:37,650 --> 00:11:41,820 Torej, to naključno število, na videz naključno Številka, gets vrže v polje tam. 227 00:11:41,820 --> 00:11:44,930 Vse to pomeni, da je pk dobi naslov k. 228 00:11:44,930 --> 00:11:52,867 Tako da sem z vztrajanjem, kjer k živi v spominu, njegov naslov, naslov njene bajte. 229 00:11:52,867 --> 00:11:55,200 Vse kar delam je, jaz pravim ta vrednost je tisto, kar bom 230 00:11:55,200 --> 00:11:59,430 postaviti znotraj mojega polje imenovano PK. 231 00:11:59,430 --> 00:12:02,080 In ker so te stvari kazalci, in ker je videti 232 00:12:02,080 --> 00:12:04,955 v nizu podobnega ničelni x osem nič c sedem štiri osem 233 00:12:04,955 --> 00:12:07,790 dva nič je verjetno ni zelo pomembno. 234 00:12:07,790 --> 00:12:12,390 Ko smo na splošno vizualizirati kazalci, smo dejansko storijo kot kazalci. 235 00:12:12,390 --> 00:12:17,000 Pk nam daje informacije moramo najti k v pomnilniku. 236 00:12:17,000 --> 00:12:19,120 Torej v bistvu pk ima puščico v njem. 237 00:12:19,120 --> 00:12:21,670 In če hodimo dolžino te puščice, si predstavljajte, 238 00:12:21,670 --> 00:12:25,280 to je nekaj, kar lahko hodi naprej, če bomo hodi vzdolž puščice 239 00:12:25,280 --> 00:12:29,490 v sam vrh tega puščice smo našli lokacijo v pomnilniku 240 00:12:29,490 --> 00:12:31,390 kjer je k živi. 241 00:12:31,390 --> 00:12:34,360 In to je res pomembno ker ko vemo, kje k živi, 242 00:12:34,360 --> 00:12:37,870 bomo lahko začeli delati s podatki Notranjost tega pomnilnika. 243 00:12:37,870 --> 00:12:40,780 Čeprav smo dobili poskočno bit pred sebe za zdaj. 244 00:12:40,780 --> 00:12:42,240 >> Torej, kaj je kazalec? 245 00:12:42,240 --> 00:12:45,590 Kazalec je podatek, katerega vrednost je pomnilniški naslov. 246 00:12:45,590 --> 00:12:49,740 To je bil, da nič x osem nič stuff se dogaja, da je pomnilniški naslov. 247 00:12:49,740 --> 00:12:52,060 So bili v pomnilniku lokacijo. 248 00:12:52,060 --> 00:12:55,080 In tip kazalca opisuje vrsto 249 00:12:55,080 --> 00:12:56,930 podatkov boste našli na da je pomnilniški naslov. 250 00:12:56,930 --> 00:12:58,810 Torej je del prav int zvezda. 251 00:12:58,810 --> 00:13:03,690 Če bi sledili temu puščico, je dogaja, da me pripelje na lokacijo. 252 00:13:03,690 --> 00:13:06,980 In da je ta lokacija, kaj sem bodo tam našli v mojem primeru, 253 00:13:06,980 --> 00:13:08,240 je zeleno obarvan polje. 254 00:13:08,240 --> 00:13:12,650 To je celo, da je kaj sem boste našli, če grem na ta naslov. 255 00:13:12,650 --> 00:13:14,830 Podatkovni tip kazalec opisuje, kaj 256 00:13:14,830 --> 00:13:17,936 boste našli na tej pomnilniški naslov. 257 00:13:17,936 --> 00:13:19,560 Torej, tukaj je res kul stvar, čeprav. 258 00:13:19,560 --> 00:13:25,090 Kazalci nam omogočajo, da prenese spremenljivke med funkcijami. 259 00:13:25,090 --> 00:13:28,520 In dejansko prenese spremenljivk in ne prenese njihove kopije. 260 00:13:28,520 --> 00:13:32,879 Ker, če vemo, kje v spominu, da bi našli spremenljivko, 261 00:13:32,879 --> 00:13:35,670 ne bomo morali narediti kopijo to smo lahko samo pojdi na tej lokaciji 262 00:13:35,670 --> 00:13:37,844 in delo s to spremenljivko. 263 00:13:37,844 --> 00:13:40,260 Torej, v bistvu kazalci vrste za narediti računalniško okolje 264 00:13:40,260 --> 00:13:42,360 veliko več, kot v resničnem svetu, kajne. 265 00:13:42,360 --> 00:13:44,640 >> Torej, tukaj je analogija. 266 00:13:44,640 --> 00:13:48,080 Recimo, da imam prenosnik, desno, in je poln not. 267 00:13:48,080 --> 00:13:50,230 In želim si, da ga dopolni. 268 00:13:50,230 --> 00:13:53,960 Ste funkcija, ki posodobitve ugotavlja, desno. 269 00:13:53,960 --> 00:13:56,390 Na poti smo bili delajo tako daleč, kaj 270 00:13:56,390 --> 00:14:02,370 zgodi se boste sprejeli moj prenosni računalnik, boš šel v trgovino kopiranja, 271 00:14:02,370 --> 00:14:06,410 vam bom lahko fotokopira vsaka stran od računalnika. 272 00:14:06,410 --> 00:14:09,790 Boste zapustiti svoj prenosnik nazaj na moji mizi, ko ste končali, 273 00:14:09,790 --> 00:14:14,600 boš šel in prečrtati stvari v moji notebook, da so zastareli ali narobe, 274 00:14:14,600 --> 00:14:19,280 in potem boste preide nazaj me Snop Xerox strani 275 00:14:19,280 --> 00:14:22,850 da je replika svoj zvezek z spremembe, ki ste jih vanjo. 276 00:14:22,850 --> 00:14:27,040 In na tej točki, da je do mene, kot funkcija kliče, kot klicatelja, 277 00:14:27,040 --> 00:14:30,582 da se odloči, da bo svoje zapiske in jih vključiti nazaj v svoj zvezek. 278 00:14:30,582 --> 00:14:32,540 Torej, tam je veliko stopnic vključen tukaj, kajne. 279 00:14:32,540 --> 00:14:34,850 Kot ne bi bilo bolje če sem samo rekel, hej, lahko 280 00:14:34,850 --> 00:14:38,370 posodobiti svoj prenosni računalnik za mi, roko ti moj prenosni računalnik, 281 00:14:38,370 --> 00:14:40,440 in vzameš stvari in dobesedno prečkati jih ven 282 00:14:40,440 --> 00:14:42,810 in posodobiti svoje zapiske v svoj zvezek. 283 00:14:42,810 --> 00:14:45,140 In potem mi je dal svoj prenosnik nazaj. 284 00:14:45,140 --> 00:14:47,320 To je nekako tisto, kazalci nam omogočajo, da storiti, 285 00:14:47,320 --> 00:14:51,320 dajo to okolje veliko bolj všeč, kako delujemo v resnici. 286 00:14:51,320 --> 00:14:54,640 >> Vse je v redu, da je kaj kazalec se, kaj je govoril 287 00:14:54,640 --> 00:14:58,040 o tem, kako kazalci delo v C, in kako lahko začnemo delati z njimi. 288 00:14:58,040 --> 00:15:02,550 Torej je zelo preprost kazalec v C se imenuje null kazalec. 289 00:15:02,550 --> 00:15:04,830 Null kazalec kaže na nič. 290 00:15:04,830 --> 00:15:08,310 To verjetno se zdi, kot da je pravzaprav ni zelo uporabna stvar, 291 00:15:08,310 --> 00:15:10,500 ampak kot bomo videli Malo kasneje, je dejstvo, 292 00:15:10,500 --> 00:15:15,410 da ta null kazalec obstaja dejansko res lahko pridejo v priročni. 293 00:15:15,410 --> 00:15:19,090 In vsakič, ko ustvarite kazalec, in ne nastavite svojo vrednost immediately- 294 00:15:19,090 --> 00:15:21,060 Primer določanja njegova vrednost takoj 295 00:15:21,060 --> 00:15:25,401 bo par diapozitive nazaj kjer sem rekel pk enaka & K, 296 00:15:25,401 --> 00:15:28,740 pk dobi naslov K, kot je bomo videli, kaj to pomeni, 297 00:15:28,740 --> 00:15:32,990 bomo videli, kako kodo, ki shortly- če ne nastavite njegovo vrednost na nečem 298 00:15:32,990 --> 00:15:35,380 takoj smiselna, morate vedno 299 00:15:35,380 --> 00:15:37,480 nastavite kazalec, da kaže na null. 300 00:15:37,480 --> 00:15:40,260 Morate nastaviti, da kaže na nič. 301 00:15:40,260 --> 00:15:43,614 >> To je zelo drugačen od Samo zaustavi vrednost, kot je 302 00:15:43,614 --> 00:15:45,530 in nato razglasitev kazalec in samo ob predpostavki, 303 00:15:45,530 --> 00:15:48,042 je nična, ker je to le redko res. 304 00:15:48,042 --> 00:15:50,000 Torej bi morali vedno nastavite vrednost kazalca 305 00:15:50,000 --> 00:15:55,690 NULL če ne nastavite njegovo vrednost da takoj nekaj smiselnega. 306 00:15:55,690 --> 00:15:59,090 Lahko preverite, ali je vrednost kazalca v je nična pomočjo operaterja enakosti 307 00:15:59,090 --> 00:16:05,450 (==), Tako kot vi primerjate koli celo število vrednosti ali vrednosti znakov s (==) 308 00:16:05,450 --> 00:16:06,320 kot dobro. 309 00:16:06,320 --> 00:16:10,994 To je posebna vrsta konstantna Vrednost, ki jo lahko uporabite za testiranje. 310 00:16:10,994 --> 00:16:13,160 Tako da je to zelo preprost kazalec je null kazalec. 311 00:16:13,160 --> 00:16:15,320 Drug način za ustvarjanje kazalec je citat 312 00:16:15,320 --> 00:16:18,240 naslov spremenljivke ste že ustvarili, 313 00:16:18,240 --> 00:16:22,330 in to storite z uporabo & Operater ekstrakcija naslov. 314 00:16:22,330 --> 00:16:26,720 Ki smo že prej videli v prvem primeru diagramu sem pokazal. 315 00:16:26,720 --> 00:16:31,450 Torej, če je x spremenljivka, ki smo jih že ustvarili tipa celo število, 316 00:16:31,450 --> 00:16:35,110 potem je x kazalec na celo število. 317 00:16:35,110 --> 00:16:39,810 & x za- spomnite, in se bo citat naslov stvar na desni strani. 318 00:16:39,810 --> 00:16:45,350 In ker je kazalec je samo naslov, kot & x kazalec na celo število 319 00:16:45,350 --> 00:16:48,560 katerih vrednost je, če v spomin x življenju. 320 00:16:48,560 --> 00:16:50,460 To je x je naslov. 321 00:16:50,460 --> 00:16:53,296 Torej & x je naslov x. 322 00:16:53,296 --> 00:16:55,670 Oglejmo to en korak naprej in povezati z nečim 323 00:16:55,670 --> 00:16:58,380 Sem se pojavi v predhodnem video. 324 00:16:58,380 --> 00:17:06,730 Če arr je niz dvojic, nato & arr oglati oklepaj i kazalec 325 00:17:06,730 --> 00:17:08,109 za dvojno. 326 00:17:08,109 --> 00:17:08,970 V REDU. 327 00:17:08,970 --> 00:17:12,160 arr peto nosilec I, če arr je niz dvojic, 328 00:17:12,160 --> 00:17:19,069 potem arr peto nosilec i element i-tega niza, 329 00:17:19,069 --> 00:17:29,270 in & arr peto nosilec i je, če v pomnilnik element i-th ARR obstaja. 330 00:17:29,270 --> 00:17:31,790 >> Torej, kaj je posledice tukaj? 331 00:17:31,790 --> 00:17:34,570 Nizi ime, posledice to celotno stvar, 332 00:17:34,570 --> 00:17:39,290 je, da je ime matrika je dejansko sam kazalec. 333 00:17:39,290 --> 00:17:41,170 Ste delali s kazalci vse skupaj 334 00:17:41,170 --> 00:17:45,290 vsak čas, ki ste ga uporabili matriko. 335 00:17:45,290 --> 00:17:49,090 Ne pozabite na primer na spremenljivo področje, 336 00:17:49,090 --> 00:17:53,420 blizu konca video I predstavi Primer kjer imamo funkcijo 337 00:17:53,420 --> 00:17:56,890 imenovani set int in Funkcija se imenuje niz niz. 338 00:17:56,890 --> 00:18:00,490 In vaš izziv za določanje ali ne, ali kaj 339 00:18:00,490 --> 00:18:03,220 vrednote, ki jih tiskani ven Konec funkcije 340 00:18:03,220 --> 00:18:05,960 Na koncu glavnega programa. 341 00:18:05,960 --> 00:18:08,740 >> Če se spomnite iz te primer ali če ste gledal video, 342 00:18:08,740 --> 00:18:13,080 ste vedeli, da ko vam-poziv k set int dejansko ne naredi ničesar. 343 00:18:13,080 --> 00:18:16,390 Toda klic nastavljena matrika počne. 344 00:18:16,390 --> 00:18:19,280 In nekako sem prezrli zakaj da je bila že v času. 345 00:18:19,280 --> 00:18:22,363 Pravkar sem rekel, tudi to je niz, to je posebnega, saj veš, da je to razlog. 346 00:18:22,363 --> 00:18:25,020 Razlog za to je, da je matrika je ime je res samo kazalec, 347 00:18:25,020 --> 00:18:28,740 in tam je ta posebna oglati oklepaj sintakso, ki 348 00:18:28,740 --> 00:18:30,510 bi stvari veliko lepše delati. 349 00:18:30,510 --> 00:18:34,410 In da je ideja o kazalec veliko manj zastrašujoče, 350 00:18:34,410 --> 00:18:36,800 in da je, zakaj oni so nekako od predstavljeni na ta način. 351 00:18:36,800 --> 00:18:38,600 Ampak res nizi so samo kazalci. 352 00:18:38,600 --> 00:18:41,580 In zato, ko smo naredili spremembo matriki, 353 00:18:41,580 --> 00:18:44,880 ko smo opravili vrsto kot parameter na funkcijo ali kot argument 354 00:18:44,880 --> 00:18:50,110 do funkcije, vsebina matrike dejansko spremenilo v obeh callee 355 00:18:50,110 --> 00:18:51,160 in klicatelja. 356 00:18:51,160 --> 00:18:55,846 Ki je za vse druge vrste spremenljivka smo videli, ni bilo tako. 357 00:18:55,846 --> 00:18:58,970 Torej, to je samo nekaj, da bo v misel, ko delate s kazalci, 358 00:18:58,970 --> 00:19:01,610 je, da se v imenu Niz dejansko kazalec 359 00:19:01,610 --> 00:19:04,750 s prvim elementom tega niza. 360 00:19:04,750 --> 00:19:08,930 >> OK, tako da zdaj imamo vse te dejstva, dajmo nadaljuj, desno. 361 00:19:08,930 --> 00:19:11,370 Zakaj nam je mar kjer je nekaj živi. 362 00:19:11,370 --> 00:19:14,120 No, kot sem rekel, da je precej koristno vedeti, kje kaj živi 363 00:19:14,120 --> 00:19:17,240 tako da lahko greš tja in jo spremenite. 364 00:19:17,240 --> 00:19:19,390 Delo z njim in dejansko imajo stvar, ki vas 365 00:19:19,390 --> 00:19:23,710 želite storiti v tem spremenljivo vzletno učinkom, in ne učinkuje na neki kopijo tega. 366 00:19:23,710 --> 00:19:26,150 To se imenuje Dereferenciranje. 367 00:19:26,150 --> 00:19:28,690 Gremo na reference in smo spremenili vrednost tam. 368 00:19:28,690 --> 00:19:32,660 Torej, če imamo kazalec in se imenuje pc, in to kaže na značaj, 369 00:19:32,660 --> 00:19:40,610 potem lahko rečemo * pc in * pc je ime, kaj bomo našli, če bomo šli 370 00:19:40,610 --> 00:19:42,910 na naslov pc. 371 00:19:42,910 --> 00:19:47,860 Kaj bomo našli tam je znak in * pc je, kako smo se nanašajo na podatke na tem 372 00:19:47,860 --> 00:19:48,880 lokacija. 373 00:19:48,880 --> 00:19:54,150 Torej bi lahko rekli nekaj podobnega * pc = D ali nekaj takega, 374 00:19:54,150 --> 00:19:59,280 in to pomeni, da ne glede na je na pomnilniški naslov pc, 375 00:19:59,280 --> 00:20:07,040 ne glede na karakter je bil prej tam je zdaj D, če rečemo * pc = D. 376 00:20:07,040 --> 00:20:10,090 >> Torej, tukaj smo spet tam z nekaj čudnega C stvari, kajne. 377 00:20:10,090 --> 00:20:14,560 Tako smo videli * prej kot nekako del podatkovnega tipa, 378 00:20:14,560 --> 00:20:17,160 in zdaj je v uporabi v nekoliko drugačen kontekst 379 00:20:17,160 --> 00:20:19,605 za dostop do podatkov na lokaciji. 380 00:20:19,605 --> 00:20:22,480 Vem, da je malo zmedeno in da je pravzaprav del te celote 381 00:20:22,480 --> 00:20:25,740 kot so, zakaj imajo kazalci to mitologijo okoli njih, saj so tako kompleksna, 382 00:20:25,740 --> 00:20:28,250 je nekako problem sintakso, pošteno. 383 00:20:28,250 --> 00:20:31,810 Toda * se uporablja v obeh kontekstih tako kot del imena tipa, 384 00:20:31,810 --> 00:20:34,100 in bomo videli malo kasneje nekaj drugega, preveč. 385 00:20:34,100 --> 00:20:36,490 In zdaj je Operater dereference. 386 00:20:36,490 --> 00:20:38,760 Torej gre za referenco, da dostopi do podatkov 387 00:20:38,760 --> 00:20:43,000 na mestu kazalca, in vam omogoča, da manipulira po svoji volji. 388 00:20:43,000 --> 00:20:45,900 >> Zdaj je to zelo podobna obiščete svojega bližnjega, kajne. 389 00:20:45,900 --> 00:20:48,710 Če veste, kaj je tvoj sosed živi, ​​ste 390 00:20:48,710 --> 00:20:50,730 Ne družim s svojo sosedo. 391 00:20:50,730 --> 00:20:53,510 Veste, da se zgodi, da vedeti, kje živijo, 392 00:20:53,510 --> 00:20:56,870 vendar to ne pomeni, da ga krepost, ki imajo to znanje 393 00:20:56,870 --> 00:20:59,170 ste v stiku z njimi. 394 00:20:59,170 --> 00:21:01,920 Če želite interakcijo z njimi, moraš iti na svojo hišo, 395 00:21:01,920 --> 00:21:03,760 moraš iti tja, kjer živijo. 396 00:21:03,760 --> 00:21:07,440 In ko boste to storili, potem lahko sodelujete 397 00:21:07,440 --> 00:21:09,420 z njimi, tako kot si jo želeli. 398 00:21:09,420 --> 00:21:12,730 In prav s spremenljivkami, boste morali iti na njihov naslov 399 00:21:12,730 --> 00:21:15,320 če želite, da jih interakcijo, ne moreš vedeti naslov. 400 00:21:15,320 --> 00:21:21,495 In kako greš na naslov, je za uporabo *, operaterja razrešimo. 401 00:21:21,495 --> 00:21:23,620 Kaj misliš, da se zgodi če bomo poskušali dereference 402 00:21:23,620 --> 00:21:25,260 kazalec, katerega vrednost je nična? 403 00:21:25,260 --> 00:21:28,470 Spomnimo se, da je null kazalec kaže na nič. 404 00:21:28,470 --> 00:21:34,110 Torej, če ste poskušali in dereference nič ali pojdite na naslov nič, 405 00:21:34,110 --> 00:21:36,800 Kaj misliš, da se zgodi? 406 00:21:36,800 --> 00:21:39,630 No, če ste uganili segmentacija napaka, bi bilo prav. 407 00:21:39,630 --> 00:21:41,390 Če poskusite in dereference null kazalec, 408 00:21:41,390 --> 00:21:43,140 trpite za segmentacijo kriv. Toda počakaj, 409 00:21:43,140 --> 00:21:45,820 ni vam povem, da če ne greš 410 00:21:45,820 --> 00:21:49,220 da nastavite vrednost vašega kazalec na nekaj pomembnega, 411 00:21:49,220 --> 00:21:51,000 morate nastaviti na ničlo? 412 00:21:51,000 --> 00:21:55,290 Sem storil in dejansko segmentacija krivda je nekako dobro vedenje. 413 00:21:55,290 --> 00:21:58,680 >> Ali ste že kdaj izjavil spremenljivko in ni takoj dodeli svojo vrednost? 414 00:21:58,680 --> 00:22:02,680 Torej si pravkar rekel int x; ne boste pravzaprav ga dodelite karkoli 415 00:22:02,680 --> 00:22:05,340 in potem kasneje v kodi, tiskate vrednost x, 416 00:22:05,340 --> 00:22:07,650 ob še vedno ne je dodeljena karkoli. 417 00:22:07,650 --> 00:22:10,370 Pogosto boste dobili nič, ampak včasih si 418 00:22:10,370 --> 00:22:15,000 morda dobili nekaj naključno število, in nimate pojma, od kod je prišel. 419 00:22:15,000 --> 00:22:16,750 Podobno lahko stvari zgodilo s kazalci. 420 00:22:16,750 --> 00:22:20,110 Ko ste razglasi kazalec int * pk npr 421 00:22:20,110 --> 00:22:23,490 in ga ne dodelite vrednost, dobiš štiri bajte, za spomin. 422 00:22:23,490 --> 00:22:25,950 Ne glede na štirih bajtov pomnilniški sistem lahko 423 00:22:25,950 --> 00:22:28,970 ugotovili, da imajo neko smiselno vrednost. 424 00:22:28,970 --> 00:22:31,760 In bi lahko prišlo do nekaj, kar je že tam, da 425 00:22:31,760 --> 00:22:34,190 z drugo, ni več potreben funkcijo, tako da boste morali 426 00:22:34,190 --> 00:22:35,900 glede na podatke, je bil tam. 427 00:22:35,900 --> 00:22:40,570 >> Kaj pa, če ste poskusili narediti razrešimo nekateri naslov, ki ste don't- ni bilo 428 00:22:40,570 --> 00:22:43,410 že bajti in informacije tam, ki je zdaj v vašem kazalec. 429 00:22:43,410 --> 00:22:47,470 Če poskusite in dereference tega kazalca, vas bo morda zajebavam z nekaj pomnilnika 430 00:22:47,470 --> 00:22:49,390 da si ne namerava da igraš z njim vse. 431 00:22:49,390 --> 00:22:51,639 In v resnici lahko storite nekaj res uničujoče, 432 00:22:51,639 --> 00:22:54,880 kot prekinil drug program, ali prekinil drugo funkcijo, 433 00:22:54,880 --> 00:22:58,289 ali narediti nekaj zlonamerno da niste nameravate storiti na vseh. 434 00:22:58,289 --> 00:23:00,080 In tako, da je razlog, zakaj je pravzaprav dobra ideja 435 00:23:00,080 --> 00:23:04,030 da nastavite vaše napotke na nič, če vas jih ne nastavljen na nekaj smiselnega. 436 00:23:04,030 --> 00:23:06,760 To je verjetno bolje Na konec dneva za vaš program 437 00:23:06,760 --> 00:23:09,840 crash potem za to, da stori Nekaj, kar polomi 438 00:23:09,840 --> 00:23:12,400 drug program ali drugo funkcijo. 439 00:23:12,400 --> 00:23:15,207 To vedenje je verjetno še manj idealen kot samo treskav. 440 00:23:15,207 --> 00:23:17,040 In tako, da je razlog, zakaj je pravzaprav dobra navada 441 00:23:17,040 --> 00:23:20,920 priti v nastavitvi kazalce NULL, če jih ne nastavite 442 00:23:20,920 --> 00:23:24,540 pomembnejšega vrednosti takoj, da vrednost, da veste 443 00:23:24,540 --> 00:23:27,260 in da lahko VARNO dereference. 444 00:23:27,260 --> 00:23:32,240 >> Torej, kaj je prišel nazaj, zdaj in si oglejte na celotno sintakso razmer. 445 00:23:32,240 --> 00:23:37,400 Če rečem, int * p ;, kaj sem naredil? 446 00:23:37,400 --> 00:23:38,530 Kaj sem naredil je to. 447 00:23:38,530 --> 00:23:43,290 Vem, da je vrednost p je naslov ker vsi kazalci so pravkar 448 00:23:43,290 --> 00:23:44,660 naslovi. 449 00:23:44,660 --> 00:23:47,750 Ne morem dereference p pomočjo operaterja *. 450 00:23:47,750 --> 00:23:51,250 V zvezi s tem tu, na zelo top odpoklic * je del tipa. 451 00:23:51,250 --> 00:23:53,510 Int * je podatkovni tip. 452 00:23:53,510 --> 00:23:56,150 Ampak ne morem dereference p pomočjo operatorja *, 453 00:23:56,150 --> 00:24:01,897 in če sem to storiti, če grem na ta naslov, kaj bom našel na tem naslovu? 454 00:24:01,897 --> 00:24:02,855 Našel bom celo število. 455 00:24:02,855 --> 00:24:05,910 Torej int * p je v bistvu rekoč, p je naslov. 456 00:24:05,910 --> 00:24:09,500 Ne morem dereference p in če Delam, se mi zdi celo 457 00:24:09,500 --> 00:24:11,920 pri tem pomnilniškem mestu. 458 00:24:11,920 --> 00:24:14,260 >> OK, zato sem rekel, da je ena nadležna stvar z zvezdami 459 00:24:14,260 --> 00:24:17,060 in tukaj je, če se to nadležno stvar, z zvezdami je. 460 00:24:17,060 --> 00:24:21,640 Ste že kdaj poskusili, da razglasi več spremenljivk istega tipa 461 00:24:21,640 --> 00:24:24,409 na isti liniji kodo? 462 00:24:24,409 --> 00:24:27,700 Torej, za sekundo, se pretvarjamo, da je linija, koda pravzaprav imam tam v zeleno 463 00:24:27,700 --> 00:24:29,366 ne obstaja in to samo pravi int x, y, z ;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Kaj, da bi naredil je pravzaprav ustvarjanje tri cela spremenljivke za vas, 466 00:24:34,550 --> 00:24:36,930 ena imenovana x, ena imenovana y, in ena imenovana z. 467 00:24:36,930 --> 00:24:41,510 To je način, da to storite brez ob razdeliti na tri vrstice. 468 00:24:41,510 --> 00:24:43,890 >> Tukaj je, kjer dobite zvezdice siten spet, čeprav, 469 00:24:43,890 --> 00:24:49,200 ker je * je pravzaprav del tako ime tipa in delu 470 00:24:49,200 --> 00:24:50,320 spremenljivke imena. 471 00:24:50,320 --> 00:24:56,430 In tako, če rečem, int * px, py, pz, kaj sem dejansko dobili, je kazalec na celo število 472 00:24:56,430 --> 00:25:01,650 imenuje px in dve celi števili, py in pz. 473 00:25:01,650 --> 00:25:04,950 In to je verjetno tisto, kar ni želimo, da to ni dobro. 474 00:25:04,950 --> 00:25:09,290 >> Torej, če želim ustvariti več kazalcev na isti liniji, istega tipa, 475 00:25:09,290 --> 00:25:12,140 in zvezde, kar sem dejansko potrebujejo storiti, je rekel, int * pa * pb, * pc. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Zdaj ko je pravkar rekel, da je in zdaj ti to pove, 478 00:25:20,300 --> 00:25:22,170 vam verjetno ne bo nikoli to storite. 479 00:25:22,170 --> 00:25:25,170 In to je verjetno dobra stvar pošteno, ker ste morda nehote 480 00:25:25,170 --> 00:25:26,544 izpustite zvezdo, nekaj takega. 481 00:25:26,544 --> 00:25:29,290 To je verjetno najbolje, da morda razglasi kazalci na posameznih linijah, 482 00:25:29,290 --> 00:25:31,373 ampak to je samo še ena nadležnih sintakse 483 00:25:31,373 --> 00:25:35,310 stvari z zvezdami, ki omogočajo kazalci tako težko delati. 484 00:25:35,310 --> 00:25:39,480 Ker je samo to skladenjska nered moraš delati skozi. 485 00:25:39,480 --> 00:25:41,600 Z vajo se to zgodi res postala druga narava. 486 00:25:41,600 --> 00:25:45,410 Še vedno delamo napake, s tem še vedno Po programiranju za obdobje 10 let, 487 00:25:45,410 --> 00:25:49,630 tako ne razburjaj se, če se kaj zgodi za vas, je precej pogosta pošteno. 488 00:25:49,630 --> 00:25:52,850 To je res nekako napaka v sintaksi. 489 00:25:52,850 --> 00:25:54,900 >> OK, tako da sem nekako obljubil da bi ponovno 490 00:25:54,900 --> 00:25:59,370 koncept, kako velika je niz. 491 00:25:59,370 --> 00:26:02,750 No, če sem ti rekel, da je niz, ki smo jih res nekako 492 00:26:02,750 --> 00:26:04,140 lagal, da vas ves čas. 493 00:26:04,140 --> 00:26:06,181 Ni podatkovni tip se imenuje niz, ki v bistvu sem 494 00:26:06,181 --> 00:26:09,730 to je omenila v eni od naših Prve posnetke na podatkovnih tipov, 495 00:26:09,730 --> 00:26:13,820 da niz je bil tip podatkov, ki je bil ustvarjen za vas v CS50.h. 496 00:26:13,820 --> 00:26:17,050 Moraš #include CS50.h, da bi ga uporabljali. 497 00:26:17,050 --> 00:26:19,250 >> No niz je res samo vzdevek za nekaj 498 00:26:19,250 --> 00:26:23,600 imenuje char *, A kazalec na znak. 499 00:26:23,600 --> 00:26:26,010 No kazalci, odpoklic, so le naslovi. 500 00:26:26,010 --> 00:26:28,780 Torej, kaj je velikost v bajtih niz? 501 00:26:28,780 --> 00:26:29,796 No, to je štiri ali osem. 502 00:26:29,796 --> 00:26:32,170 In razlog, zakaj sem rekel, štiri ali osem je zato, ker je dejansko 503 00:26:32,170 --> 00:26:36,730 odvisno od sistema, Če uporabljate CS50 ide, char * je velikost char 504 00:26:36,730 --> 00:26:39,340 * Je osem, to je 64-bitni sistem. 505 00:26:39,340 --> 00:26:43,850 Vsak naslov v pomnilniku je 64 bitov dolgo. 506 00:26:43,850 --> 00:26:48,270 Če uporabljate CS50 aparata ali z uporabo katerega koli 32-bitni stroj, 507 00:26:48,270 --> 00:26:51,640 in ste slišali, da je čas 32-bit stroj, kar je 32-bitni stroj? 508 00:26:51,640 --> 00:26:56,090 No, to samo pomeni, da je vsak naslov pomnilnika je 32 bitov. 509 00:26:56,090 --> 00:26:59,140 In tako 32 bitov je štiri bajte. 510 00:26:59,140 --> 00:27:02,710 Torej char * je štiri ali osem bajtov odvisno od vašega sistema. 511 00:27:02,710 --> 00:27:06,100 In res vse vrste podatkov, in kazalec do vseh podatkov, 512 00:27:06,100 --> 00:27:12,030 tip, saj so vsi kazalci le naslovi, štiri ali osem bajtov. 513 00:27:12,030 --> 00:27:14,030 Tako da je ponovno to diagram in kaj je sklepanje 514 00:27:14,030 --> 00:27:18,130 ta video z malo vaje tukaj. 515 00:27:18,130 --> 00:27:21,600 Torej, tukaj je diagram smo končali s na samem začetku videa. 516 00:27:21,600 --> 00:27:23,110 Torej, kaj se zgodi zdaj, če rečem * PK = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Torej, kaj to pomeni, če rečem, * pk = 35? 519 00:27:30,530 --> 00:27:32,420 Vzemite si trenutek. 520 00:27:32,420 --> 00:27:34,990 * pk. 521 00:27:34,990 --> 00:27:39,890 V zvezi s tem tukaj, * je Operater dereference. 522 00:27:39,890 --> 00:27:42,110 Torej, ko je dereference Operater se uporablja, 523 00:27:42,110 --> 00:27:48,520 gremo na naslov izpostavil PK, in spremenimo, kar smo našli. 524 00:27:48,520 --> 00:27:55,270 Torej * pk = 35 učinkovito to stori na sliki. 525 00:27:55,270 --> 00:27:58,110 Torej, to je v bistvu skladenjsko identična, da imajo omenjeni k = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Še en. 528 00:28:01,930 --> 00:28:05,510 Če rečem, int m, lahko izdelam nova spremenljivka imenovan m. 529 00:28:05,510 --> 00:28:08,260 Nova škatla, to je zeleno polje, ker to se dogaja, da imajo celo število, 530 00:28:08,260 --> 00:28:09,840 in je to označeno m. 531 00:28:09,840 --> 00:28:14,960 Če rečem, m = 4, I Put celo v tem polju. 532 00:28:14,960 --> 00:28:20,290 Če recimo pk = & m, kako deluje Ta diagram sprememba? 533 00:28:20,290 --> 00:28:28,760 Pk = & m, ali se spomnite, kaj je In operater ne, ali se imenuje? 534 00:28:28,760 --> 00:28:34,430 Ne pozabite, da & neko ime spremenljivke je naslov imenu spremenljivke. 535 00:28:34,430 --> 00:28:38,740 Torej, kaj smo govoriš, je pk dobi naslov m. 536 00:28:38,740 --> 00:28:42,010 In tako dejansko kaj zgodi, diagram je, da PK ni daljše točke 537 00:28:42,010 --> 00:28:46,420 do k, vendar opozarja, da m. 538 00:28:46,420 --> 00:28:48,470 >> Spet kazalci so zelo težavno delo z 539 00:28:48,470 --> 00:28:50,620 in so se veliko praksa, ampak zato, ker 540 00:28:50,620 --> 00:28:54,150 njihove sposobnosti, da vam omogoči prenesti podatke med funkcijami 541 00:28:54,150 --> 00:28:56,945 in dejansko imajo tisti, Spremembe bodo začele veljati, 542 00:28:56,945 --> 00:28:58,820 dobili svojo glavo okoli je res pomembno. 543 00:28:58,820 --> 00:29:02,590 Verjetno je najbolj zapleten temo smo razpravljali v CS50, 544 00:29:02,590 --> 00:29:05,910 vendar pa vrednost, ki vas dobili od pomočjo nasvetov 545 00:29:05,910 --> 00:29:09,200 daleč odtehta komplikacij ki prihajajo iz njih učenje. 546 00:29:09,200 --> 00:29:12,690 Torej vam želim najboljše sreče spoznavanje kazalci. 547 00:29:12,690 --> 00:29:15,760 Sem Doug Lloyd, to je CS50. 548 00:29:15,760 --> 00:29:17,447