1 00:00:00,000 --> 00:00:06,030 >> [Speel van musiek] 2 00:00:06,030 --> 00:00:08,390 >> DOUG LLOYD: Pointers, hier is ons. 3 00:00:08,390 --> 00:00:11,080 Dit is waarskynlik gaan om wees die moeilikste onderwerp 4 00:00:11,080 --> 00:00:12,840 dat ons praat oor in CS50. 5 00:00:12,840 --> 00:00:15,060 En as jy gelees het niks oor pointers 6 00:00:15,060 --> 00:00:19,080 voordat jy 'n bietjie kan wees intimiderend gaan in hierdie video. 7 00:00:19,080 --> 00:00:21,260 Dit is waar die wysers moenie toelaat dat jy die vermoë 8 00:00:21,260 --> 00:00:23,740 miskien skroef redelik sleg wanneer jy 9 00:00:23,740 --> 00:00:27,450 werk met veranderlikes, en data, en veroorsaak dat jou program te crash. 10 00:00:27,450 --> 00:00:30,490 Maar hulle is eintlik baie handig en hulle het ons 'n baie goeie manier toelaat 11 00:00:30,490 --> 00:00:33,340 om data terug te slaag en weer tussen funksies, 12 00:00:33,340 --> 00:00:35,490 dat ons anders is nie in staat om te doen. 13 00:00:35,490 --> 00:00:37,750 >> En ja, wat ons regtig hier wil doen, is die trein 14 00:00:37,750 --> 00:00:41,060 jy goeie wyser dissipline, so dat jy verwysings effektief kan gebruik 15 00:00:41,060 --> 00:00:43,850 om jou programme wat baie beter te maak. 16 00:00:43,850 --> 00:00:48,220 Soos ek gesê het wenke gee ons 'n ander manier om data tussen funksies te slaag. 17 00:00:48,220 --> 00:00:50,270 Nou as jy onthou uit 'n vroeëre video, wanneer 18 00:00:50,270 --> 00:00:53,720 ons praat oor veranderlike omvang, ek genoem 19 00:00:53,720 --> 00:01:00,610 dat al die data wat ons slaag tussen funksies in C word geslaag deur waarde. 20 00:01:00,610 --> 00:01:03,070 En ek kan nie gebruik dat termyn, wat ek daar bedoel 21 00:01:03,070 --> 00:01:07,170 was dat ons verby afskrifte van data. 22 00:01:07,170 --> 00:01:12,252 As ons verby 'n veranderlike om 'n funksie, ons is nie eintlik verby die veranderlike 23 00:01:12,252 --> 00:01:13,210 om die funksie, reg? 24 00:01:13,210 --> 00:01:17,670 Ons verby 'n afskrif van dat data om die funksie. 25 00:01:17,670 --> 00:01:20,760 Die funksie doen wat dit sal en dit bereken bietjie waarde, 26 00:01:20,760 --> 00:01:23,180 en miskien gebruik ons ​​wat waarde wanneer dit gee dit terug. 27 00:01:23,180 --> 00:01:26,700 >> Daar was 'n uitsondering op hierdie reël van verbygaande volgens waarde 28 00:01:26,700 --> 00:01:31,210 en ons sal terug na wat wat kom is 'n bietjie later in hierdie video. 29 00:01:31,210 --> 00:01:34,880 As ons gebruik wenke plaas van die gebruik van veranderlikes, 30 00:01:34,880 --> 00:01:38,180 of in plaas van die gebruik van die veranderlikes hulself of afskrifte van die veranderlikes, 31 00:01:38,180 --> 00:01:43,790 kan ons nou verby die veranderlikes rondom tussen funksies in 'n ander manier. 32 00:01:43,790 --> 00:01:46,550 Dit beteken dat as ons 'n verandering in een funksie, 33 00:01:46,550 --> 00:01:49,827 dat verandering sal eintlik neem bewerkstellig in 'n ander funksie. 34 00:01:49,827 --> 00:01:52,160 Weereens, dit is iets wat ons kon nie voorheen doen nie, 35 00:01:52,160 --> 00:01:56,979 en as jy al ooit probeer om die ruil waarde van twee veranderlikes in 'n funksie, 36 00:01:56,979 --> 00:01:59,270 jy hierdie probleem het opgemerk soort van bekruip, reg? 37 00:01:59,270 --> 00:02:04,340 >> As ons wil X en Y, en ons ruil slaag hulle om 'n funksie genoem ruil, 38 00:02:04,340 --> 00:02:08,680 binnekant van die funksie ruil die veranderlikes te doen ruil waardes. 39 00:02:08,680 --> 00:02:12,600 Een word twee, twee word een nie, maar ons doen nie eintlik 40 00:02:12,600 --> 00:02:16,890 niks verander in die oorspronklike funksie in die oproeper. 41 00:02:16,890 --> 00:02:19,550 Omdat ons nie kan nie, ons is net werk met afskrifte van hulle. 42 00:02:19,550 --> 00:02:24,760 Met wysers al is, ons kan eintlik slaag X en Y om 'n funksie. 43 00:02:24,760 --> 00:02:26,960 Daardie funksie kan doen iets met hulle. 44 00:02:26,960 --> 00:02:29,250 En dié veranderlikes waardes eintlik kan verander. 45 00:02:29,250 --> 00:02:33,710 So dit is nogal 'n verandering in ons vermoë om te werk met data. 46 00:02:33,710 --> 00:02:36,100 >> Voordat ons duik in wysers, ek dink dit is die moeite werd 47 00:02:36,100 --> 00:02:38,580 neem 'n paar minute om gaan terug na die basiese dinge hier. 48 00:02:38,580 --> 00:02:41,000 En het 'n blik op hoe rekenaar geheue werke 49 00:02:41,000 --> 00:02:45,340 omdat dié twee vakke gaan om werklik redelik interafhanklik. 50 00:02:45,340 --> 00:02:48,480 Soos u waarskynlik weet, op jou rekenaar stelsel 51 00:02:48,480 --> 00:02:51,310 jy het 'n hardeskyf of miskien 'n vaste toestand ry, 52 00:02:51,310 --> 00:02:54,430 'n soort van lêer stoor plek. 53 00:02:54,430 --> 00:02:57,950 Dit is gewoonlik iewers in die omgewing van 250 GB 54 00:02:57,950 --> 00:02:59,810 om dalk 'n paar van terabyte nou. 55 00:02:59,810 --> 00:03:02,270 En dit is waar al jou lêers uiteindelik lewe, 56 00:03:02,270 --> 00:03:04,870 selfs wanneer jou rekenaar toegesluit af, kan jy dit weer op 57 00:03:04,870 --> 00:03:09,190 en jy sal vind jou lêers is daar weer wanneer jy jou stelsel herlaai. 58 00:03:09,190 --> 00:03:14,820 Maar skyfaandrywers, soos 'n hardeskyf, 'n HDD, of 'n vaste toestand ry, 'n SSD, 59 00:03:14,820 --> 00:03:16,050 is net stoorplek. 60 00:03:16,050 --> 00:03:20,400 >> Ons kan nie eintlik enigiets doen met die data wat in die hardeskyf, 61 00:03:20,400 --> 00:03:22,080 of in 'n vaste toestand ry. 62 00:03:22,080 --> 00:03:24,950 Ten einde te eintlik verander data of skuif dit rond, 63 00:03:24,950 --> 00:03:28,800 ons het om dit te skuif na RAM, ewetoeganklike geheue. 64 00:03:28,800 --> 00:03:31,170 Nou RAM, jy het 'n baie minder in jou rekenaar. 65 00:03:31,170 --> 00:03:34,185 Jy kan iewers in die het omgewing van 512 megagrepe 66 00:03:34,185 --> 00:03:38,850 As jy 'n ouer rekenaar, om miskien twee, vier, agt, 16, 67 00:03:38,850 --> 00:03:41,820 moontlik selfs 'n bietjie meer GB RAM. 68 00:03:41,820 --> 00:03:46,390 So dit is baie kleiner, maar dit is waar al die vlugtige data bestaan. 69 00:03:46,390 --> 00:03:48,270 Dit is waar ons dinge kan verander. 70 00:03:48,270 --> 00:03:53,350 Maar toe ons draai ons rekenaar af, al die data in die geheue is vernietig. 71 00:03:53,350 --> 00:03:57,150 >> So dit is hoekom ons nodig het om te hardeskyf het vir die meer permanente plek daarvan, 72 00:03:57,150 --> 00:03:59,720 sodat dit exists- dit sou regtig sleg as elke keer as ons 73 00:03:59,720 --> 00:04:03,310 draai ons rekenaar af, elke lêer in ons stelsel is uitgewis. 74 00:04:03,310 --> 00:04:05,600 So werk ons ​​binnekant van RAM. 75 00:04:05,600 --> 00:04:09,210 En elke keer as ons praat oor geheue, pretty much in CS50, 76 00:04:09,210 --> 00:04:15,080 ons praat oor RAM, nie hardeskyf. 77 00:04:15,080 --> 00:04:18,657 >> So wanneer ons dinge beweeg in die geheue, dit neem om 'n sekere bedrag van die ruimte. 78 00:04:18,657 --> 00:04:20,740 Al die data tipes wat Ons het gewerk met 79 00:04:20,740 --> 00:04:23,480 neem verskillende bedrae van ruimte in RAM. 80 00:04:23,480 --> 00:04:27,600 So elke keer as jy 'n heelgetal te skep veranderlike, vier grepe van die geheue 81 00:04:27,600 --> 00:04:30,750 tersyde gestel in RAM sodat jy kan werk met wat heelgetal. 82 00:04:30,750 --> 00:04:34,260 Jy kan die heelgetal te verklaar, dit verander, gee dit 83 00:04:34,260 --> 00:04:36,700 om 'n waarde 10 geïnkrementeer een, so aan en so aan. 84 00:04:36,700 --> 00:04:39,440 Al wat moet gebeur in RAM, en jy kry vier grepe 85 00:04:39,440 --> 00:04:42,550 om te werk met elke heelgetal wat jy skep. 86 00:04:42,550 --> 00:04:45,410 >> Elke karakter wat jy skep kry een byte. 87 00:04:45,410 --> 00:04:48,160 Dit is net hoeveel ruimte is wat nodig is om 'n karakter te stoor. 88 00:04:48,160 --> 00:04:51,310 Elke vlot, 'n ware nommer, kry vier grepe 89 00:04:51,310 --> 00:04:53,390 tensy dit 'n dubbele presisie swaai punt 90 00:04:53,390 --> 00:04:56,510 nommer, wat jou toelaat om meer akkurate of meer syfers 91 00:04:56,510 --> 00:04:59,300 na die desimale punt sonder verlies presisie, 92 00:04:59,300 --> 00:05:01,820 wat neem agt grepe van die geheue. 93 00:05:01,820 --> 00:05:06,730 Lang verlang, baie groot heelgetalle, neem ook agt grepe van die geheue. 94 00:05:06,730 --> 00:05:09,000 Hoeveel grepe van die geheue moenie snare neem? 95 00:05:09,000 --> 00:05:12,990 Wel, laat ons sit 'n pen in die vraag vir nou, maar ons sal terug te kom. 96 00:05:12,990 --> 00:05:17,350 >> So terug na die idee van geheue as 'n groot verskeidenheid van byte-grootte selle. 97 00:05:17,350 --> 00:05:20,871 Dit is regtig al wat dit is, dit is net 'n groot verskeidenheid van selle, 98 00:05:20,871 --> 00:05:23,370 net soos enige ander skikking wat jy ken en te sien, 99 00:05:23,370 --> 00:05:26,430 behalwe elke element is een byte breed. 100 00:05:26,430 --> 00:05:30,030 En net soos 'n skikking, elke element het 'n adres. 101 00:05:30,030 --> 00:05:32,120 Elke element van 'n skikking het 'n indeks, en ons 102 00:05:32,120 --> 00:05:36,302 kan die indeks gebruik om te doen sogenaamde ewetoeganklike op die skikking. 103 00:05:36,302 --> 00:05:38,510 Ons hoef nie te begin by die begin van die skikking, 104 00:05:38,510 --> 00:05:40,569 Itereer deur elke enkele element daarvan, 105 00:05:40,569 --> 00:05:41,860 om uit te vind wat ons soek. 106 00:05:41,860 --> 00:05:45,790 Ons kan net sê, ek wil die te kry 15 element of die 100 element. 107 00:05:45,790 --> 00:05:49,930 En jy kan net slaag in dat die getal en kry die waarde wat jy op soek is na. 108 00:05:49,930 --> 00:05:54,460 >> Net so elke plek in die geheue het 'n adres. 109 00:05:54,460 --> 00:05:57,320 So jou geheue krag lyk so. 110 00:05:57,320 --> 00:06:01,420 Hier is 'n baie klein deel van geheue, dit is 20 grepe van die geheue. 111 00:06:01,420 --> 00:06:04,060 Die eerste 20 grepe omdat my spreek daar aan die onderkant 112 00:06:04,060 --> 00:06:08,890 is 0, 1, 2, 3, en so op al die pad tot 19. 113 00:06:08,890 --> 00:06:13,190 En toe Ek verklaar veranderlikes en toe ek begin om te werk met hulle, 114 00:06:13,190 --> 00:06:15,470 die stelsel gaan stel opsy ruimte vir my 115 00:06:15,470 --> 00:06:17,595 in die geheue te werk met my veranderlikes. 116 00:06:17,595 --> 00:06:21,610 So ek kan sê, char c gelyk kapitaal H. En wat gaan gebeur? 117 00:06:21,610 --> 00:06:23,880 Wel, die stelsel gaan opsygesit vir my 'n byte. 118 00:06:23,880 --> 00:06:27,870 In hierdie geval is dit gekies byte nommer vier, die greep by adres vier 119 00:06:27,870 --> 00:06:31,310 en dit gaan na die winkel brief kapitaal H daar vir my. 120 00:06:31,310 --> 00:06:34,350 As ek dan sê int spoed limiet gelyk 65, dit is 121 00:06:34,350 --> 00:06:36,806 gaan ter syde te stel vier grepe van die geheue vir my. 122 00:06:36,806 --> 00:06:39,180 En dit gaan om daardie behandel vier grepe as 'n eenheid 123 00:06:39,180 --> 00:06:41,305 want wat ons werk met 'n heelgetal is hier. 124 00:06:41,305 --> 00:06:44,350 En dit gaan om te slaan 65 daar. 125 00:06:44,350 --> 00:06:47,000 >> Nou al ek is soort van jy vertel 'n bietjie van 'n leuen, 126 00:06:47,000 --> 00:06:50,150 reg, want ons weet dat rekenaars te werk in binêre. 127 00:06:50,150 --> 00:06:53,100 Hulle verstaan ​​nie noodwendig wat 'n kapitale H is 128 00:06:53,100 --> 00:06:57,110 of wat 'n 65 is, maar hulle verstaan ​​binêre, nulle en ene. 129 00:06:57,110 --> 00:06:59,000 En so eintlik wat ons stoor in daar 130 00:06:59,000 --> 00:07:03,450 is nie die letter H en die nommer 65, maar eerder die binêre voorstelling 131 00:07:03,450 --> 00:07:06,980 daarvan, wat lyk bietjie iets soos hierdie. 132 00:07:06,980 --> 00:07:10,360 En in die besonder in die konteks van die heelgetal veranderlike, 133 00:07:10,360 --> 00:07:13,559 dit gaan nie net spoeg dit in, dit is nie van plan om dit te hanteer as een vier 134 00:07:13,559 --> 00:07:15,350 byte stuk noodwendig, dit is eintlik gaan 135 00:07:15,350 --> 00:07:19,570 om dit te hanteer as vier een byte stukke, wat iets soos hierdie kan kyk. 136 00:07:19,570 --> 00:07:22,424 En selfs dit is nie heeltemal waar nie, 137 00:07:22,424 --> 00:07:24,840 as gevolg van iets genoem 'n endianness, wat ons nie 138 00:07:24,840 --> 00:07:26,965 gaan kry in nou nie, maar as jy nuuskierig oor is, 139 00:07:26,965 --> 00:07:29,030 jy kan lees bietjie en 'n groot endianness. 140 00:07:29,030 --> 00:07:31,640 Maar ter wille van die argument, ter wille van die video, 141 00:07:31,640 --> 00:07:34,860 laat ons net aanvaar dat is, in Trouens, hoe die getal 65 sou 142 00:07:34,860 --> 00:07:36,970 in verteenwoordig geheue op elke stelsel, 143 00:07:36,970 --> 00:07:38,850 maar dit is nie heeltemal waar nie. 144 00:07:38,850 --> 00:07:41,700 >> Maar laat ons eintlik net kry ontslae te raak van al binêre geheel, 145 00:07:41,700 --> 00:07:44,460 en net te dink oor as H en 65, is dit 'n baie makliker 146 00:07:44,460 --> 00:07:47,900 na te dink oor dit soos dat as 'n mens. 147 00:07:47,900 --> 00:07:51,420 Alle reg, sodat dit lyk ook miskien 'n bietjie random dat I've- my stelsel 148 00:07:51,420 --> 00:07:55,130 het nie gee my grepe 5, 6, 7, en 8 aan die heelgetal te stoor. 149 00:07:55,130 --> 00:07:58,580 Daar is 'n rede vir wat, ook, wat Ons sal nie in die oomblik, maar volstaan 150 00:07:58,580 --> 00:08:00,496 om te sê dat wat die rekenaar hier 151 00:08:00,496 --> 00:08:02,810 is waarskynlik 'n goeie skuif op sy deel. 152 00:08:02,810 --> 00:08:06,020 Om nie gee my geheue wat noodwendig rug aan rug. 153 00:08:06,020 --> 00:08:10,490 Hoewel dit gaan dit nou doen as ek wil 'n ander string te kry, 154 00:08:10,490 --> 00:08:13,080 genoem van, en ek wil Lloyd daar sit. 155 00:08:13,080 --> 00:08:18,360 Ek gaan nodig om een ​​te pas karakter, elke letter van wat 156 00:08:18,360 --> 00:08:21,330 gaan een nodig karakter, een greep van die geheue. 157 00:08:21,330 --> 00:08:26,230 So as ek Lloyd in my array kan sit soos hierdie Ek is redelik goed om te gaan, reg? 158 00:08:26,230 --> 00:08:28,870 Wat ontbreek? 159 00:08:28,870 --> 00:08:31,840 >> Onthou dat elke string ons werk in C eindig met backslash nul, 160 00:08:31,840 --> 00:08:33,339 en ons kan nie hier uitlaat wat, hetsy. 161 00:08:33,339 --> 00:08:36,090 Ons moet opsy een byte stel geheue om so ons hou dat 162 00:08:36,090 --> 00:08:39,130 weet wanneer ons string geëindig het. 163 00:08:39,130 --> 00:08:41,049 So weer hierdie reëling van die manier waarop dinge 164 00:08:41,049 --> 00:08:42,799 verskyn in die geheue krag 'n bietjie random, 165 00:08:42,799 --> 00:08:44,870 maar dit is eintlik hoe die meeste stelsels is ontwerp. 166 00:08:44,870 --> 00:08:48,330 Om hulle in lyn op veelvoude vier, vir redes weer 167 00:08:48,330 --> 00:08:50,080 dat ons nie nodig het om te kry in nou. 168 00:08:50,080 --> 00:08:53,060 Maar dit, so dit voldoende om te sê dat na hierdie drie reëls van die kode, 169 00:08:53,060 --> 00:08:54,810 dit is wat die geheue kan lyk. 170 00:08:54,810 --> 00:08:58,930 As ek nodig geheue plekke 4, 8 en 12 tot my data te hou, 171 00:08:58,930 --> 00:09:01,100 dit is wat my geheue kan lyk. 172 00:09:01,100 --> 00:09:04,062 >> En net besonder wees pedanties hier toe 173 00:09:04,062 --> 00:09:06,020 ons praat oor die geheue adresse ons gewoonlik 174 00:09:06,020 --> 00:09:08,390 doen deur die hexadecimale notasie. 175 00:09:08,390 --> 00:09:12,030 So waarom nie ons sit al hierdie uit desimale notasie te heksadesimale 176 00:09:12,030 --> 00:09:15,010 net omdat dit is oor die algemeen hoe ons verwys na die geheue. 177 00:09:15,010 --> 00:09:17,880 So in plaas van 0 tot 19, wat ons het, is nul 178 00:09:17,880 --> 00:09:20,340 x zero deur nul x1 drie. 179 00:09:20,340 --> 00:09:23,790 Dit is die 20 grepe van die geheue dat ons het of ons kyk na in hierdie beeld 180 00:09:23,790 --> 00:09:25,540 net hier. 181 00:09:25,540 --> 00:09:29,310 >> So al wat gesê word, laat stap weg van die geheue vir 'n tweede 182 00:09:29,310 --> 00:09:30,490 en terug na wenke. 183 00:09:30,490 --> 00:09:32,420 Hier is die belangrikste ding om te onthou 184 00:09:32,420 --> 00:09:34,070 soos ons begin werk met wysers. 185 00:09:34,070 --> 00:09:36,314 A wyser is niks meer as 'n adres. 186 00:09:36,314 --> 00:09:38,230 Ek sal dit weer sê, want dit is wat belangrik is, 187 00:09:38,230 --> 00:09:42,730 'n wyser is niks meer as 'n adres. 188 00:09:42,730 --> 00:09:47,760 Pointers is adresse aan plekke in die geheue waar veranderlikes lewe. 189 00:09:47,760 --> 00:09:52,590 Wetende dat dit hopelik 'n bietjie makliker om te werk met hulle. 190 00:09:52,590 --> 00:09:54,550 Nog 'n ding wat ek graag om te doen is om soort te hê 191 00:09:54,550 --> 00:09:58,510 diagramme visueel verteenwoordig wat is gebeur met verskeie reëls van die kode. 192 00:09:58,510 --> 00:10:00,660 En ons sal dit 'n paar te doen keer in wysers, 193 00:10:00,660 --> 00:10:03,354 en wanneer ons praat oor dinamiese geheuetoekenning as well. 194 00:10:03,354 --> 00:10:06,020 Want ek dink dat hierdie diagramme kan veral nuttig. 195 00:10:06,020 --> 00:10:09,540 >> So as ek sê byvoorbeeld int k in my kode, wat gebeur? 196 00:10:09,540 --> 00:10:12,524 Wel, wat is basies gebeur is Ek kry geheue opsy gesit vir my, 197 00:10:12,524 --> 00:10:14,690 maar ek het nie eens wil dink oor dit so, ek 198 00:10:14,690 --> 00:10:16,300 wil om te dink oor dit soos 'n boks. 199 00:10:16,300 --> 00:10:20,090 Ek het 'n boks en dit is gekleurde groen, want ek 200 00:10:20,090 --> 00:10:21,750 kan heelgetalle in 'n groen bokse. 201 00:10:21,750 --> 00:10:23,666 As dit is 'n karakter wat ek dalk 'n blou boks. 202 00:10:23,666 --> 00:10:27,290 Maar Ek sê altyd, as ek skep 'n boks wat heelgetalle kan hou 203 00:10:27,290 --> 00:10:28,950 dat boks is groen gekleur. 204 00:10:28,950 --> 00:10:33,020 En ek neem 'n permanente merker en ek skryf k aan die kant van dit. 205 00:10:33,020 --> 00:10:37,590 So ek het 'n boks genoem k, waarin ek heelgetalle kan sit. 206 00:10:37,590 --> 00:10:41,070 So as ek sê int k, dit is wat gebeur in my kop. 207 00:10:41,070 --> 00:10:43,140 As ek sê k gelyk vyf wat doen ek? 208 00:10:43,140 --> 00:10:45,110 Wel, ek is om vyf in die boks, reg. 209 00:10:45,110 --> 00:10:48,670 Dit is redelik eenvoudig, as Ek sê int k, skep 'n boks genoem k. 210 00:10:48,670 --> 00:10:52,040 As ek sê k gelyk 5, opgestel: vyf in die boks. 211 00:10:52,040 --> 00:10:53,865 Hopelik is dit nie te veel van 'n sprong. 212 00:10:53,865 --> 00:10:55,990 Hier is waar dinge gaan 'n bietjie interessante al is. 213 00:10:55,990 --> 00:11:02,590 As ek sê int * PK, goed, selfs as ek dit nie doen nie weet wat dit beteken nie noodwendig, 214 00:11:02,590 --> 00:11:06,150 dit is duidelik het iets te doen het met 'n heelgetal. 215 00:11:06,150 --> 00:11:08,211 So ek gaan inkleur hierdie boks groen-ish, 216 00:11:08,211 --> 00:11:10,210 Ek weet dit het iets te doen het met 'n heelgetal, 217 00:11:10,210 --> 00:11:13,400 maar dit is nie 'n heelgetal self, want dit is 'n int ster. 218 00:11:13,400 --> 00:11:15,390 Daar is iets effens verskillende daaroor. 219 00:11:15,390 --> 00:11:17,620 So betrokke 'n heelgetal se maar andersins is dit 220 00:11:17,620 --> 00:11:19,830 nie veel verskillend van wat ons praat. 221 00:11:19,830 --> 00:11:24,240 Dit is 'n boks, sy het 'n etiket, dit dra 'n etiket PK, 222 00:11:24,240 --> 00:11:27,280 en dit is in staat om van hou int sterre, wat ook al dit is. 223 00:11:27,280 --> 00:11:29,894 Hulle het iets te doen met heelgetalle, duidelik. 224 00:11:29,894 --> 00:11:31,060 Hier is die laaste linie al is. 225 00:11:31,060 --> 00:11:37,650 As ek sê PK = & k, whoa, wat nou net gebeur het, reg? 226 00:11:37,650 --> 00:11:41,820 So hierdie ewekansige getal, skynbaar ewekansige nommer, kry gegooi word in die boks. 227 00:11:41,820 --> 00:11:44,930 Alle dit is, is pk kry die adres van k. 228 00:11:44,930 --> 00:11:52,867 So ek vas waar k woon in die geheue, sy toespraak het die adres van sy grepe. 229 00:11:52,867 --> 00:11:55,200 Al wat ek doen is ek sê wat waarde is wat ek gaan 230 00:11:55,200 --> 00:11:59,430 binnekant van my boks genoem PK om te sit. 231 00:11:59,430 --> 00:12:02,080 En omdat hierdie dinge wysers, en omdat soek 232 00:12:02,080 --> 00:12:04,955 op 'n string soos nul x agt nul c sewe vier agt 233 00:12:04,955 --> 00:12:07,790 twee nul is waarskynlik nie baie betekenisvol. 234 00:12:07,790 --> 00:12:12,390 Wanneer ons in die algemeen te visualiseer wysers, ons eintlik so doen soos wenke. 235 00:12:12,390 --> 00:12:17,000 PK gee ons die inligting ons nodig het om te vind k in die geheue. 236 00:12:17,000 --> 00:12:19,120 So basies PK het 'n pyl in. 237 00:12:19,120 --> 00:12:21,670 En as ons loop die lengte van daardie pyl, dink 238 00:12:21,670 --> 00:12:25,280 dit is iets wat jy kan loop, as ons loop langs die lengte van die pyl, 239 00:12:25,280 --> 00:12:29,490 Op die heel punt van daardie pyl, ons sal die plek in die geheue vind 240 00:12:29,490 --> 00:12:31,390 waar k woon. 241 00:12:31,390 --> 00:12:34,360 En dit is werklik belangrik want as ons weet waar k woon, 242 00:12:34,360 --> 00:12:37,870 ons kan begin om te werk met die data binnekant van die geheue plek. 243 00:12:37,870 --> 00:12:40,780 Hoewel ons kry 'n Teeny bietjie voor onsself vir nou. 244 00:12:40,780 --> 00:12:42,240 >> So, wat is 'n wyser? 245 00:12:42,240 --> 00:12:45,590 A wyser is 'n data-item wie waarde is 'n geheue adres. 246 00:12:45,590 --> 00:12:49,740 Dit was dit nul x agt nul dinge aangaan, dit was 'n geheue adres. 247 00:12:49,740 --> 00:12:52,060 Dit was 'n plek in die geheue. 248 00:12:52,060 --> 00:12:55,080 En die tipe van 'n wyser beskryf die soort 249 00:12:55,080 --> 00:12:56,930 van data wat jy kry by dat die geheue adres. 250 00:12:56,930 --> 00:12:58,810 So is daar die int ster deel reg. 251 00:12:58,810 --> 00:13:03,690 As ek volg dat die pyl, dit is gaan my lei tot 'n plek. 252 00:13:03,690 --> 00:13:06,980 En dat die plek, wat ek daar sal vind in my voorbeeld, 253 00:13:06,980 --> 00:13:08,240 is 'n groen gekleurde boks. 254 00:13:08,240 --> 00:13:12,650 Dit is 'n heelgetal is, dit is wat ek sal vind as ek gaan na daardie adres. 255 00:13:12,650 --> 00:13:14,830 Die data tipe van 'n wyser beskryf wat 256 00:13:14,830 --> 00:13:17,936 jy sal vind op daardie geheue adres. 257 00:13:17,936 --> 00:13:19,560 So hier is die regtig cool ding al is. 258 00:13:19,560 --> 00:13:25,090 Pointers ons toelaat om te slaag veranderlikes tussen funksies. 259 00:13:25,090 --> 00:13:28,520 En eintlik slaag veranderlikes en nie afskrifte van hulle slaag. 260 00:13:28,520 --> 00:13:32,879 Want as ons weet presies waar in die geheue van 'n veranderlike te vind, 261 00:13:32,879 --> 00:13:35,670 Ons het nie nodig om 'n kopie van maak dit kan ons net gaan na die plek 262 00:13:35,670 --> 00:13:37,844 en werk met daardie veranderlike. 263 00:13:37,844 --> 00:13:40,260 So in wese pointers soort maak van 'n rekenaar omgewing 264 00:13:40,260 --> 00:13:42,360 'n baie meer soos die werklike wêreld, reg. 265 00:13:42,360 --> 00:13:44,640 >> So hier is 'n analogie. 266 00:13:44,640 --> 00:13:48,080 Kom ons sê dat ek 'n notebook, reg, en dit is vol notas. 267 00:13:48,080 --> 00:13:50,230 En ek wil hê jy moet dit verander. 268 00:13:50,230 --> 00:13:53,960 Jy is 'n funksie wat updates notas, reg. 269 00:13:53,960 --> 00:13:56,390 Op die pad het ons nie dusver werk, wat 270 00:13:56,390 --> 00:14:02,370 gebeur is dat jy sal my notebook te neem, jy sal gaan na die kopie winkel, 271 00:14:02,370 --> 00:14:06,410 jy sal 'n kopie van Xerox maak elke bladsy van die notaboek. 272 00:14:06,410 --> 00:14:09,790 Jy sal my notebook terug te verlaat op my lessenaar wanneer jy klaar is, 273 00:14:09,790 --> 00:14:14,600 jy gaan kruis uit dinge in my notebook wat is uit datum of verkeerd, 274 00:14:14,600 --> 00:14:19,280 en dan sal jy weer slaag om vir my die stapel van Xerox bladsye 275 00:14:19,280 --> 00:14:22,850 dit is 'n replika van my notaboek met die veranderinge wat jy gemaak het om dit te. 276 00:14:22,850 --> 00:14:27,040 En op daardie punt, is dit vir my as die roeping funksie, soos die oproeper, 277 00:14:27,040 --> 00:14:30,582 om te besluit om jou notas te neem en integreer dit weer terug in my notaboek. 278 00:14:30,582 --> 00:14:32,540 So is daar 'n klomp van stappe hier betrokke is, reg. 279 00:14:32,540 --> 00:14:34,850 Soos sou dit nie beter wees as ek net sê, hey, jy kan 280 00:14:34,850 --> 00:14:38,370 werk my notebook vir my hand wat jy my notebook, 281 00:14:38,370 --> 00:14:40,440 en jy dinge te neem en hulle letterlik kruis uit 282 00:14:40,440 --> 00:14:42,810 en werk my notas in my notaboek. 283 00:14:42,810 --> 00:14:45,140 En dan gee my notebook rug. 284 00:14:45,140 --> 00:14:47,320 Dit is soort van wat wysers ons toelaat om te doen, 285 00:14:47,320 --> 00:14:51,320 hulle maak hierdie omgewing 'n baie meer soos hoe ons in werklikheid funksioneer. 286 00:14:51,320 --> 00:14:54,640 >> Alle reg, sodat dit is wat 'n wyser is, laat ons praat 287 00:14:54,640 --> 00:14:58,040 oor hoe wysers werk in C en hoe kan ons begin om met hulle te werk. 288 00:14:58,040 --> 00:15:02,550 So daar is 'n baie eenvoudige wyser in C genoem null pointer. 289 00:15:02,550 --> 00:15:04,830 Die nul wyser punte niks. 290 00:15:04,830 --> 00:15:08,310 Dit is waarskynlik lyk soos dit is eintlik nie 'n baie nuttige ding, 291 00:15:08,310 --> 00:15:10,500 maar soos ons sal sien 'n bietjie later, die feit 292 00:15:10,500 --> 00:15:15,410 dat dit null pointer bestaan eintlik werklik kan handig te pas kom. 293 00:15:15,410 --> 00:15:19,090 En wanneer jy 'n wyser skep, en jy nie die waarde daarvan onmiddellik ontruim- stel 294 00:15:19,090 --> 00:15:21,060 'n voorbeeld van die opstel onmiddellik sy waarde 295 00:15:21,060 --> 00:15:25,401 sal 'n paar skyfies terug waar ek gesê PK gelyk & k, 296 00:15:25,401 --> 00:15:28,740 pk kry posadres k, soos ons sal sien wat dit beteken, 297 00:15:28,740 --> 00:15:32,990 ons sal sien hoe om kode wat shortly- as ons nie sy waarde om iets te stel 298 00:15:32,990 --> 00:15:35,380 onmiddellik betekenisvolle, Jy moet altyd 299 00:15:35,380 --> 00:15:37,480 stel jou muis om te wys op null. 300 00:15:37,480 --> 00:15:40,260 Jy moet sit dit om te verwys na niks. 301 00:15:40,260 --> 00:15:43,614 >> Dit is baie anders as net verlaat die waarde soos dit is 302 00:15:43,614 --> 00:15:45,530 en dan waarby 'n wyser en net die veronderstelling 303 00:15:45,530 --> 00:15:48,042 dit is null want dit is selde waar. 304 00:15:48,042 --> 00:15:50,000 So jy moet altyd gestel die waarde van 'n wyser 305 00:15:50,000 --> 00:15:55,690 om null as jy nie die waarde daarvan te stel om iets betekenisvol onmiddellik. 306 00:15:55,690 --> 00:15:59,090 Jy kan kyk of waarde wat 'n wyser se is van nul deur die operateur gelykheid 307 00:15:59,090 --> 00:16:05,450 (==), Net soos jy vergelyk enige heelgetal waardes of karakter waardes behulp (==) 308 00:16:05,450 --> 00:16:06,320 ook. 309 00:16:06,320 --> 00:16:10,994 Dit is 'n spesiale soort van konstante waarde wat jy kan gebruik om te toets. 310 00:16:10,994 --> 00:16:13,160 So dit was 'n baie eenvoudige wyser, die nul wyser. 311 00:16:13,160 --> 00:16:15,320 Nog 'n manier om te skep 'n wyser is om te onttrek 312 00:16:15,320 --> 00:16:18,240 die adres van 'n veranderlike jy reeds gemaak het, 313 00:16:18,240 --> 00:16:22,330 en jy doen dit met behulp van die & operateur adres onttrekking. 314 00:16:22,330 --> 00:16:26,720 Wat ons reeds voorheen gesien in die eerste diagram voorbeeld wat ek het. 315 00:16:26,720 --> 00:16:31,450 So as x is 'n veranderlike wat ons het reeds geskep tipe integer, 316 00:16:31,450 --> 00:16:35,110 dan & x is 'n verwysing na 'n heelgetal. 317 00:16:35,110 --> 00:16:39,810 & x is- onthou & gaan onttrek die adres van die ding aan die regterkant. 318 00:16:39,810 --> 00:16:45,350 En omdat 'n wyser is net 'n adres, as & x is 'n verwysing na 'n heelgetal 319 00:16:45,350 --> 00:16:48,560 waarvan die waarde is waar in die geheue x lewens. 320 00:16:48,560 --> 00:16:50,460 Dit is adres x se. 321 00:16:50,460 --> 00:16:53,296 So & x is die adres van x. 322 00:16:53,296 --> 00:16:55,670 Kom ons neem 'n stap hierdie verder en verbind om iets 323 00:16:55,670 --> 00:16:58,380 Ek verwys na 'n vorige video. 324 00:16:58,380 --> 00:17:06,730 As arr is 'n verskeidenheid van die dubbelspel, dan & arr vierkante bracket i is 'n wyser 325 00:17:06,730 --> 00:17:08,109 om 'n dubbele. 326 00:17:08,109 --> 00:17:08,970 OK. 327 00:17:08,970 --> 00:17:12,160 skik vierkante bracket Ek, as arr is 'n verskeidenheid van die dubbelspel, 328 00:17:12,160 --> 00:17:19,069 dan skik vierkante bracket i is die i-de element van daardie skikking, 329 00:17:19,069 --> 00:17:29,270 en & skik vierkante bracket i is waar in geheue van die i-de element van arr bestaan. 330 00:17:29,270 --> 00:17:31,790 >> So, wat is die implikasie hier? 331 00:17:31,790 --> 00:17:34,570 'N skikkings naam, is die implikasie van hierdie hele ding, 332 00:17:34,570 --> 00:17:39,290 is dat die naam 'n skikking is eintlik self 'n wyser. 333 00:17:39,290 --> 00:17:41,170 Jy het gewerk met wysers al langs 334 00:17:41,170 --> 00:17:45,290 elke keer dat jy 'n verskeidenheid gebruik het. 335 00:17:45,290 --> 00:17:49,090 Onthou uit die voorbeeld op veranderlike omvang, 336 00:17:49,090 --> 00:17:53,420 naby die einde van die video wat ek aanbied 'n voorbeeld waar ons het 'n funksie 337 00:17:53,420 --> 00:17:56,890 genoem stel en 'n int funksie genoem stel skikking. 338 00:17:56,890 --> 00:18:00,490 En jou uitdaging om te bepaal of nie, of wat die 339 00:18:00,490 --> 00:18:03,220 waardes wat ons gedruk die einde van die funksie, 340 00:18:03,220 --> 00:18:05,960 aan die einde van die hoofprogram. 341 00:18:05,960 --> 00:18:08,740 >> As jy onthou van daardie voorbeeld of as jy die video gekyk het, 342 00:18:08,740 --> 00:18:13,080 jy weet dat wanneer die oproep om jou- stel int effektief doen niks. 343 00:18:13,080 --> 00:18:16,390 Maar die oproep om 'n skikking nie. 344 00:18:16,390 --> 00:18:19,280 En ek soort van glansende oor waarom dit was die geval by die tyd. 345 00:18:19,280 --> 00:18:22,363 Ek het net gesê, goed dit is 'n skikking, dit is spesiale, jy weet, daar is 'n rede. 346 00:18:22,363 --> 00:18:25,020 Die rede hiervoor is dat 'n skikking se naam is regtig net 'n wyser, 347 00:18:25,020 --> 00:18:28,740 en daar is hierdie spesiale sintaksis bracket vierkant wat 348 00:18:28,740 --> 00:18:30,510 maak dinge 'n baie lekkerder om mee te werk. 349 00:18:30,510 --> 00:18:34,410 En hulle maak die idee van 'n aanwijzer 'n baie minder intimiderend, 350 00:18:34,410 --> 00:18:36,800 en dit is hoekom hulle is soort van wat in daardie manier. 351 00:18:36,800 --> 00:18:38,600 Maar regtig skikkings is net wenke. 352 00:18:38,600 --> 00:18:41,580 En dit is hoekom wanneer ons 'n verandering aan die skikking, 353 00:18:41,580 --> 00:18:44,880 wanneer ons verby 'n verskeidenheid as 'n parameter om 'n funksie of as 'n argument 354 00:18:44,880 --> 00:18:50,110 om 'n funksie, die inhoud van die skikking in beide die callee eintlik verander 355 00:18:50,110 --> 00:18:51,160 en in die oproeper. 356 00:18:51,160 --> 00:18:55,846 Wat vir elke ander soort veranderlike wat ons gesien het, was nie die geval nie. 357 00:18:55,846 --> 00:18:58,970 So dit is net iets om in te hou gedagte wanneer jy werk met wysers, 358 00:18:58,970 --> 00:19:01,610 is dat die naam van 'n verskeidenheid eintlik 'n wyser 359 00:19:01,610 --> 00:19:04,750 om die eerste element van daardie skikking. 360 00:19:04,750 --> 00:19:08,930 >> OK so nou het ons al hierdie feite, laat ons gaan hou, reg. 361 00:19:08,930 --> 00:19:11,370 Hoekom moet ons omgee waar iets woon. 362 00:19:11,370 --> 00:19:14,120 Wel soos ek gesê het, dit is redelik nuttig om te weet waar iets woon 363 00:19:14,120 --> 00:19:17,240 sodat jy kan gaan en dit verander. 364 00:19:17,240 --> 00:19:19,390 Werk met dit en eintlik die ding wat jy 365 00:19:19,390 --> 00:19:23,710 wil doen om daardie veranderlike in werking tree, en nie in werking op 'n paar afskrif daarvan. 366 00:19:23,710 --> 00:19:26,150 Dit is die sogenaamde dereferencing. 367 00:19:26,150 --> 00:19:28,690 Ons gaan na die verwysing en ons die waarde te verander is daar. 368 00:19:28,690 --> 00:19:32,660 So as ons 'n wyser en dit genoem rekenaar, en dit dui op 'n karakter, 369 00:19:32,660 --> 00:19:40,610 dan kan ons sê * rekenaar en * PC is die naam van wat ons sal vind as ons gaan 370 00:19:40,610 --> 00:19:42,910 na die adres rekenaar. 371 00:19:42,910 --> 00:19:47,860 Wat ons sal daar vind, is 'n karakter en * PC is hoe ons verwys na die data op daardie 372 00:19:47,860 --> 00:19:48,880 plek. 373 00:19:48,880 --> 00:19:54,150 Sodat ons kan sê iets soos * PC = D of iets soos dit, 374 00:19:54,150 --> 00:19:59,280 en dit beteken dat alles wat was op geheue adres rekenaar, 375 00:19:59,280 --> 00:20:07,040 watter karakter was voorheen daar is nou D, as ons sê * PC = D. 376 00:20:07,040 --> 00:20:10,090 >> So hier gaan ons weer met sommige weird C goed, reg. 377 00:20:10,090 --> 00:20:14,560 So het ons voorheen gesien * as een of ander manier deel van die tipe data, 378 00:20:14,560 --> 00:20:17,160 en nou is dit wat gebruik word in 'n effens ander konteks 379 00:20:17,160 --> 00:20:19,605 om toegang tot die data op 'n plek. 380 00:20:19,605 --> 00:20:22,480 Ek weet dit is 'n bietjie verwarrend en dit is eintlik deel van hierdie hele 381 00:20:22,480 --> 00:20:25,740 soos, hoekom pointers hierdie mitologie rondom hulle as so kompleks, 382 00:20:25,740 --> 00:20:28,250 is 'n soort van 'n syntax probleem eerlik. 383 00:20:28,250 --> 00:20:31,810 Maar * word gebruik in beide kontekste, sowel as deel van die tik naam, 384 00:20:31,810 --> 00:20:34,100 en ons sal sien 'n bietjie later iets anders ook. 385 00:20:34,100 --> 00:20:36,490 En nou is die dereference operateur. 386 00:20:36,490 --> 00:20:38,760 So dit gaan na die verwysing, dit toegang tot die data 387 00:20:38,760 --> 00:20:43,000 op die ligging van die wyser, en kan jy dit manipuleer wil. 388 00:20:43,000 --> 00:20:45,900 >> Nou is dit baie soortgelyk aan besoek jou naaste, reg. 389 00:20:45,900 --> 00:20:48,710 As jy weet wat jou naaste woon, is jy 390 00:20:48,710 --> 00:20:50,730 nie uithang met jou naaste. 391 00:20:50,730 --> 00:20:53,510 Jy weet jy toevallig weet waar hulle woon, 392 00:20:53,510 --> 00:20:56,870 maar dit beteken nie dat deur hoofde van 'dat kennis 393 00:20:56,870 --> 00:20:59,170 jy interaksie met hulle. 394 00:20:59,170 --> 00:21:01,920 As jy wil om te kommunikeer met hulle, jy het om te gaan na hul huis, 395 00:21:01,920 --> 00:21:03,760 jy het om te gaan na waar hulle woon. 396 00:21:03,760 --> 00:21:07,440 En as jy dit doen, dan kan jy interaksie 397 00:21:07,440 --> 00:21:09,420 met hulle net soos jy graag wil hê om. 398 00:21:09,420 --> 00:21:12,730 En insgelyks met veranderlikes, wat jy nodig het om te gaan na hul adres 399 00:21:12,730 --> 00:21:15,320 as jy wil hê hulle interaksie, jy kan nie net weet wat die adres. 400 00:21:15,320 --> 00:21:21,495 En die manier waarop jy na die adres om te gebruik *, die dereference operateur. 401 00:21:21,495 --> 00:21:23,620 Wat dink jy gebeur As ons probeer dereference 402 00:21:23,620 --> 00:21:25,260 'n wyser waarvan die waarde is van nul? 403 00:21:25,260 --> 00:21:28,470 Onthou dat die nul wyser wys niks. 404 00:21:28,470 --> 00:21:34,110 So as jy probeer en dereference niks of gaan na 'n adres niks 405 00:21:34,110 --> 00:21:36,800 wat dink jy gebeur? 406 00:21:36,800 --> 00:21:39,630 Wel, as jy geraai segmentering fout, sou jy reg wees. 407 00:21:39,630 --> 00:21:41,390 As jy probeer en dereference 'n null pointer, 408 00:21:41,390 --> 00:21:43,140 jy aan 'n segmentering fout. Maar wag, 409 00:21:43,140 --> 00:21:45,820 het ek nie sê vir julle, As jy nie gaan 410 00:21:45,820 --> 00:21:49,220 om jou waarde van jou stel wyser na iets sinvol, 411 00:21:49,220 --> 00:21:51,000 jy moet stel om null? 412 00:21:51,000 --> 00:21:55,290 Ek het en eintlik die segmentering skuld is 'n soort van 'n goeie gedrag. 413 00:21:55,290 --> 00:21:58,680 >> Het jy al ooit 'n veranderlike en verklaar die waarde nie onmiddellik opgedra? 414 00:21:58,680 --> 00:22:02,680 Sodat jy net int x sê; jy doen nie dit eintlik wys enigiets 415 00:22:02,680 --> 00:22:05,340 en dan later in jou kode, jy druk die waarde van x, 416 00:22:05,340 --> 00:22:07,650 met nog nie opgedra dit tot niks. 417 00:22:07,650 --> 00:22:10,370 Dikwels jy kry nul, maar soms jy 418 00:22:10,370 --> 00:22:15,000 kan kry 'n paar random nommer, en jy het geen idee waar dit vandaan kom. 419 00:22:15,000 --> 00:22:16,750 Net so kan dinge gebeur met wysers. 420 00:22:16,750 --> 00:22:20,110 Wanneer jy 'n wyser te verklaar int * PK byvoorbeeld 421 00:22:20,110 --> 00:22:23,490 en jy dit nie te wys aan 'n waarde, jy vier grepe vir die geheue. 422 00:22:23,490 --> 00:22:25,950 Wat ook al vier grepe van geheue Die stelsel kan 423 00:22:25,950 --> 00:22:28,970 vind dat 'n betekenisvolle waarde het. 424 00:22:28,970 --> 00:22:31,760 En daar kon gewees het iets wat reeds daar dat 425 00:22:31,760 --> 00:22:34,190 is nie meer nodig is deur 'n ander funksie, so jy moet net 426 00:22:34,190 --> 00:22:35,900 watter data daar was. 427 00:22:35,900 --> 00:22:40,570 >> Wat gebeur as jy probeer om te doen dereference sommige adres wat u don't- daar was 428 00:22:40,570 --> 00:22:43,410 reeds grepe en inligting in daar, dis nou in jou wyser. 429 00:22:43,410 --> 00:22:47,470 As jy probeer en dereference dat pointer, jy dalk geknoei met 'n paar geheue 430 00:22:47,470 --> 00:22:49,390 dat jy nie van plan om te mors met dit alles. 431 00:22:49,390 --> 00:22:51,639 En in die feit dat jy kan doen iets wat regtig verwoestende, 432 00:22:51,639 --> 00:22:54,880 soos breek 'n ander program, of breek 'n ander funksie, 433 00:22:54,880 --> 00:22:58,289 of iets kwaadwillige doen jy het nie van plan om op alles te doen. 434 00:22:58,289 --> 00:23:00,080 En so dit is waarom dit is eintlik 'n goeie idee 435 00:23:00,080 --> 00:23:04,030 om jou wenke te stel om null as jy hulle nie ingestel om iets betekenisvol. 436 00:23:04,030 --> 00:23:06,760 Dit is waarskynlik beter by die einde van die dag vir jou program 437 00:23:06,760 --> 00:23:09,840 om te crash dan vir dit om te doen iets wat skroewe 438 00:23:09,840 --> 00:23:12,400 'n ander program of 'n ander funksie. 439 00:23:12,400 --> 00:23:15,207 Dit gedrag is waarskynlik selfs minder ideale as net gekraak. 440 00:23:15,207 --> 00:23:17,040 En so dit is waarom dit is eintlik 'n goeie gewoonte 441 00:23:17,040 --> 00:23:20,920 om in jou pointers stel om null as jy dit nie stel 442 00:23:20,920 --> 00:23:24,540 om 'n betekenisvolle waarde onmiddellik, 'n waarde dat jy weet 443 00:23:24,540 --> 00:23:27,260 en dat jy veilig kan die dereference. 444 00:23:27,260 --> 00:23:32,240 >> So laat kom nou terug en neem 'n blik by die algehele sintaksis van die situasie. 445 00:23:32,240 --> 00:23:37,400 As ek sê int * p ;, wat het ek nou net gedoen? 446 00:23:37,400 --> 00:23:38,530 Wat ek gedoen het, is dit. 447 00:23:38,530 --> 00:23:43,290 Ek weet dat die waarde van p is 'n adres want al pointers is net 448 00:23:43,290 --> 00:23:44,660 adresse. 449 00:23:44,660 --> 00:23:47,750 Ek kan dereference p die gebruik van die * operateur. 450 00:23:47,750 --> 00:23:51,250 In hierdie konteks hier, op die heel top onthou die * is deel van die tipe. 451 00:23:51,250 --> 00:23:53,510 Int * is die tipe data. 452 00:23:53,510 --> 00:23:56,150 Maar ek kan dereference p die gebruik van die * operateur, 453 00:23:56,150 --> 00:24:01,897 en as ek dit doen, as ek gaan na daardie adres, wat sal ek vind by daardie adres? 454 00:24:01,897 --> 00:24:02,855 Ek sal 'n heelgetal te vind. 455 00:24:02,855 --> 00:24:05,910 So int * p is basies sê, p is 'n adres. 456 00:24:05,910 --> 00:24:09,500 Ek kan dereference p en as Ek doen, sal ek 'n heelgetal te vind 457 00:24:09,500 --> 00:24:11,920 op daardie geheue plek. 458 00:24:11,920 --> 00:24:14,260 >> OK, so ek het gesê daar was 'n ander irriterende ding met sterre 459 00:24:14,260 --> 00:24:17,060 en hier is waar dat irriterende ding met sterre is. 460 00:24:17,060 --> 00:24:21,640 Het jy al ooit probeer om te verklaar verskeie veranderlikes van dieselfde soort 461 00:24:21,640 --> 00:24:24,409 op dieselfde lyn van die kode? 462 00:24:24,409 --> 00:24:27,700 So vir 'n tweede, voorgee dat die lyn, die kode Ek het eintlik daar in die groen 463 00:24:27,700 --> 00:24:29,366 is nie daar nie en dit net sê int x, y, z ;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Wat sou doen is eintlik skep drie heelgetal veranderlikes vir jou, 466 00:24:34,550 --> 00:24:36,930 een wat geroep is x, een wat geroep is y, en een wat geroep z. 467 00:24:36,930 --> 00:24:41,510 Dit is 'n manier om dit te doen sonder om te verdeel op drie lyne. 468 00:24:41,510 --> 00:24:43,890 >> Hier is waar sterre kry irriterende weer al is, 469 00:24:43,890 --> 00:24:49,200 omdat die * is eintlik deel van beide die naam en deel tipe 470 00:24:49,200 --> 00:24:50,320 van die veranderlike naam. 471 00:24:50,320 --> 00:24:56,430 En so as ek sê int * px, py, PZ, wat ek eintlik kry is 'n verwysing na 'n heelgetal 472 00:24:56,430 --> 00:25:01,650 genoem px en twee heelgetalle, py en PZ. 473 00:25:01,650 --> 00:25:04,950 En dit is waarskynlik nie wat ons wil hê, is dit nie goed nie. 474 00:25:04,950 --> 00:25:09,290 >> So as ek wil om veelvuldige verwysings te skep op dieselfde lyn, van dieselfde soort, 475 00:25:09,290 --> 00:25:12,140 en die sterre, wat ek werklik nodig om te doen is om te sê int * pa, * pb, * rekenaar. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Nou net gesê dat hy en nou vertel julle dit, 478 00:25:20,300 --> 00:25:22,170 jy sal waarskynlik nooit dit doen. 479 00:25:22,170 --> 00:25:25,170 En dit is waarskynlik 'n goeie ding eerlik, omdat jy dalk per ongeluk 480 00:25:25,170 --> 00:25:26,544 laat 'n ster, iets soos dit. 481 00:25:26,544 --> 00:25:29,290 Dit is waarskynlik die beste om miskien verklaar wenke oor individuele lyne, 482 00:25:29,290 --> 00:25:31,373 maar dit is net 'n ander een van daardie irriterende sintaksis 483 00:25:31,373 --> 00:25:35,310 dinge met sterre wat wysers so moeilik om mee te werk. 484 00:25:35,310 --> 00:25:39,480 Want dit is net die sintaktiese gemors wat jy het om deur te werk. 485 00:25:39,480 --> 00:25:41,600 Met die praktyk is dit nie regtig tweede natuur geword. 486 00:25:41,600 --> 00:25:45,410 Ek foute maak steeds met dit steeds ná ontwikkeling vir 10 jaar, 487 00:25:45,410 --> 00:25:49,630 so moenie ontsteld wees as daar iets gebeur vir julle, dit is redelik algemeen eerlik. 488 00:25:49,630 --> 00:25:52,850 Dit is regtig soort 'n fout van die sintaksis. 489 00:25:52,850 --> 00:25:54,900 >> OK, so ek soort van belowe dat ons sal weer 490 00:25:54,900 --> 00:25:59,370 die konsep van hoe groot is 'n string. 491 00:25:59,370 --> 00:26:02,750 Wel, as ek jou vertel dat 'n string, het ons regtig soort 492 00:26:02,750 --> 00:26:04,140 jok vir julle die hele tyd. 493 00:26:04,140 --> 00:26:06,181 Daar is geen tipe data genoem string, en in werklikheid Ek 494 00:26:06,181 --> 00:26:09,730 het dit al in een van ons vroegste video's op tipes data, 495 00:26:09,730 --> 00:26:13,820 dat string was 'n tipe data wat is geskep vir jou in CS50.h. 496 00:26:13,820 --> 00:26:17,050 Jy het om te include CS50.h om dit te gebruik. 497 00:26:17,050 --> 00:26:19,250 >> Wel string is regtig net 'n alias vir iets 498 00:26:19,250 --> 00:26:23,600 genoem die char *, 'n wyser na 'n karakter. 499 00:26:23,600 --> 00:26:26,010 Wel wysers, onthou, is net aanspreek. 500 00:26:26,010 --> 00:26:28,780 So, wat is die grootte in grepe van 'n string? 501 00:26:28,780 --> 00:26:29,796 Wel dit is vier of agt. 502 00:26:29,796 --> 00:26:32,170 En die rede waarom ek sê vier of agt, is omdat dit eintlik 503 00:26:32,170 --> 00:26:36,730 hang af van die stelsel, As jy ' CS50 ide, char * is die grootte van 'n kar 504 00:26:36,730 --> 00:26:39,340 * Is agt, dit is 'n 64-bis-stelsel. 505 00:26:39,340 --> 00:26:43,850 Elke adres in die geheue is 64 stukkies lank. 506 00:26:43,850 --> 00:26:48,270 As jy CS50 toestel of die gebruik van enige 32-bit masjien, 507 00:26:48,270 --> 00:26:51,640 en jy het die term 32-bit gehoor masjien, wat is 'n 32-bit masjien? 508 00:26:51,640 --> 00:26:56,090 Wel dit beteken net dat elke adres in die geheue is 32 stukkies lank. 509 00:26:56,090 --> 00:26:59,140 En so 32 stukkies vier grepe. 510 00:26:59,140 --> 00:27:02,710 So 'n char * is vier of agt grepe afhangende op jou stelsel. 511 00:27:02,710 --> 00:27:06,100 En inderdaad enige data tipes, en 'n verwysing na enige data 512 00:27:06,100 --> 00:27:12,030 tik, aangesien alle aanduidings is net adresse, vier of agt grepe. 513 00:27:12,030 --> 00:27:14,030 So laat heroorweeg hierdie diagram en laat ons die gevolgtrekking 514 00:27:14,030 --> 00:27:18,130 hierdie video met 'n bietjie oefening hier. 515 00:27:18,130 --> 00:27:21,600 So hier is die diagram ons opgehou het met aan die begin van die video. 516 00:27:21,600 --> 00:27:23,110 So wat gebeur nou as ek sê * PK = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 So wat beteken dit as ek sê, * PK = 35? 519 00:27:30,530 --> 00:27:32,420 Neem 'n tweede. 520 00:27:32,420 --> 00:27:34,990 * PK. 521 00:27:34,990 --> 00:27:39,890 In konteks hier, * is dereference operateur. 522 00:27:39,890 --> 00:27:42,110 So wanneer die dereference operateur gebruik word, 523 00:27:42,110 --> 00:27:48,520 ons gaan na die adres daarop om deur PK, en ons verander wat ons vind. 524 00:27:48,520 --> 00:27:55,270 So * PK = 35 effektief doen dit om die prentjie. 525 00:27:55,270 --> 00:27:58,110 So dit is basies sintakties identies aan dat hy gesê k = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Nog een. 528 00:28:01,930 --> 00:28:05,510 As ek sê int m, Ek skep 'n nuwe veranderlike genoem m. 529 00:28:05,510 --> 00:28:08,260 N nuwe boks, dit is 'n groen boks omdat dit gaan om 'n heelgetal te hou, 530 00:28:08,260 --> 00:28:09,840 en dit is gemerk m. 531 00:28:09,840 --> 00:28:14,960 As ek sê m = 4, sit ek 'n heelgetal in daardie boks. 532 00:28:14,960 --> 00:28:20,290 As sê PK = & m, hoe hierdie diagram verandering? 533 00:28:20,290 --> 00:28:28,760 PK = & m, het jy onthou wat die & Operateur doen of genoem word? 534 00:28:28,760 --> 00:28:34,430 Onthou dat sommige & veranderlike naam is die adres van 'n veranderlike naam. 535 00:28:34,430 --> 00:28:38,740 So wat ons sê is pk kry die adres van m. 536 00:28:38,740 --> 00:28:42,010 En so effektief wat gebeur die diagram is wat nie meer punte PK 537 00:28:42,010 --> 00:28:46,420 om k, maar punte te m. 538 00:28:46,420 --> 00:28:48,470 >> Weereens wenke is baie moeilik om te werk met 539 00:28:48,470 --> 00:28:50,620 en hulle neem 'n baie praktyk nie, maar omdat 540 00:28:50,620 --> 00:28:54,150 van hul vermoë om jou te laat om data tussen funksies slaag 541 00:28:54,150 --> 00:28:56,945 en eintlik diegene veranderinge in werking tree, 542 00:28:56,945 --> 00:28:58,820 kry jou kop rond is baie belangrik. 543 00:28:58,820 --> 00:29:02,590 Dit is waarskynlik die mees ingewikkelde onderwerp bespreek in CS50, 544 00:29:02,590 --> 00:29:05,910 maar die waarde wat u kry van die gebruik wenke 545 00:29:05,910 --> 00:29:09,200 veel groter as die komplikasies wat kom uit leer hulle. 546 00:29:09,200 --> 00:29:12,690 So ek wens jou die beste van Sterkte leer oor wenke. 547 00:29:12,690 --> 00:29:15,760 Ek is Doug Lloyd, dit is CS50. 548 00:29:15,760 --> 00:29:17,447