1 00:00:00,000 --> 00:00:06,030 >> [Zenelejátszási] 2 00:00:06,030 --> 00:00:08,390 >> DOUG LLOYD: pointerek, itt vagyunk. 3 00:00:08,390 --> 00:00:11,080 Ez valószínűleg fog a legnehezebb téma 4 00:00:11,080 --> 00:00:12,840 hogy beszélünk a CS50. 5 00:00:12,840 --> 00:00:15,060 És ha elolvastátok semmit mutatók 6 00:00:15,060 --> 00:00:19,080 Mielőtt lehet egy kicsit megfélemlítő megy ez a videó. 7 00:00:19,080 --> 00:00:21,260 Igaz, a mutatók nem teszi lehetővé a képesség, 8 00:00:21,260 --> 00:00:23,740 hogy talán csavart ki nagyon csúnyán, ha éppen 9 00:00:23,740 --> 00:00:27,450 dolgozó változók, és az adatok, és okozza a program összeomlik. 10 00:00:27,450 --> 00:00:30,490 De ők valóban igazán hasznos és lehetővé teszik számunkra, egy igazán nagyszerű módja 11 00:00:30,490 --> 00:00:33,340 adattovábbításhoz vissza között oda-funkciók, 12 00:00:33,340 --> 00:00:35,490 hogy mi vagyunk egyébként nem tudnák megtenni. 13 00:00:35,490 --> 00:00:37,750 >> És akkor mi van igazán akarok itt vonat 14 00:00:37,750 --> 00:00:41,060 Önnek, hogy jó mutató fegyelem, ezért amelyek segítségével hatékonyan mutatók 15 00:00:41,060 --> 00:00:43,850 hogy a programokat, hogy sokkal jobb. 16 00:00:43,850 --> 00:00:48,220 Mint mondtam mutató nekünk egy másik módja közötti adattovábbításhoz funkciókat. 17 00:00:48,220 --> 00:00:50,270 Most, ha visszahívja egy korábbi videó, amikor 18 00:00:50,270 --> 00:00:53,720 beszéltünk változókat, megemlítettem 19 00:00:53,720 --> 00:01:00,610 hogy minden adatot, hogy átadjuk között funkciókat C fogad el érték. 20 00:01:00,610 --> 00:01:03,070 És én nem használtam, hogy távú, mit akartam ott 21 00:01:03,070 --> 00:01:07,170 az volt, hogy haladunk példányban adatok. 22 00:01:07,170 --> 00:01:12,252 Ahogy átmegyünk egy változó függvénye, akkor nem is igazából halad a változó 23 00:01:12,252 --> 00:01:13,210 A funkció, ugye? 24 00:01:13,210 --> 00:01:17,670 Mi halad egy példányát ezeket az adatokat a funkciót. 25 00:01:17,670 --> 00:01:20,760 A funkció azt teszi, amit majd és kiszámítja néhány érték, 26 00:01:20,760 --> 00:01:23,180 és talán használhatjuk ezt az értéket ha ez ad vissza. 27 00:01:23,180 --> 00:01:26,700 >> Egy kivétel volt, hogy Ez a szabály az elhaladó értéket, 28 00:01:26,700 --> 00:01:31,210 és mi jön vissza, hogy mi egy kicsit később ebben a videóban. 29 00:01:31,210 --> 00:01:34,880 Ha az általunk használt mutatók helyett a változók használatára, 30 00:01:34,880 --> 00:01:38,180 vagy használata helyett a változók saját maguk, vagy másolatát a változók, 31 00:01:38,180 --> 00:01:43,790 most már át a változókat körül funkciók között eltérő módon. 32 00:01:43,790 --> 00:01:46,550 Ez azt jelenti, hogy ha teszünk a változás egyik funkciója, 33 00:01:46,550 --> 00:01:49,827 hogy a változás valóban megteszi hatása egy másik funkció. 34 00:01:49,827 --> 00:01:52,160 Ez megint valami, nem tudtunk csinálni korábban, 35 00:01:52,160 --> 00:01:56,979 és ha valaha is megpróbálta cserélni a értéke két változó függvénye, 36 00:01:56,979 --> 00:01:59,270 Ön is észrevette ezt a problémát fajta kúszik fel, ugye? 37 00:01:59,270 --> 00:02:04,340 >> Ha azt akarjuk, hogy a csere az X és Y, és mi át őket, hogy olyan függvény-swap, 38 00:02:04,340 --> 00:02:08,680 belsejében a funkció cserélni a változók nem árfolyamokat. 39 00:02:08,680 --> 00:02:12,600 Egy kettő lesz, két válik Egy, de valójában nem 40 00:02:12,600 --> 00:02:16,890 változtat semmit az eredeti funkciót, a hívó fél. 41 00:02:16,890 --> 00:02:19,550 Mivel nem tudjuk, mi csak dolgozó másolatát. 42 00:02:19,550 --> 00:02:24,760 A mutatók azonban azt is ténylegesen át X és Y függvényében. 43 00:02:24,760 --> 00:02:26,960 Hogy a funkció nem velük valamit. 44 00:02:26,960 --> 00:02:29,250 És azok a változók értékei ténylegesen változtatni. 45 00:02:29,250 --> 00:02:33,710 Szóval ez elég változás hogy képesek vagyunk együtt dolgozni adatokat. 46 00:02:33,710 --> 00:02:36,100 >> Mielőtt még belemerülnénk mutatók, azt hiszem, megéri 47 00:02:36,100 --> 00:02:38,580 vesz egy pár percet, hogy menj vissza az alapokhoz itt. 48 00:02:38,580 --> 00:02:41,000 És nézd meg, hogyan számítógép memóriájában munkák 49 00:02:41,000 --> 00:02:45,340 mert ez a két téma mennek hogy valóban elég egymással. 50 00:02:45,340 --> 00:02:48,480 Mint bizonyára tudja, a számítógépes rendszer 51 00:02:48,480 --> 00:02:51,310 van egy merevlemezt, vagy talán egy szilárdtest-meghajtó, 52 00:02:51,310 --> 00:02:54,430 valamiféle fájlok tárolási helyét. 53 00:02:54,430 --> 00:02:57,950 Ez általában valahol a szomszédságában 250 gigabájt 54 00:02:57,950 --> 00:02:59,810 hogy talán egy-két terabájt most. 55 00:02:59,810 --> 00:03:02,270 És ez az, ahol az összes Fájlok végül élni, 56 00:03:02,270 --> 00:03:04,870 akkor is, ha a számítógép leállításakor kapcsolva, akkor kapcsolja vissza 57 00:03:04,870 --> 00:03:09,190 és megtalálod a fájlok vannak újra, ha a rendszer újraindításához. 58 00:03:09,190 --> 00:03:14,820 De meghajtók, mint egy merevlemez-meghajtót, HDD, vagy a solid state drive, SSD, 59 00:03:14,820 --> 00:03:16,050 csak tárhelyet. 60 00:03:16,050 --> 00:03:20,400 >> Nem tudjuk valójában mit kezdeni Az adatok, hogy a merevlemez, 61 00:03:20,400 --> 00:03:22,080 vagy egy solid state drive. 62 00:03:22,080 --> 00:03:24,950 Annak érdekében, hogy valóban változtatni adatok vagy mozgatni, 63 00:03:24,950 --> 00:03:28,800 meg kell mozgatni, hogy RAM, véletlen hozzáférésű memória. 64 00:03:28,800 --> 00:03:31,170 Most RAM, van egy csomó kevesebb a számítógép. 65 00:03:31,170 --> 00:03:34,185 Lehet, hogy valahol a szomszédságában 512 megabájt 66 00:03:34,185 --> 00:03:38,850 ha van egy régebbi számítógép, hogy talán két, négy, nyolc, 16, 67 00:03:38,850 --> 00:03:41,820 talán még egy kicsit Több, gigabájtnyi RAM. 68 00:03:41,820 --> 00:03:46,390 Szóval ez sokkal kisebb, de ez ahol minden a volatilis van adat. 69 00:03:46,390 --> 00:03:48,270 Ez az, ahol meg tudjuk változtatni a dolgokat. 70 00:03:48,270 --> 00:03:53,350 De amikor fordítjuk a számítógépet, minden adat a RAM-ban megsemmisült. 71 00:03:53,350 --> 00:03:57,150 >> Szóval ezért van szükségünk merevlemez A több állandó helyszíne ez, 72 00:03:57,150 --> 00:03:59,720 úgy, hogy exists- amilyet akkor nagyon rossz, ha minden alkalommal, amikor 73 00:03:59,720 --> 00:04:03,310 fordult a számítógép kikapcsolása, minden fájlt a rendszer megsemmisült. 74 00:04:03,310 --> 00:04:05,600 Így dolgozunk belül RAM. 75 00:04:05,600 --> 00:04:09,210 És minden alkalommal beszélünk memória, elég sok, a CS50, 76 00:04:09,210 --> 00:04:15,080 beszélünk RAM, nem merevlemez. 77 00:04:15,080 --> 00:04:18,657 >> Tehát amikor azt mozgatni a dolgokat a memóriába, vesz fel egy bizonyos mennyiségű helyet. 78 00:04:18,657 --> 00:04:20,740 Minden adattípusok mi már dolgozunk 79 00:04:20,740 --> 00:04:23,480 vegye fel a különböző mennyiségű helyet a RAM-ban. 80 00:04:23,480 --> 00:04:27,600 Tehát minden alkalommal, amikor létrehoz egy egész szám változó, négy bájt memóriát 81 00:04:27,600 --> 00:04:30,750 helyez RAM, így lehet dolgozni, hogy egész. 82 00:04:30,750 --> 00:04:34,260 Akkor állapítsa meg egész, megváltoztatni, hozzárendelés 83 00:04:34,260 --> 00:04:36,700 a 10-es értéket eggyel nő által egy, így tovább és így tovább. 84 00:04:36,700 --> 00:04:39,440 Minden, ami kell történnie RAM, és kapsz négy bájt 85 00:04:39,440 --> 00:04:42,550 együttműködni minden egész hoz létre. 86 00:04:42,550 --> 00:04:45,410 >> Minden karakter létrehozni kap egy bájt. 87 00:04:45,410 --> 00:04:48,160 Ez csak mennyi hely áll tárolásához szükséges egy karaktert. 88 00:04:48,160 --> 00:04:51,310 Minden úszó, egy igazi számú, kap négy bájt 89 00:04:51,310 --> 00:04:53,390 hacsak nem egy kétágyas pontosságú lebegőpontos 90 00:04:53,390 --> 00:04:56,510 száma, amely lehetővé teszi, hogy hogy pontosabb vagy több számjegy 91 00:04:56,510 --> 00:04:59,300 tizedesvessző után anélkül, hogy elveszítené a pontosság, 92 00:04:59,300 --> 00:05:01,820 amelyek figyelembe nyolc bájt memóriát. 93 00:05:01,820 --> 00:05:06,730 Hosszú vágyik, igazán nagy egész számok, is vegye fel a nyolc bájt memóriát. 94 00:05:06,730 --> 00:05:09,000 Hány bájt memóriát ne húrok vegye fel? 95 00:05:09,000 --> 00:05:12,990 Hát mondjuk egy tűt a kérdésre most, de majd jön vissza hozzá. 96 00:05:12,990 --> 00:05:17,350 >> Tehát vissza ez a gondolat a memóriát egy nagy tömb byte nagyságú sejtek. 97 00:05:17,350 --> 00:05:20,871 Ez tényleg minden van, ez Csak egy hatalmas tömb sejtek, 98 00:05:20,871 --> 00:05:23,370 mint bármely más tömb Ön ismeri és látni, 99 00:05:23,370 --> 00:05:26,430 kivéve minden eleme egy byte széles. 100 00:05:26,430 --> 00:05:30,030 És csupán egy tömb, minden elemnek van egy címet. 101 00:05:30,030 --> 00:05:32,120 Minden elem egy tömb indexszel rendelkezik, és mi 102 00:05:32,120 --> 00:05:36,302 Használhatja az indexnek köze az úgynevezett véletlenszerű hozzáférés a tömb. 103 00:05:36,302 --> 00:05:38,510 Nem kell kezdeni az elején a tömb, 104 00:05:38,510 --> 00:05:40,569 halad végig minden egyetlen elem cikkére, 105 00:05:40,569 --> 00:05:41,860 hogy megtalálja, amit keres. 106 00:05:41,860 --> 00:05:45,790 Mi csak annyit szeretnék, hogy a 15. eleme vagy a 100. elem. 107 00:05:45,790 --> 00:05:49,930 És ha csak ama száma és kap az érték, amit keres. 108 00:05:49,930 --> 00:05:54,460 >> Hasonlóképpen, minden helyen A memóriában van egy címet. 109 00:05:54,460 --> 00:05:57,320 Tehát a memória esetleg valahogy így néz ki. 110 00:05:57,320 --> 00:06:01,420 Itt egy nagyon kicsi darab memória, ez 20 bájt memóriát. 111 00:06:01,420 --> 00:06:04,060 Az első 20 byte, mert a foglalkozik ott az alján 112 00:06:04,060 --> 00:06:08,890 0, 1, 2, 3, és így az egészen 19-ig. 113 00:06:08,890 --> 00:06:13,190 És amikor kijelentem, változók és Amikor elkezdek dolgozni velük, 114 00:06:13,190 --> 00:06:15,470 a rendszer fog beállítani Szánjon helyet a számomra 115 00:06:15,470 --> 00:06:17,595 ebben a memória dolgozni az én változók. 116 00:06:17,595 --> 00:06:21,610 Tehát azt mondhatnám, char c egyenlő fővárosban H. És mi fog történni? 117 00:06:21,610 --> 00:06:23,880 Nos, a rendszer fog félretett nekem egy bájt. 118 00:06:23,880 --> 00:06:27,870 Ebben az esetben úgy döntött bájtos szám Négy, a byte címen négy, 119 00:06:27,870 --> 00:06:31,310 és ez megy tárolására nagybetű H ott nekem. 120 00:06:31,310 --> 00:06:34,350 Ha én akkor azt mondják int sebesség határértéket eléri a 65, ez 121 00:06:34,350 --> 00:06:36,806 lesz pihentetett négy byte memóriát nekem. 122 00:06:36,806 --> 00:06:39,180 És ez meg fog kezelni e négy bájt, mint egyetlen egység 123 00:06:39,180 --> 00:06:41,305 mert mi dolgozunk A egész szám van. 124 00:06:41,305 --> 00:06:44,350 És ez meg fog tárolni 65 odabent. 125 00:06:44,350 --> 00:06:47,000 >> Most már én vagyok ilyen mondom egy kis hazugság, 126 00:06:47,000 --> 00:06:50,150 jobb, mert tudjuk, hogy számítógépek dolgozik bináris. 127 00:06:50,150 --> 00:06:53,100 Nem értik, feltétlenül, amit a főváros H 128 00:06:53,100 --> 00:06:57,110 vagy mi a 65, csak megérteni bináris, nullák. 129 00:06:57,110 --> 00:06:59,000 És így valójában mi mi tárolására ott 130 00:06:59,000 --> 00:07:03,450 nem a H betű és a szám 65, hanem inkább a bináris reprezentációk 131 00:07:03,450 --> 00:07:06,980 bekezdésére, amelyek úgy néznek ki a kicsit valami ilyesmi. 132 00:07:06,980 --> 00:07:10,360 És különösen a összefüggésben az egész változó, 133 00:07:10,360 --> 00:07:13,559 ez nem fog csak köpje be, ez nem fog kezelni, hogy egy négy 134 00:07:13,559 --> 00:07:15,350 byte darab feltétlenül, mert tulajdonképpen ez lesz 135 00:07:15,350 --> 00:07:19,570 kezelje azt a négy egy byte darabokat, ami valahogy így néz ki. 136 00:07:19,570 --> 00:07:22,424 És még ez sem teljesen igaz vagy, 137 00:07:22,424 --> 00:07:24,840 mert az úgynevezett Egy végződést, amely nem vagyunk 138 00:07:24,840 --> 00:07:26,965 lesz bejutni most, de Ha kíváncsi vagy, 139 00:07:26,965 --> 00:07:29,030 akkor olvass utána a kis és a nagy végződést. 140 00:07:29,030 --> 00:07:31,640 De a kedvéért ezt az érvelést, kedvéért ezt a videót, 141 00:07:31,640 --> 00:07:34,860 most csak feltételezik, hogy van, Tény, hogy a szám milyen lenne 65 142 00:07:34,860 --> 00:07:36,970 képviselteti magát memória minden rendszeren, 143 00:07:36,970 --> 00:07:38,850 bár ez nem teljesen igaz. 144 00:07:38,850 --> 00:07:41,700 >> De nézzük valóban csak kap megszabadulni az összes bináris teljesen, 145 00:07:41,700 --> 00:07:44,460 és gondoljuk át, mint a H és 65, ez sokkal könnyebb 146 00:07:44,460 --> 00:07:47,900 gondolni rá, mint hogy mint egy emberi lény. 147 00:07:47,900 --> 00:07:51,420 Rendben, így is, úgy tűnik, talán egy kis véletlen, hogy I've- a rendszerem 148 00:07:51,420 --> 00:07:55,130 nem ad nekem bájt 5, 6, 7, és a 8., hogy tárolja a egész szám. 149 00:07:55,130 --> 00:07:58,580 Van egy oka van is, ami nem fogunk bejutni most, de elegendő 150 00:07:58,580 --> 00:08:00,496 azt mondani, hogy mi a számítógép csinál itt 151 00:08:00,496 --> 00:08:02,810 Valószínűleg egy jó lépés a részéről. 152 00:08:02,810 --> 00:08:06,020 Hogy nem ad nekem a memória, ami szükségszerűen háttal. 153 00:08:06,020 --> 00:08:10,490 Bár ez fog csinálni most ha azt akarom, hogy egy másik szöveg, 154 00:08:10,490 --> 00:08:13,080 nevű eredetű, és azt akarom, hogy Lloyd ott. 155 00:08:13,080 --> 00:08:18,360 Megyek kell, hogy illeszkedjen egy karakter, minden betűt, ami 156 00:08:18,360 --> 00:08:21,330 lesz szükség egy karakter, egy bájtot. 157 00:08:21,330 --> 00:08:26,230 Tehát, ha tudtam tenni Lloyd az én tömb mint ez én vagyok elég jó, hogy menjen, ugye? 158 00:08:26,230 --> 00:08:28,870 Mi hiányzik? 159 00:08:28,870 --> 00:08:31,840 >> Ne feledje, hogy minden húr dolgozunk A C-ben végződik backslash nulla, 160 00:08:31,840 --> 00:08:33,339 és nem hiányozhat, hogy itt sem. 161 00:08:33,339 --> 00:08:36,090 Meg kell félre egy bájt memória állapította meg, hogy így 162 00:08:36,090 --> 00:08:39,130 tudom, mikor a string véget ért. 163 00:08:39,130 --> 00:08:41,049 Tehát megint ez a megállapodás A dolgok 164 00:08:41,049 --> 00:08:42,799 jelennek meg a memóriában erejével egy kicsit véletlenszerű, 165 00:08:42,799 --> 00:08:44,870 de valójában az, hogy hogyan A legtöbb rendszer célja. 166 00:08:44,870 --> 00:08:48,330 Sorban őket a többszörösei négy okokból ismét 167 00:08:48,330 --> 00:08:50,080 hogy nem kell, hogy bejutni most. 168 00:08:50,080 --> 00:08:53,060 De ez, tehát elég annyit mondani, hogy Ezek után három sornyi kódot, 169 00:08:53,060 --> 00:08:54,810 ez az, ami a memória nézhet. 170 00:08:54,810 --> 00:08:58,930 Ha szükségem memória helyek 4, 8 és 12, hogy tartsa meg az adataimat, 171 00:08:58,930 --> 00:09:01,100 ez az, amit az emlékezetemben nézhet. 172 00:09:01,100 --> 00:09:04,062 >> És csak különösen pedáns itt, ha 173 00:09:04,062 --> 00:09:06,020 beszélünk memória címek szoktunk 174 00:09:06,020 --> 00:09:08,390 Ehhez hexadecimális jelölést. 175 00:09:08,390 --> 00:09:12,030 Szóval miért nem konvertálja az összes ilyen a decimális hexadecimálisat 176 00:09:12,030 --> 00:09:15,010 csak azért, mert ez általában hogyan utalunk memóriát. 177 00:09:15,010 --> 00:09:17,880 Így ahelyett, hogy 0-tól 19, amink van, az nulla 178 00:09:17,880 --> 00:09:20,340 x nulla és zéró x1 három. 179 00:09:20,340 --> 00:09:23,790 Azok a 20 bájt memóriát, hogy mi már vagy keresünk ezen a képen 180 00:09:23,790 --> 00:09:25,540 pont itt. 181 00:09:25,540 --> 00:09:29,310 >> Tehát az összes, hogy azt mondta, menjünk lépésre a memória egy második 182 00:09:29,310 --> 00:09:30,490 és vissza mutatók. 183 00:09:30,490 --> 00:09:32,420 Itt a legfontosabb dolog, hogy emlékezzen 184 00:09:32,420 --> 00:09:34,070 ahogy elkezdünk dolgozni a mutató. 185 00:09:34,070 --> 00:09:36,314 Egy mutató semmi több, mint egy címet. 186 00:09:36,314 --> 00:09:38,230 Én elmondom még egyszer, mert ez ilyen fontos, 187 00:09:38,230 --> 00:09:42,730 egy mutató semmi több, mint egy címet. 188 00:09:42,730 --> 00:09:47,760 Pointerek címeket helyek a memóriában, ahol a változók élnek. 189 00:09:47,760 --> 00:09:52,590 Tudva, hogy ez lesz remélhetőleg kicsit könnyebb velük dolgozni. 190 00:09:52,590 --> 00:09:54,550 A másik dolog, amit szeretek tennie, hogy van valami 191 00:09:54,550 --> 00:09:58,510 ábrák vizuálisan képviselő mi történik különböző sornyi kódot. 192 00:09:58,510 --> 00:10:00,660 És mi ezt egy pár alkalommal a mutatók, 193 00:10:00,660 --> 00:10:03,354 és amikor beszélünk dinamikus memóriafoglalási is. 194 00:10:03,354 --> 00:10:06,020 Mert azt hiszem, hogy ezek a diagramok különösen akkor lehet hasznos. 195 00:10:06,020 --> 00:10:09,540 >> Tehát, ha azt mondom, például int k a kódomat, mi történik? 196 00:10:09,540 --> 00:10:12,524 Nos, mi alapvetően az történik, Kezdek memória félre nekem, 197 00:10:12,524 --> 00:10:14,690 de én nem is szeretek Gondolj bele, mint, hogy én 198 00:10:14,690 --> 00:10:16,300 szeretnék gondolni rá, mint egy doboz. 199 00:10:16,300 --> 00:10:20,090 Nekem van egy doboz, és ez zöld színű, mert 200 00:10:20,090 --> 00:10:21,750 nem tud egész zöld doboz. 201 00:10:21,750 --> 00:10:23,666 Ha ez volt a karakter, Lehet, hogy egy kék mezőben. 202 00:10:23,666 --> 00:10:27,290 De én mindig azt mondom, ha hozok létre egy doboz, amely képes egész 203 00:10:27,290 --> 00:10:28,950 hogy a dobozban zöld színű. 204 00:10:28,950 --> 00:10:33,020 És veszek egy filctollal és írok k oldalán azt. 205 00:10:33,020 --> 00:10:37,590 Szóval van egy doboz úgynevezett k, amelybe tudom rakni egészek. 206 00:10:37,590 --> 00:10:41,070 Tehát amikor azt mondom, int k, ez mi történik a fejemben. 207 00:10:41,070 --> 00:10:43,140 Ha azt mondom, k egyenlő öttel, mit csinálok? 208 00:10:43,140 --> 00:10:45,110 Nos, én üzembe öt A doboz, ugye. 209 00:10:45,110 --> 00:10:48,670 Ez elég egyértelmű, ha Azt mondom, int k, hozzon létre egy doboz úgynevezett k. 210 00:10:48,670 --> 00:10:52,040 Ha azt mondom, k = 5, tedd öt a dobozba. 211 00:10:52,040 --> 00:10:53,865 Remélhetőleg ez nem túl sok egy ugrás. 212 00:10:53,865 --> 00:10:55,990 Itt, ahol a dolgok egy kicsit érdekes, bár. 213 00:10:55,990 --> 00:11:02,590 Ha azt mondom, int * pk, illetve akkor is, ha nem tudom, mi ez szükségszerűen azt jelenti, 214 00:11:02,590 --> 00:11:06,150 ez egyértelműen van valami köze egy egész szám. 215 00:11:06,150 --> 00:11:08,211 Így fogok színezni ez a rovat zöld-szerű, 216 00:11:08,211 --> 00:11:10,210 Tudom, hogy van valami, köze egy egész szám, 217 00:11:10,210 --> 00:11:13,400 de ez nem egy egész szám önmagában, mert egy int csillag. 218 00:11:13,400 --> 00:11:15,390 Van valami enyhén különböző róla. 219 00:11:15,390 --> 00:11:17,620 Tehát egy egész szám benne van, de egyébként ez 220 00:11:17,620 --> 00:11:19,830 nem túl eltér mit beszéltünk. 221 00:11:19,830 --> 00:11:24,240 Ez egy doboz, annak van egy címke, ez van rajta egy címke pk, 222 00:11:24,240 --> 00:11:27,280 és ez képes a gazdaság int csillagok, függetlenül azok. 223 00:11:27,280 --> 00:11:29,894 Van valami köze egész számokkal, egyértelműen. 224 00:11:29,894 --> 00:11:31,060 Itt az utolsó sort mégis. 225 00:11:31,060 --> 00:11:37,650 Ha azt mondom, pk = & k, hé, mi történt, ugye? 226 00:11:37,650 --> 00:11:41,820 Szóval ez a véletlen szám, látszólag véletlenszerű számú, kap dobott a dobozban. 227 00:11:41,820 --> 00:11:44,930 Minden, ami van, pk kapja a címét k. 228 00:11:44,930 --> 00:11:52,867 Szóval én vagyok maradva, ahol k él a memóriában, címét, a címet a bájt. 229 00:11:52,867 --> 00:11:55,200 Minden csinálok mondok ez az érték, amit én fogok 230 00:11:55,200 --> 00:11:59,430 hogy belső én box nevű pk. 231 00:11:59,430 --> 00:12:02,080 És mivel ezek a dolgok mutatók, valamint azért, mert keres 232 00:12:02,080 --> 00:12:04,955 egy húr, mint a nulla x Nyolc nulla c hét négy nyolc 233 00:12:04,955 --> 00:12:07,790 Két nulla valószínűleg Nem nagyon értelmes. 234 00:12:07,790 --> 00:12:12,390 Amikor mi általában elképzelni mutatók, valójában nem annyira, mint a mutatók. 235 00:12:12,390 --> 00:12:17,000 Pk ad nekünk az információkat meg kell találnunk k emlékére. 236 00:12:17,000 --> 00:12:19,120 Tehát alapvetően pk van egy nyíl benne. 237 00:12:19,120 --> 00:12:21,670 És ha sétálunk hosszát Az, hogy a nyíl, képzeld 238 00:12:21,670 --> 00:12:25,280 ez valami sétálhatunk, ha séta hossza mentén a nyíl, 239 00:12:25,280 --> 00:12:29,490 a nagyon hegyét, hogy nyíl, mi fogja találni a helyét a memóriában 240 00:12:29,490 --> 00:12:31,390 ahol k él. 241 00:12:31,390 --> 00:12:34,360 És ez nagyon fontos mert ha egyszer tudjuk, hogy hol él k, 242 00:12:34,360 --> 00:12:37,870 kezdhetjük a munkát az adatokkal belsejét, hogy memóriaterület. 243 00:12:37,870 --> 00:12:40,780 Bár mi a sorstól egy ici kicsit előre magunkat most. 244 00:12:40,780 --> 00:12:42,240 >> Tehát mi egy pointer? 245 00:12:42,240 --> 00:12:45,590 A mutató olyan adat, amelynek érték egy memória címet. 246 00:12:45,590 --> 00:12:49,740 Ez volt, hogy a zéró x nyolc nulla cucc folyik, ez volt a memória címet. 247 00:12:49,740 --> 00:12:52,060 Ez volt a hely a memóriában. 248 00:12:52,060 --> 00:12:55,080 És típusa egy mutató leírja, hogy milyen 249 00:12:55,080 --> 00:12:56,930 Az adatok találsz itt hogy a memória címet. 250 00:12:56,930 --> 00:12:58,810 Szóval van a int csillagos rész jobb. 251 00:12:58,810 --> 00:13:03,690 Ha követem, hogy nyilat, ez fog vezetni, hogy egy helyen. 252 00:13:03,690 --> 00:13:06,980 És ezen a helyen, amit én találsz ott az én például, 253 00:13:06,980 --> 00:13:08,240 egy zöld színű dobozban. 254 00:13:08,240 --> 00:13:12,650 Ez egy egész szám, ez az, amit én Találsz ha elmegyek arra a címre. 255 00:13:12,650 --> 00:13:14,830 Az adatok típusát pointer leírja, hogy mi 256 00:13:14,830 --> 00:13:17,936 meg fogja találni ebben a memória címre. 257 00:13:17,936 --> 00:13:19,560 Tehát itt a nagyon klassz dolog, mégis. 258 00:13:19,560 --> 00:13:25,090 Pointerek lehetővé teszi számunkra, hogy adja át változók közötti funkciók. 259 00:13:25,090 --> 00:13:28,520 És valóban át változók és nem adja át másolatát. 260 00:13:28,520 --> 00:13:32,879 Mert ha nem tudjuk pontosan, hol A memóriában található egy változó, 261 00:13:32,879 --> 00:13:35,670 nem kell, hogy egy példányt ez, tudjuk csak megy arra a helyre 262 00:13:35,670 --> 00:13:37,844 és a munka, hogy a változó. 263 00:13:37,844 --> 00:13:40,260 Tehát lényegében mutató sort Az, hogy egy számítógépes környezet 264 00:13:40,260 --> 00:13:42,360 sokkal több, mint a valós világban, ugye. 265 00:13:42,360 --> 00:13:44,640 >> Tehát itt egy analógia. 266 00:13:44,640 --> 00:13:48,080 Tegyük fel, hogy van egy notebook, Rendben, és tele van jegyzetek. 267 00:13:48,080 --> 00:13:50,230 És szeretném, ha frissíteni. 268 00:13:50,230 --> 00:13:53,960 Ön egy függvényt, frissítések jegyzetek, ugye. 269 00:13:53,960 --> 00:13:56,390 Az utat jártunk munka eddig, milyen 270 00:13:56,390 --> 00:14:02,370 történik, akkor veszem a notebook, akkor megy a másolás boltba, 271 00:14:02,370 --> 00:14:06,410 akkor, hogy a Xerox másolatát minden oldalon a notebook. 272 00:14:06,410 --> 00:14:09,790 Majd hagyni a notebook vissza az asztalomon, ha végeztél, 273 00:14:09,790 --> 00:14:14,600 akkor menj és húzd át a dolgokat az én notebook, hogy elavultak, vagy rossz, 274 00:14:14,600 --> 00:14:19,280 és akkor majd át vissza nekem a köteg Xerox oldalak 275 00:14:19,280 --> 00:14:22,850 ez egy replika az én notebook A változások, hogy már meghozta hozzá. 276 00:14:22,850 --> 00:14:27,040 És ezen a ponton, ez akár nekem, mint A hívó függvény, mint a hívó, 277 00:14:27,040 --> 00:14:30,582 eldönteni, hogy a jegyzetek és integrálni őket vissza a notebookon. 278 00:14:30,582 --> 00:14:32,540 Szóval van egy csomó lépést itt szó, ugye. 279 00:14:32,540 --> 00:14:34,850 Tetszik, nem lenne jobb, ha én csak azt mondom, hé, te is 280 00:14:34,850 --> 00:14:38,370 frissítem a notebook számára Számomra a kezedbe a notebookon, 281 00:14:38,370 --> 00:14:40,440 és veszel dolgokat, és Szó szerint át őket 282 00:14:40,440 --> 00:14:42,810 és frissíti a jegyzeteimet a notebookon. 283 00:14:42,810 --> 00:14:45,140 És akkor add ide a notebook vissza. 284 00:14:45,140 --> 00:14:47,320 Ez a fajta, amit mutatók lehetővé teszik számunkra, hogy nem, 285 00:14:47,320 --> 00:14:51,320 teszik ezt a környezetet a sok Több, mint hogy hogyan működünk a valóságban. 286 00:14:51,320 --> 00:14:54,640 >> Rendben, hogy az, amit a mutató, beszéljünk 287 00:14:54,640 --> 00:14:58,040 hogyan mutatókat dolgoznak C, és hogyan tudunk kezdeni velük dolgozni. 288 00:14:58,040 --> 00:15:02,550 Szóval van egy nagyon egyszerű mutatót C úgynevezett null pointer. 289 00:15:02,550 --> 00:15:04,830 A null mutató semmit. 290 00:15:04,830 --> 00:15:08,310 Ez talán úgy tűnik, mintha valójában nem egy nagyon hasznos dolog, 291 00:15:08,310 --> 00:15:10,500 de mint látni fogjuk a kicsit később, az a tény, 292 00:15:10,500 --> 00:15:15,410 hogy ez a null mutató létezik Igazából nagyon jól jöhet. 293 00:15:15,410 --> 00:15:19,090 És amikor létrehoz egy mutatót, és nem az értéke immediately- 294 00:15:19,090 --> 00:15:21,060 egy példa a beállítás értéke azonnal 295 00:15:21,060 --> 00:15:25,401 lesz egy-két diák vissza amikor azt mondtam pk megegyezik & k, 296 00:15:25,401 --> 00:15:28,740 pk kapja k címén is, majd meglátjuk, hogy ez mit jelent, 297 00:15:28,740 --> 00:15:32,990 majd meglátjuk, hogyan kell a kódot, hogy shortly- ha nem az értéke legyen valami 298 00:15:32,990 --> 00:15:35,380 értelmes azonnal, mindig kell 299 00:15:35,380 --> 00:15:37,480 állítsa be mutatóját a null. 300 00:15:37,480 --> 00:15:40,260 Be kell állítani azt, hogy pont semmit. 301 00:15:40,260 --> 00:15:43,614 >> Ez nagyon más, mint csak elhagyja a értéke, ahogy van 302 00:15:43,614 --> 00:15:45,530 majd nyilvánító mutatót, és csak feltételezve 303 00:15:45,530 --> 00:15:48,042 ez null mert ez ritkán igaz. 304 00:15:48,042 --> 00:15:50,000 Ezért mindig meg kell állítani az értéke egy mutató 305 00:15:50,000 --> 00:15:55,690 null, ha nem az értéke hogy valami értelmes azonnal. 306 00:15:55,690 --> 00:15:59,090 Ellenőrizheti, hogy egy mutató értékét null az operátorral 307 00:15:59,090 --> 00:16:05,450 (==), Mint te hasonlítsa bármely egész értékek vagy karakter értékeket (==) 308 00:16:05,450 --> 00:16:06,320 is. 309 00:16:06,320 --> 00:16:10,994 Ez egy különleges fajta állandó értéket, amelyek segítségével tesztelni. 310 00:16:10,994 --> 00:16:13,160 Szóval ez egy nagyon egyszerű, mutatót, a null pointer. 311 00:16:13,160 --> 00:16:15,320 Egy másik módja, hogy hozzon létre A mutató kivonat 312 00:16:15,320 --> 00:16:18,240 a címét egy változó már létrehozott, 313 00:16:18,240 --> 00:16:22,330 és ezt megteszi a & üzemeltető címet kitermelése. 314 00:16:22,330 --> 00:16:26,720 Amit már láttam korábban Az első ábrán például megmutattam. 315 00:16:26,720 --> 00:16:31,450 Tehát, ha x egy változó, hogy már már létrehozott típusú egész, 316 00:16:31,450 --> 00:16:35,110 Ezután & x egy mutató egy egész szám. 317 00:16:35,110 --> 00:16:39,810 & x is- emlékszem, és megy kivonat A címe valami a jobb. 318 00:16:39,810 --> 00:16:45,350 És mivel a mutató csak egy cím, mint & x egy mutató egy egész szám 319 00:16:45,350 --> 00:16:48,560 amelynek értéke az, ahol a memóriában x életét. 320 00:16:48,560 --> 00:16:50,460 Ez x címét. 321 00:16:50,460 --> 00:16:53,296 Tehát & x a x címét. 322 00:16:53,296 --> 00:16:55,670 Vessünk egy lépéssel tovább csatlakozni valamit 323 00:16:55,670 --> 00:16:58,380 Utaltam egy korábbi videó. 324 00:16:58,380 --> 00:17:06,730 Ha arr egy tömb páros, akkor & arr szögletes zárójel i Pointer 325 00:17:06,730 --> 00:17:08,109 kettős. 326 00:17:08,109 --> 00:17:08,970 OKÉ. 327 00:17:08,970 --> 00:17:12,160 arr szögletes zárójel i, ha arr egy tömb páros, 328 00:17:12,160 --> 00:17:19,069 akkor arr szögletes zárójel i az i-edik eleme az, hogy a tömb, 329 00:17:19,069 --> 00:17:29,270 és & arr szögletes zárójel i, ahol a memória i-edik elemét arr létezik. 330 00:17:29,270 --> 00:17:31,790 >> Szóval mi a gondolat itt? 331 00:17:31,790 --> 00:17:34,570 Egy tömbök nevét, a hatása ezt az egészet, 332 00:17:34,570 --> 00:17:39,290 az, hogy a tömb neve valójában maga a mutató. 333 00:17:39,290 --> 00:17:41,170 Már dolgozik mutatókkal végig 334 00:17:41,170 --> 00:17:45,290 minden alkalommal, hogy már használt egy tömbben. 335 00:17:45,290 --> 00:17:49,090 Ne feledje, a példa A változó alkalmazási körét, 336 00:17:49,090 --> 00:17:53,420 vége felé a videó bemutatom egy példát, ahol van egy funkció 337 00:17:53,420 --> 00:17:56,890 úgynevezett set int és nevezett funkció beállított tömb. 338 00:17:56,890 --> 00:18:00,490 És a kihívást, hogy meghatározzák e, vagy sem, vagy hogy mi a 339 00:18:00,490 --> 00:18:03,220 értékeket, hogy kinyomtatják a végén a függvény, 340 00:18:03,220 --> 00:18:05,960 a végén a fő program. 341 00:18:05,960 --> 00:18:08,740 >> Ha felidézzük az adott példában vagy ha már figyelte a videó, 342 00:18:08,740 --> 00:18:13,080 tudod, hogy ha nektek a hívást set int hatékonyan nem csinál semmit. 343 00:18:13,080 --> 00:18:16,390 De a felhívást, hogy állítsa tömb nem. 344 00:18:16,390 --> 00:18:19,280 És valahogy elkenték miért ez volt a helyzet abban az időben. 345 00:18:19,280 --> 00:18:22,363 Csak azt mondtam, jól ez a tömb, ez Különleges, tudod, van egy oka van. 346 00:18:22,363 --> 00:18:25,020 Ennek oka, hogy egy tömb Név tényleg csak egy mutató, 347 00:18:25,020 --> 00:18:28,740 és itt van ez a különleges szögletes zárójel szintaxist 348 00:18:28,740 --> 00:18:30,510 Hogy a dolgok sokkal szebb dolgozni. 349 00:18:30,510 --> 00:18:34,410 És hogy az ötlet egy mutató sokkal kevésbé félelmetes, 350 00:18:34,410 --> 00:18:36,800 és ezért ők a fajta A bemutatott így. 351 00:18:36,800 --> 00:18:38,600 De tényleg tömbök csak mutatók. 352 00:18:38,600 --> 00:18:41,580 És ezért, amikor változtattunk a tömb, 353 00:18:41,580 --> 00:18:44,880 amikor elhaladtunk egy tömbben, mint a paraméter hogy egy funkció vagy érvként 354 00:18:44,880 --> 00:18:50,110 arra a funkcióra, a tartalmát a tömb valóban megváltoztatta mind a hívott 355 00:18:50,110 --> 00:18:51,160 és a hívó fél. 356 00:18:51,160 --> 00:18:55,846 Amely minden más fajta változó láttuk nem volt a helyzet. 357 00:18:55,846 --> 00:18:58,970 Szóval ez csak valami, hogy tartsa bánja, ha éppen dolgozik mutatók, 358 00:18:58,970 --> 00:19:01,610 az, hogy a neve egy tömb valójában egy mutató 359 00:19:01,610 --> 00:19:04,750 Az első elem a tömb. 360 00:19:04,750 --> 00:19:08,930 >> OK, így most már mindezeket tények, hadd folytassam, ugye. 361 00:19:08,930 --> 00:19:11,370 Miért érdekel ahol valami él. 362 00:19:11,370 --> 00:19:14,120 Nos, mint mondtam, ez elég Hasznos tudni, hogy hol lakik valamit 363 00:19:14,120 --> 00:19:17,240 így megy oda, és változtassa meg. 364 00:19:17,240 --> 00:19:19,390 Vele dolgozni, és ténylegesen van a dolog, hogy 365 00:19:19,390 --> 00:19:23,710 akarom, hogy a változó hatályba lépnek, és nem lépnek életbe, néhány példányt belőle. 366 00:19:23,710 --> 00:19:26,150 Ez az úgynevezett dereferencing. 367 00:19:26,150 --> 00:19:28,690 Mi megy a referencia és megváltoztatjuk az értéket is. 368 00:19:28,690 --> 00:19:32,660 Tehát ha van egy mutatót, és úgy hívják pc, és ez arra utal, hogy egy karaktert, 369 00:19:32,660 --> 00:19:40,610 akkor azt mondhatjuk * pc és * PC a nevét, mit fogunk találni, ha megyünk 370 00:19:40,610 --> 00:19:42,910 A cím pc. 371 00:19:42,910 --> 00:19:47,860 Mit találunk van egy karakter, és * pc hogyan utalunk az adatokat, hogy 372 00:19:47,860 --> 00:19:48,880 helyen. 373 00:19:48,880 --> 00:19:54,150 Tehát azt mondhatjuk, valami ilyesmit * db = D, vagy valami ilyesmi, 374 00:19:54,150 --> 00:19:59,280 és ez azt jelenti, hogy bármilyen volt memória cím pc, 375 00:19:59,280 --> 00:20:07,040 bármilyen jellegű korábban van, most D, ha azt mondjuk, * A PC = D. 376 00:20:07,040 --> 00:20:10,090 >> Tehát itt vagyunk újra furcsa C cucc, ugye. 377 00:20:10,090 --> 00:20:14,560 Így láttuk * korábban, hogy a Valahogy az adatok egy részét típusú, 378 00:20:14,560 --> 00:20:17,160 és most ez is használják Egy kicsit más kontextusban 379 00:20:17,160 --> 00:20:19,605 az adatokhoz való hozzáféréshez egy helyen. 380 00:20:19,605 --> 00:20:22,480 Tudom, hogy ez egy kicsit zavaró és ez valójában része ennek az egész 381 00:20:22,480 --> 00:20:25,740 mint, hogy miért van ez a mutató mitológia körülöttük, hogy annyira bonyolult, 382 00:20:25,740 --> 00:20:28,250 egyfajta szintaktikai probléma, őszintén. 383 00:20:28,250 --> 00:20:31,810 De * alkalmazunk mindkét kontextusban, mindkét részeként a típus neve, 384 00:20:31,810 --> 00:20:34,100 és majd meglátjuk, egy kicsit Később még valami mást is. 385 00:20:34,100 --> 00:20:36,490 És most a követéssel üzemeltető. 386 00:20:36,490 --> 00:20:38,760 Így megy ez a referencia, az csatlakozik az adatokat 387 00:20:38,760 --> 00:20:43,000 a helyét a mutató, és lehetővé teszi, hogy manipulálni az lesz. 388 00:20:43,000 --> 00:20:45,900 >> Most ez nagyon hasonló a meglátogatta a szomszédja, jobb. 389 00:20:45,900 --> 00:20:48,710 Ha tudod, mi a szomszéd él, te 390 00:20:48,710 --> 00:20:50,730 Nem lóg ki a szomszédja. 391 00:20:50,730 --> 00:20:53,510 Tudod, akkor megtörténhet, hogy tudom, hogy hol élnek, 392 00:20:53,510 --> 00:20:56,870 de ez nem jelenti azt, hogy a ján, hogy a tudás 393 00:20:56,870 --> 00:20:59,170 Ön kölcsönhatásban áll velük. 394 00:20:59,170 --> 00:21:01,920 Ha azt szeretnénk, hogy kölcsönhatásba lépnek velük, el kell menni a házba, 395 00:21:01,920 --> 00:21:03,760 Önnek kell menni, ahol élnek. 396 00:21:03,760 --> 00:21:07,440 És ha egyszer csinálni, akkor kölcsönhatásba 397 00:21:07,440 --> 00:21:09,420 velük csak tetszik, szeretnéd. 398 00:21:09,420 --> 00:21:12,730 És hasonlóképpen változók, el kell menni a címére 399 00:21:12,730 --> 00:21:15,320 Ha azt szeretnénk, hogy kölcsönhatásba lépnek velük, nem lehet csak úgy tudja a címet. 400 00:21:15,320 --> 00:21:21,495 És ahogy megy a cím használható *, a hivatkozás feloldási üzemeltető. 401 00:21:21,495 --> 00:21:23,620 Mit gondol, mi történik ha megpróbáljuk és hivatkozás feloldási 402 00:21:23,620 --> 00:21:25,260 egy mutató, amelynek értéke null? 403 00:21:25,260 --> 00:21:28,470 Emlékezzünk vissza, hogy a null mutató semmit. 404 00:21:28,470 --> 00:21:34,110 Tehát ha megpróbálod dereference semmit, vagy menjen egy cím sem, 405 00:21:34,110 --> 00:21:36,800 Mit gondol, mi történik? 406 00:21:36,800 --> 00:21:39,630 Hát ha kitalálta szegmentáció Hiba, igazad van. 407 00:21:39,630 --> 00:21:41,390 Ha megpróbálod, és dereference null pointer, 408 00:21:41,390 --> 00:21:43,140 szenved a szegmentáció hibája. De várj, 409 00:21:43,140 --> 00:21:45,820 Nem azt mondom, hogy ha nem mész 410 00:21:45,820 --> 00:21:49,220 beállíthatjuk, hogy a értéke a mutatót valami értelmes, 411 00:21:49,220 --> 00:21:51,000 akkor null? 412 00:21:51,000 --> 00:21:55,290 Tettem, és valójában a szegmentáció hiba fajta jó viselkedés. 413 00:21:55,290 --> 00:21:58,680 >> Előfordult már kijelentette, a változó és Nem rendelt érték azonnal? 414 00:21:58,680 --> 00:22:02,680 Szóval csak annyit int x; te nem ténylegesen rendelje hozzá semmit 415 00:22:02,680 --> 00:22:05,340 majd később a kódot, nyomtassa ki az x értékét, 416 00:22:05,340 --> 00:22:07,650 mivel még mindig nem rendelt el semmit. 417 00:22:07,650 --> 00:22:10,370 Gyakran kapsz nulla, de néha 418 00:22:10,370 --> 00:22:15,000 lehet, hogy néhány véletlenszerű szám, Önnek fogalma sincs, hogy honnan jött. 419 00:22:15,000 --> 00:22:16,750 Hasonlóképpen lehet a dolgokat megtörténjen a mutató. 420 00:22:16,750 --> 00:22:20,110 Amikor egy olyan mutatót int * pk például 421 00:22:20,110 --> 00:22:23,490 és nem látja, hogy egy értéket, Ön négy byte memóriát. 422 00:22:23,490 --> 00:22:25,950 Bármi négy bájt memória a rendszer 423 00:22:25,950 --> 00:22:28,970 találják, hogy van valamilyen értelmes értéket. 424 00:22:28,970 --> 00:22:31,760 És ott lehetett volna valamit már ott, hogy 425 00:22:31,760 --> 00:22:34,190 már nincs szükség újabb funkciót, így csak ki kell 426 00:22:34,190 --> 00:22:35,900 bármilyen adatot is ott volt. 427 00:22:35,900 --> 00:22:40,570 >> Mi van, ha próbáltam csinálni hivatkozás feloldási Néhány cím, amit don't- voltak 428 00:22:40,570 --> 00:22:43,410 Már byte és információk Íme, itt most a mutató. 429 00:22:43,410 --> 00:22:47,470 Ha megpróbálod, és követéssel, hogy a mutató, lehet, hogy a Messiás egy bizonyos memória 430 00:22:47,470 --> 00:22:49,390 hogy nem állt szándékában bajlódni vele minden. 431 00:22:49,390 --> 00:22:51,639 És valóban meg tudná csinálni valami igazán pusztító, 432 00:22:51,639 --> 00:22:54,880 mint megtörni egy másik program, vagy megszakítani egy másik funkció, 433 00:22:54,880 --> 00:22:58,289 vagy valami rosszindulatú, hogy hogy nem szándékozik tenni egyáltalán. 434 00:22:58,289 --> 00:23:00,080 És ez az, amiért ez valójában egy jó ötlet 435 00:23:00,080 --> 00:23:04,030 beállíthatjuk, hogy a mutató nincs, ha ne állítsa őket, hogy valami értelmes. 436 00:23:04,030 --> 00:23:06,760 Ez talán jobb a A nap végén a programot 437 00:23:06,760 --> 00:23:09,840 hogy összeomlik majd, hogy ezt valami, ami hibázott 438 00:23:09,840 --> 00:23:12,400 Egy másik program vagy másik funkció. 439 00:23:12,400 --> 00:23:15,207 Hogy a viselkedés valószínűleg még kevésbé ideális, mint összeomlik. 440 00:23:15,207 --> 00:23:17,040 És ez az, amiért ez valójában egy jó szokás 441 00:23:17,040 --> 00:23:20,920 bejutni beállíthatjuk, hogy a mutatók null, ha nem meg őket 442 00:23:20,920 --> 00:23:24,540 hogy egy értelmes értéket Azonnal érték, hogy tudod, 443 00:23:24,540 --> 00:23:27,260 és hogy nyugodtan a hivatkozás feloldási. 444 00:23:27,260 --> 00:23:32,240 >> Tehát térjünk vissza most, és nézd A teljes szintaxis a helyzetet. 445 00:23:32,240 --> 00:23:37,400 Ha azt mondom, int * p ;, mit tettem csak tenni? 446 00:23:37,400 --> 00:23:38,530 Mit tettem ez. 447 00:23:38,530 --> 00:23:43,290 Tudom, hogy a p értékét egy cím mert minden mutató csak 448 00:23:43,290 --> 00:23:44,660 címeket. 449 00:23:44,660 --> 00:23:47,750 Tudok hivatkozás feloldási p A * operátor. 450 00:23:47,750 --> 00:23:51,250 Ebben az összefüggésben itt, a nagyon top felidézni a * része a típust. 451 00:23:51,250 --> 00:23:53,510 Int * az adat típusát. 452 00:23:53,510 --> 00:23:56,150 De nem tehetem hivatkozás feloldási o A * operátor, 453 00:23:56,150 --> 00:24:01,897 és ha én ezt, ha elmegyek arra a címre, mit fogok találni arra a címre? 454 00:24:01,897 --> 00:24:02,855 Meg fogom találni egész. 455 00:24:02,855 --> 00:24:05,910 Tehát int * p alapvetően mondván p egy címet. 456 00:24:05,910 --> 00:24:09,500 Tudok követéssel, p, és ha Én, meg fogom találni egy egész szám 457 00:24:09,500 --> 00:24:11,920 abban memóriaterület. 458 00:24:11,920 --> 00:24:14,260 >> OK, így azt mondtam volt egy másik idegesítő dolog a csillagok 459 00:24:14,260 --> 00:24:17,060 És itt, hogy idegesítő dolog a csillagok is. 460 00:24:17,060 --> 00:24:21,640 Próbáltál már nyilatkozni több változó azonos típusú 461 00:24:21,640 --> 00:24:24,409 ugyanazon a vonalon a kódot? 462 00:24:24,409 --> 00:24:27,700 Szóval egy pillanatra, úgy tesznek, mintha a vonal, A kód Igazából már ott zöld 463 00:24:27,700 --> 00:24:29,366 nincs ott, és ez csak mondja int x, y, z ;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Mit tenne, hogy valójában létre Három egész változók az Ön számára, 466 00:24:34,550 --> 00:24:36,930 egy úgynevezett x, az egyik neve y, és egy úgynevezett részt. 467 00:24:36,930 --> 00:24:41,510 Ez egy módja annak, hogy csinálni anélkül, szétszedés-ra három sor. 468 00:24:41,510 --> 00:24:43,890 >> Itt van, ahol a csillagok kap idegesítő ismét ellenére, 469 00:24:43,890 --> 00:24:49,200 mert a * valójában része Mindkét típus neve és részt 470 00:24:49,200 --> 00:24:50,320 A változó neve. 471 00:24:50,320 --> 00:24:56,430 És így ha azt mondom, int * px, py, pz, amit én tényleg csak egy mutató egy egész szám 472 00:24:56,430 --> 00:25:01,650 nevű px, és két egész számot, pi és pz. 473 00:25:01,650 --> 00:25:04,950 És valószínűleg nem az, amit akarjuk, hogy ez nem jó. 474 00:25:04,950 --> 00:25:09,290 >> Tehát, ha azt akarom, hogy több mutató ugyanabban a sorban, az azonos típusú, 475 00:25:09,290 --> 00:25:12,140 és a csillagok, amit valóban szüksége tennie, hogy azt mondják, int * pa, * pb, * db. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Most mintha éppen most mondta, hogy és most mondom ezt, 478 00:25:20,300 --> 00:25:22,170 akkor valószínűleg soha nem fogja ezt tenni. 479 00:25:22,170 --> 00:25:25,170 És ez talán egy jó dolog őszintén, mert lehet, hogy véletlenül 480 00:25:25,170 --> 00:25:26,544 elhagysz egy csillag, valami ilyesmi. 481 00:25:26,544 --> 00:25:29,290 Ez talán a legjobban talán kijelentem mutatók az egyes vonalak, 482 00:25:29,290 --> 00:25:31,373 de ez csak egy újabb ilyen bosszantó szintaxis 483 00:25:31,373 --> 00:25:35,310 dolgokat a csillagok, amelyek mutatók, így nehéz vele dolgozni. 484 00:25:35,310 --> 00:25:39,480 Mert ez csak ezt a szintaktikai rendetlenség van, hogy a munka révén. 485 00:25:39,480 --> 00:25:41,600 A gyakorlatban ez nem igazán vált természetessé. 486 00:25:41,600 --> 00:25:45,410 Még mindig hibáznak vele még A programozás után a 10 éves, 487 00:25:45,410 --> 00:25:49,630 így nem lehet ideges, ha valami történik neked, ez elég gyakori őszintén. 488 00:25:49,630 --> 00:25:52,850 Ez tényleg ilyen egy hiba a szintaxis. 489 00:25:52,850 --> 00:25:54,900 >> Ok, így egyfajta ígért hogy mi lenne újra 490 00:25:54,900 --> 00:25:59,370 a koncepció, hogy milyen nagy egy szöveg. 491 00:25:59,370 --> 00:26:02,750 Nos, ha azt mondanám, hogy a húr, most már tényleg ilyen 492 00:26:02,750 --> 00:26:04,140 hazudtak neked az egész idő alatt. 493 00:26:04,140 --> 00:26:06,181 Nincs adat típusú úgynevezett húr, és valójában én 494 00:26:06,181 --> 00:26:09,730 említette ezt, az egyik a legkorábbi videók adattípusok, 495 00:26:09,730 --> 00:26:13,820 hogy a húr volt egy olyan adattípust, hozták létre az Ön számára CS50.h. 496 00:26:13,820 --> 00:26:17,050 Meg kell #include CS50.h annak érdekében, hogy használja azt. 497 00:26:17,050 --> 00:26:19,250 >> Nos húr tényleg csak egy álnevet valamit 498 00:26:19,250 --> 00:26:23,600 az úgynevezett char *, a mutató egy karaktert. 499 00:26:23,600 --> 00:26:26,010 Nos mutatók, visszahívás Íme foglalkozik. 500 00:26:26,010 --> 00:26:28,780 Tehát mi az a méret bájtokra egy string? 501 00:26:28,780 --> 00:26:29,796 Hát ez négy vagy nyolc. 502 00:26:29,796 --> 00:26:32,170 És azért mondom négy vagy A nyolcas, mert valóban 503 00:26:32,170 --> 00:26:36,730 rendszertől függ, Ha használja CS50 ide, char * van akkora, mint egy char 504 00:26:36,730 --> 00:26:39,340 * Nyolc, ez egy 64 bites rendszert. 505 00:26:39,340 --> 00:26:43,850 Minden cím memóriában 64 bit hosszú. 506 00:26:43,850 --> 00:26:48,270 Ha használja CS50 készülék vagy bármely 32 bites gép, 507 00:26:48,270 --> 00:26:51,640 és akkor hallottam ezt a kifejezést a 32 bites gép, ami egy 32 bites gép? 508 00:26:51,640 --> 00:26:56,090 Hát ez csak azt jelenti, hogy minden A cím memóriában 32 bit hosszú. 509 00:26:56,090 --> 00:26:59,140 És így 32 bit négy bájt. 510 00:26:59,140 --> 00:27:02,710 Tehát egy char * négy vagy nyolc byte rendszertől függően. 511 00:27:02,710 --> 00:27:06,100 És valóban minden adattípusok, és egy hivatkozást bármilyen adat 512 00:27:06,100 --> 00:27:12,030 írja, mivel minden mutató csak címek, négy vagy nyolc bájt. 513 00:27:12,030 --> 00:27:14,030 Úgyhogy újra ezt rajzot és nézzük kötni 514 00:27:14,030 --> 00:27:18,130 ez a videó egy kis testmozgás itt. 515 00:27:18,130 --> 00:27:21,600 Tehát itt a rajz abbahagytuk a a legelején a videó. 516 00:27:21,600 --> 00:27:23,110 És most mi lesz, ha azt mondom * pk = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Szóval mit jelent az, amikor azt mondom, * pk = 35? 519 00:27:30,530 --> 00:27:32,420 Vegyünk egy pillanatra. 520 00:27:32,420 --> 00:27:34,990 * pk. 521 00:27:34,990 --> 00:27:39,890 Ebben az összefüggésben itt, a * követéssel üzemeltető. 522 00:27:39,890 --> 00:27:42,110 Tehát amikor a hivatkozás feloldási operátort használjuk, 523 00:27:42,110 --> 00:27:48,520 megyünk a címet mutatott a pk, és mi változik, hogy mit találunk. 524 00:27:48,520 --> 00:27:55,270 Tehát * pk = 35 hatékonyan Teszi ezt a képet. 525 00:27:55,270 --> 00:27:58,110 Tehát alapvetően szintaktikai megegyezik az azt mondta, k = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Még egy. 528 00:28:01,930 --> 00:28:05,510 Ha azt mondom, int m, létrehozok Új nevű változó m. 529 00:28:05,510 --> 00:28:08,260 Egy új doboz, ez egy zöld doboz miatt ez fog tartani egy egész szám, 530 00:28:08,260 --> 00:28:09,840 és ez feliratú m. 531 00:28:09,840 --> 00:28:14,960 Ha azt mondom, m = 4, tettem egy integer be azt a dobozt. 532 00:28:14,960 --> 00:28:20,290 Ha mondjuk pk = & M, hogyan működik Ezen a diagramon a változás? 533 00:28:20,290 --> 00:28:28,760 Pk = & m, emlékszel, amit a & Üzemeltető nem, vagy hívják? 534 00:28:28,760 --> 00:28:34,430 Ne feledje, hogy néhány változó nevét és a változó címét nevet. 535 00:28:34,430 --> 00:28:38,740 Tehát mi azt mondjuk van pk kapja a címét m. 536 00:28:38,740 --> 00:28:42,010 És így hatékonyan, mi történik a ábrában, hogy pk már nem mutat 537 00:28:42,010 --> 00:28:46,420 k, de rámutat m. 538 00:28:46,420 --> 00:28:48,470 >> Ismét mutatók nagyon trükkös dolgozni 539 00:28:48,470 --> 00:28:50,620 és sok a gyakorlat, hanem azért, mert 540 00:28:50,620 --> 00:28:54,150 képességüket, hogy lehetővé teszik, közötti adattovábbításhoz funkciók 541 00:28:54,150 --> 00:28:56,945 és tulajdonképpen azok, változások lépnek életbe, 542 00:28:56,945 --> 00:28:58,820 szerzés fejed körül nagyon fontos. 543 00:28:58,820 --> 00:29:02,590 Valószínűleg ez a legbonyolultabb tárgyalandó téma a CS50, 544 00:29:02,590 --> 00:29:05,910 de az érték, amit kap a mutatók 545 00:29:05,910 --> 00:29:09,200 messze felülmúlja a szövődmények hogy jön a tanulás őket. 546 00:29:09,200 --> 00:29:12,690 Szóval azt szeretném, ha a legjobb szerencsét megismerése mutatók. 547 00:29:12,690 --> 00:29:15,760 Én Doug Lloyd, ez CS50. 548 00:29:15,760 --> 00:29:17,447