1 00:00:01,996 --> 00:00:07,485 [SKAN MŪZIKA] 2 00:01:13,297 --> 00:01:14,380 DEIVIDS J. Meilans: Labi. 3 00:01:14,380 --> 00:01:15,940 Šis ir CS50. 4 00:01:15,940 --> 00:01:17,260 Un šī ir ceturtā nedēļa. 5 00:01:17,260 --> 00:01:20,070 Un, ja padomājat jau pirms dažām nedēļām, nultajā nedēļā mēs sākām 6 00:01:20,070 --> 00:01:22,880 runāt par to, kas ir attēli, un mēs runājām par attēlu attēlošanu kā 7 00:01:22,880 --> 00:01:25,690 šo pikseļu režģi. 8 00:01:25,690 --> 00:01:28,923 Un katram pikselim ir kāds bitu modelis, kas nosaka tā krāsu. 9 00:01:28,923 --> 00:01:32,656 Šodien izrādās, ka mēs padziļināti apskatīsim, kā tādas lietas kā 10 00:01:32,656 --> 00:01:36,389 attēli un vēl daudz kas cits tiek izveidotas, izmantojot tikai šīs 11 00:01:36,389 --> 00:01:40,123 nulles un vieniniekus, un kā tagad kā programmētājs varat to 12 00:01:40,123 --> 00:01:43,856 izmantot, lai labāk izprastu un labāk manipulētu ar to, kas notiek 13 00:01:43,856 --> 00:01:47,590 datora atmiņā, izmantojot tādu valodu kā C. 14 00:01:47,590 --> 00:01:49,578 Patiesībā pat šī stresa bumbiņu bļoda, ko mēs nepārtraukti lietojam, 15 00:01:49,578 --> 00:01:51,567 protams, ir tikai fotogrāfija. 16 00:01:51,567 --> 00:01:54,481 Bet, ja jūs atceraties nullto nedēļu, ja jūs kaut kā uzlabojat, 17 00:01:54,481 --> 00:01:57,395 uzlabojat, uzlabojat šo attēlu, kā tas tiek darīts filmās, tas 18 00:01:57,395 --> 00:02:00,310 patiesībā nedarbojas tā, kā rāda Holivudas filmās. 19 00:02:00,310 --> 00:02:03,390 Turpinot tuvināt, tuvināt un tuvināt šādu ekrānu, jūs redzēsit, ka 20 00:02:03,390 --> 00:02:06,470 jā, tas kļūst lielāks. 21 00:02:06,470 --> 00:02:09,190 Bet, ja tas kļūst pārāk liels, ko jūs sākat pamanīt? 22 00:02:09,190 --> 00:02:10,539 Tā saukto pikselāciju. 23 00:02:10,539 --> 00:02:12,550 Un tiešām, jūs varat redzēt atsevišķus punktus. 24 00:02:12,550 --> 00:02:15,260 Tāpēc nākamreiz, kad televizorā skatīsities kādu pārraidi vai filmu, 25 00:02:15,260 --> 00:02:17,970 kurā ir šāda veida uzlabošanas veids, patiesībā pastāv 26 00:02:17,970 --> 00:02:20,680 noteiktslimits. 27 00:02:20,680 --> 00:02:23,680 Jūs varat uzlabot tikai tiktāl, ciktāl tur faktiski ir informācija. 28 00:02:23,680 --> 00:02:25,583 Bet, tiklīdz jūs tuvināt līdz noteiktam līmenim, piemēram, šādi, tas 29 00:02:25,583 --> 00:02:27,487 ir viss, kas tur ir. 30 00:02:27,487 --> 00:02:30,373 Jūs neredzēsit aizdomās turamā acu mirdzumu kādā krimināldrāmā tikai 31 00:02:30,373 --> 00:02:33,260 tāpēc, ka esat uzlabojis attēlu. 32 00:02:33,260 --> 00:02:36,130 Patiesībā tur ir tikai ierobežots informācijas daudzums. 33 00:02:36,130 --> 00:02:40,155 Taču arī šodien mēs redzēsim, ka, izprotot, kas notiek datora atmiņā, 34 00:02:40,155 --> 00:02:44,180 mēs varam sākt attēlot un pat radīt un kodēt interesantākas lietas. 35 00:02:44,180 --> 00:02:49,060 Piemēram, šeit ir bitkarte, tā teikt, kas ir nozares termins. 36 00:02:49,060 --> 00:02:51,037 Bitkarte ir attēla veids. 37 00:02:51,037 --> 00:02:53,201 Un tā ir bitu karte tādā nozīmē, ka jums ir šī koordinātu sistēma 38 00:02:53,201 --> 00:02:55,365 augšā, lejā, pa kreisi, pa labi vismaz šī mākslinieka attēlojumā 39 00:02:55,365 --> 00:02:57,530 šeit. 40 00:02:57,530 --> 00:03:02,190 Un pieņemsim, ka varbūt mēs visi kā pasaule nolemjam, ka viens attēlo 41 00:03:02,190 --> 00:03:06,850 balto krāsu, bet nulle - melno. 42 00:03:06,850 --> 00:03:12,160 Kas patiesībā varētu būt šī bitu karte, šī bitkarte? 43 00:03:12,160 --> 00:03:13,330 Vai jūs varat redzēt tai cauri? 44 00:03:13,330 --> 00:03:13,830 Jā. 45 00:03:13,830 --> 00:03:14,740 Auditorija: [Nesaklausāms] 46 00:03:14,740 --> 00:03:16,900 DEIVIDS J. Meilans: Tā patiešām ir smaidoša sejiņa. 47 00:03:16,900 --> 00:03:18,070 Tātad pārsteidzoša acs. 48 00:03:18,070 --> 00:03:20,832 Ja es patiešām pārvēršu visus vieniniekus baltus, lai to vizualizētu, 49 00:03:20,832 --> 00:03:23,595 jūs patiešām redzēsit, ka tas ir tas, kas tur tika iegults. 50 00:03:23,595 --> 00:03:25,992 Bet, protams, mūsu datoru monitoros un tālruņos ir šis kvadrātu 51 00:03:25,992 --> 00:03:28,390 režģis, šis pikseļu režģis. 52 00:03:28,390 --> 00:03:32,095 Tātad, ja jūs patiešām redzētu ekrānā smaidošu seju, piemēram, 53 00:03:32,095 --> 00:03:35,800 melnbaltu, tas, kas, iespējams, notiek zem pārsega, ir tikai dažas 54 00:03:35,800 --> 00:03:39,505 nulles un vieninieki, un varbūt atsevišķi biti, viena bita krāsa, tā 55 00:03:39,505 --> 00:03:43,210 teikt, kur viens apzīmē baltu un nulle apzīmē melnu. 56 00:03:43,210 --> 00:03:46,680 Tātad, ja jums patīk šī lieta, izrādās, ka varat darīt diezgan 57 00:03:46,680 --> 00:03:50,150 skaistas, diezgan interesantas, diezgan mākslinieciskas lietas. 58 00:03:50,150 --> 00:03:53,505 Ja brīvajā laikā apmeklēsit šo URL, cs50.ly.art, tas faktiski 59 00:03:53,505 --> 00:03:56,860 novirzīs jūs uz Google izklājlapu, ko esam iepriekš izveidojuši. 60 00:03:56,860 --> 00:04:00,740 Mēs esam nedaudz samazinājuši rindas un kolonnas, lai tās atgādinātu 61 00:04:00,740 --> 00:04:04,620 pikseļu režģi, sīkus kvadrātiņus, kas visi pēc noklusējuma ir balti, 62 00:04:04,620 --> 00:04:08,500 atšķirībā no šī molberta, pie kura mums strādā pāris brīvprātīgie. 63 00:04:08,500 --> 00:04:10,770 Patiesībā, vai jūs, puiši, vēlētos uz mirkli atnākt priekšā un ātri 64 00:04:10,770 --> 00:04:13,040 sassveicināties, pirms mēs atgriežamies pie jums? 65 00:04:13,040 --> 00:04:13,630 DANIELS: Sveiki. 66 00:04:13,630 --> 00:04:14,530 Mani sauc Daniels. 67 00:04:14,530 --> 00:04:15,542 Es esmu no Čikāgas. 68 00:04:15,542 --> 00:04:16,959 DEIVIDS Dž. Malāns: Laipni lūgts, Daniel! 69 00:04:16,959 --> 00:04:18,112 Un... Ādams: Sveiki, visi. 70 00:04:18,112 --> 00:04:19,000 Es esmu Ādams. 71 00:04:19,000 --> 00:04:20,950 Un es esmu no Trinidādas un Tobāgo. 72 00:04:20,950 --> 00:04:21,250 DEIVIDS J. Meilans: Jauki. 73 00:04:21,250 --> 00:04:22,333 Labi, laipni lūdzam jūs abus. 74 00:04:22,333 --> 00:04:23,020 Paldies. 75 00:04:23,020 --> 00:04:25,471 Jūs redzēsiet, ka viņu rokās patiesībā ir vesela kaudze pikseļu, 76 00:04:25,471 --> 00:04:27,922 līmlapiņas, kuras esam viņiem iedevuši iepriekš. 77 00:04:27,922 --> 00:04:30,578 Tātad, ja jūs neiebilstat, mēs atgriezīsimies pie jums pēc dažām 78 00:04:30,578 --> 00:04:33,234 minūtēm un redzēsim, ko viņi ir izveidojuši, tā teikt, uz šī baltā 79 00:04:33,234 --> 00:04:35,890 papīra režģa, līdzīgi kā jūs varētu izveidot šajā Google izklājlapā. 80 00:04:35,890 --> 00:04:39,145 Ja vēlaties, sūtiet mums savus darbus, izmantojot vietrādi URL, ko 81 00:04:39,145 --> 00:04:42,400 iegūsit vietnē cs50.ly/art. 82 00:04:42,400 --> 00:04:44,440 Tagad atgriezīsimies pie nultās nedēļas, kur mēs definējām dažus 83 00:04:44,440 --> 00:04:46,480 attēlu veidošanas blokus. 84 00:04:46,480 --> 00:04:49,240 Mēs runājām par RGB, kas ir tikai sarkana, zaļa, zila krāsa. 85 00:04:49,240 --> 00:04:52,143 Un tā ir tikai viena no sistēmām, populāra sistēma, ar kuras 86 00:04:52,143 --> 00:04:55,046 palīdzību jūs varat attēlot jebkuru varavīksnes krāsu, izmantojot 87 00:04:55,046 --> 00:04:57,950 kādu sarkanās, zaļās un zilās krāsas kombināciju. 88 00:04:57,950 --> 00:05:01,120 Un, ja kāds no jums ir mākslinieciski noskaņots vai ir izmantojis 89 00:05:01,120 --> 00:05:04,290 Photoshop vai līdzīgas programmas, parasti jums ir daži līdzekļi, kā 90 00:05:04,290 --> 00:05:07,460 izvēlēties krāsu, izmantojot šādu režģi. 91 00:05:07,460 --> 00:05:09,630 Taču ievērojiet, ka šeit ir skaidri norādīti izmantoto krāsu sistēmu 92 00:05:09,630 --> 00:05:11,800 veidi. 93 00:05:11,800 --> 00:05:13,150 RGB. 94 00:05:13,150 --> 00:05:15,820 Un patiesībā šeit jūs redzat nulli, nulli, nulli. 95 00:05:15,820 --> 00:05:18,460 Un šeit augšā zem New ir melna krāsa. 96 00:05:18,460 --> 00:05:21,400 Un tas nozīmē, ka, ja jums nav ne sarkana, ne zaļa, ne zila, tad 97 00:05:21,400 --> 00:05:24,340 tradicionāli tas patiešām nozīmētu melno krāsu. 98 00:05:24,340 --> 00:05:27,970 Turpretim, ja mēs spēlējamies ar Photoshop vai kādu līdzīgu 99 00:05:27,970 --> 00:05:31,600 programmu, ja jums ir daudz sarkanā, daudz zaļā un daudz zilā, 100 00:05:31,600 --> 00:05:35,230 piemēram, 255, 255, 255, patiešām palieliniet to līdz maksimālajai 101 00:05:35,230 --> 00:05:38,860 vērtībai, jūs varat attēlot ar 8 bitiem nedēļā nulli, tad izrādās, ka 102 00:05:38,860 --> 00:05:42,490 jūs šeit iegūstat balto krāsu. 103 00:05:42,490 --> 00:05:44,650 Un ar šiem cipariem varam spēlēties bezgalīgi. 104 00:05:44,650 --> 00:05:48,773 Piemēram, ja mēs izmantojam 255 sarkanās, bet nulle zaļās un nulles 105 00:05:48,773 --> 00:05:52,896 zilās, nepārsteidzoši, kvadrāts ekrāna augšdaļā, protams, kļūst 106 00:05:52,896 --> 00:05:57,020 pilnībā sarkans, jo tas viss ir sarkans un nav zaļš vai zils. 107 00:05:57,020 --> 00:05:59,760 Ja mēs mainām to uz 255 zaļajai, bet nulli sarkanajai un zilajai, 108 00:05:59,760 --> 00:06:02,500 protams, mēs iegūstam zaļu. 109 00:06:02,500 --> 00:06:04,930 Un visbeidzot, ja mēs palielinam zilo krāsu, bet atstājam sarkano un 110 00:06:04,930 --> 00:06:07,360 zaļo uz nulli, mēs, protams, iegūstam zilu. 111 00:06:07,360 --> 00:06:10,805 Bet visu šo laiku šeit ir izcelts kaut kas tāds, ko, iespējams, daži 112 00:06:10,805 --> 00:06:14,250 no jums jau ir redzējuši, piemēram, ciparu un burtu kombinācija. 113 00:06:14,250 --> 00:06:16,210 Ja kāds no jums ir izveidojis personiskas tīmekļa lapas vai 114 00:06:16,210 --> 00:06:18,170 izmantojis tādas programmas kā Photoshop, iespējams, esat izmantojis 115 00:06:18,170 --> 00:06:20,130 šos tā sauktos krāsu kodus. 116 00:06:20,130 --> 00:06:23,530 Tik tiešām, pasaulē ir šāda vienošanās, saskaņā ar kuru, izmantojot 117 00:06:23,530 --> 00:06:26,930 sešus ciparus vai dažreiz trīs, jūs varat nedaudz precīzāk attēlot 118 00:06:26,930 --> 00:06:30,330 sarkanās, zaļās, zilās krāsas daudzumu. 119 00:06:30,330 --> 00:06:33,810 Un jūs redzēsiet šeit, varbūt netieši, ka, ja RGB ir attiecīgi nulle, 120 00:06:33,810 --> 00:06:37,290 nulle, 255, iespējams, ka mēs ejam uz to, ka nulle, nulle, nulle, 121 00:06:37,290 --> 00:06:40,770 nulle, FF ir tikai alternatīvs veids, kā izteikt precīzu to pašu 122 00:06:40,770 --> 00:06:44,250 ideju. 123 00:06:44,250 --> 00:06:46,710 Nav sarkanas, nav zaļas un daudz zilas krāsas. 124 00:06:46,710 --> 00:06:48,210 Bet kāpēc tā? 125 00:06:48,210 --> 00:06:50,220 Un patiesībā mēs šeit iziesim pilnu apli, lai ieviestu kaut ko tādu, 126 00:06:50,220 --> 00:06:52,230 ko mēs būtu varējuši paveikt nultajā nedēļā, bet tad tas īsti 127 00:06:52,230 --> 00:06:54,240 neatrisina problēmu. 128 00:06:54,240 --> 00:06:57,380 Bet šodien, kad mēs vairāk koncentrējamies uz attēliem un pašu 129 00:06:57,380 --> 00:07:00,520 atmiņu, izrādās, ka šo sistēmu izpratne ir diezgan noderīga. 130 00:07:00,520 --> 00:07:03,390 Tātad nultajā nedēļā mēs, protams, runājām par bināro. 131 00:07:03,390 --> 00:07:07,560 Un binārais, nozīmējot divus, dod tikai divus ciparus, nulle un viens. 132 00:07:07,560 --> 00:07:10,185 Jūs un es kā cilvēki parastās sarunās gandrīz vienmēr lietojam 133 00:07:10,185 --> 00:07:12,810 decimālo sistēmu, kas nozīmē 10. 134 00:07:12,810 --> 00:07:15,270 Tā vietā mums ir no nulles līdz deviņi. 135 00:07:15,270 --> 00:07:19,245 Ja cilvēks, piemēram, mēs, vēlas saskaitīt līdz 10, 11 vai 12, mums 136 00:07:19,245 --> 00:07:23,220 nav cipara 10, 11 un 12. 137 00:07:23,220 --> 00:07:24,850 Mēs sākam atkārtoti izmantot ciparus. 138 00:07:24,850 --> 00:07:27,580 Tātad tas ir viens nulle, viens viens, viens divi un tā tālāk. 139 00:07:27,580 --> 00:07:31,466 Taču citās sistēmās, nevis binārās, nevis decimālās, bet gan 140 00:07:31,466 --> 00:07:35,353 heksadecimālās sistēmās, kas nozīmē 16, patiesībā ir vairāk ciparu 141 00:07:35,353 --> 00:07:39,240 nekā šie, kas varētu būt pārsteigums. 142 00:07:39,240 --> 00:07:42,403 Tie nav ciparu pāri, piemēram, decimālskaitļi - atsevišķi cipari. 143 00:07:42,403 --> 00:07:44,820 Un, godīgi sakot, nav īsti svarīgi, kādi ir cipari. 144 00:07:44,820 --> 00:07:48,103 Tā kā galu galā tie ir tikai simboli, kas jums un man uzreiz 145 00:07:48,103 --> 00:07:51,386 asociējas ar kādu matemātikas jēdzienu, bet tikai triepieni uz 146 00:07:51,386 --> 00:07:54,670 ekrāna, kas apzīmē kādu – atspoguļo kādu faktisko vērtību. 147 00:07:54,670 --> 00:07:58,476 Tātad izrādās, ka tradicionāli, ja vēlaties vairāk nekā deviņus — 148 00:07:58,476 --> 00:08:02,283 10 ciparus, no nulles līdz deviņi, jūs sākat lietot angļu alfabēta 149 00:08:02,283 --> 00:08:06,090 burtus — A, B, C, D, E un F. 150 00:08:06,090 --> 00:08:07,770 Un jūs varat tos attēlot ar mazajiem burtiem. 151 00:08:07,770 --> 00:08:08,820 Tas nav reģistrjutīgs. 152 00:08:08,820 --> 00:08:09,690 Tāpēc tam nav īsti nozīmes. 153 00:08:09,690 --> 00:08:11,482 To var redzēt ar lielajiem vai mazajiem burtiem. 154 00:08:11,482 --> 00:08:14,486 Bet šādā veidā jūs varat skaitīt tālāk par deviņi, neizmantojot 155 00:08:14,486 --> 00:08:17,490 decimālo, bet izmantojot kaut ko, ko sauc par heksadecimālo. 156 00:08:17,490 --> 00:08:20,700 Ja mēs runājam patiešām tehniski, to sauc arī par base-16. 157 00:08:20,700 --> 00:08:23,300 Un tā ir tāda pati ideja kā nultajā nedēļā, kur tā vietā, lai 158 00:08:23,300 --> 00:08:25,900 izmantotu bāzi 2 binārajā sistēmā, un āzi 10 decimālajā, jūs 159 00:08:25,900 --> 00:08:28,500 izmantojat 16 kā heksadecimālās sistēmas bāzi. 160 00:08:28,500 --> 00:08:32,144 Un tāpēc, ja mēs aplūkojam tikai dažus vienkāršus piemērus šeit 161 00:08:32,144 --> 00:08:35,789 heksadecimālajā pasaulē, jūsu kolonnas ir tikai 16. 162 00:08:35,789 --> 00:08:40,419 16 pie 0, 16 pie 1, 16 pie 2 un tā tālāk. 163 00:08:40,419 --> 00:08:43,089 Bet hex pasaulē mēs parasti, vismaz līdz šim, un šodien mēs redzēsim 164 00:08:43,089 --> 00:08:45,760 tikai šādus ciparu pārus. 165 00:08:45,760 --> 00:08:48,130 Tātad šeit, piemēram, ir vieninieku kolonna un 16 kolonna, ja mēs to 166 00:08:48,130 --> 00:08:50,500 reizinām. 167 00:08:50,500 --> 00:08:54,515 Tātad, ja jūs vēlētos attēlot skaitli, kuru jūs un es reālajā pasaulē 168 00:08:54,515 --> 00:08:58,530 zinām kā nulli heksadecimālā, tas būtu tikai nulle, nulle. 169 00:08:58,530 --> 00:09:01,500 Ja vēlaties attēlot skaitli viens, tas būtu nulle viens. 170 00:09:01,500 --> 00:09:04,410 Un no turienes mēs iegūstam nulle divi, nulle trīs, nulle četri, 171 00:09:04,410 --> 00:09:07,320 nulle pieci, nulle seši, nulle septiņi, nulle astoņi, nulle deviņi, 172 00:09:07,320 --> 00:09:10,230 tagad lietas kļūst potenciāli interesantas. 173 00:09:10,230 --> 00:09:12,330 Decimālā sistēmā tas acīmredzami kļūtu par 10. 174 00:09:12,330 --> 00:09:16,530 Bet heksadecimālā tas vienkārši kļūst par nulli a, tad nulle b, 175 00:09:16,530 --> 00:09:20,730 proti, ja es attītu atpakaļ, pēc deviņi nāk heksadecimāls, ja es to 176 00:09:20,730 --> 00:09:24,930 izrunāju decimālā, šādi jūs attēlotu 10. 177 00:09:24,930 --> 00:09:30,440 Tādā veidā jūs attēlojat 11, 12, 13, 14, un, visbeidzot, 178 00:09:30,440 --> 00:09:35,950 heksadecimālā 16. vērtība ir F, kas vienmēr ir 15. 179 00:09:35,950 --> 00:09:39,210 Tātad, kur — kā to savienot ar iepriekšējo matemātiku? 180 00:09:39,210 --> 00:09:42,400 Nu, ja heksadecimālā ir sasniegta nulle F, ja F ir lielākais, ko 181 00:09:42,400 --> 00:09:45,590 varat saskaitīt, tāpat kā decimālā deviņi ir lielākais, ko varat 182 00:09:45,590 --> 00:09:48,780 saskaitīt, kas notiks tālāk? 183 00:09:48,780 --> 00:09:52,650 Ja tas ir 15, es pieprasu, kā es varu attēlot 16 heksadecimālā veidā 184 00:09:52,650 --> 00:09:56,520 ar kādu simbolu sistēmu? 185 00:09:56,520 --> 00:09:58,600 Kāda simbolu sistēma heksadecimālā? 186 00:09:58,600 --> 00:09:59,100 Jā. 187 00:09:59,100 --> 00:09:59,892 Auditorija: Viena nulle. 188 00:09:59,892 --> 00:10:01,986 DEIVIDS J. Meilans: Tātad viens nulle, nevis 10, lai gan jūs to 189 00:10:01,986 --> 00:10:04,080 varētu lasīt tā kā tipisks cilvēks. 190 00:10:04,080 --> 00:10:05,400 Bet viens nulle. 191 00:10:05,400 --> 00:10:06,207 Jo kāpēc? 192 00:10:06,207 --> 00:10:08,773 Pat ja tas jums ir pilnīgi jauns, visa kolonnu sistēma, vietas 193 00:10:08,773 --> 00:10:11,340 intuitīvi ir tieši tādas pašas. 194 00:10:11,340 --> 00:10:15,360 Tātad jums ir nepieciešams viens 16 vietā un nulle viens vietā. 195 00:10:15,360 --> 00:10:19,147 Un mēs neskaitīsim līdz 255, bet mēs skaitīsim, ja mēs saskaitām 196 00:10:19,147 --> 00:10:22,935 nedaudz tālāk, tas būtu viens nulle, AKA 16 decimālā, šis būtu viens 197 00:10:22,935 --> 00:10:26,722 viens, AKA 17 decimālā un tad 18, 19, 20 un tā tālāk, punkts, punkts, 198 00:10:26,722 --> 00:10:30,510 punkts. 199 00:10:30,510 --> 00:10:33,300 Un mēs varam skaitīt līdz pat FF. 200 00:10:33,300 --> 00:10:35,955 Jo, ja F ir lielākais cipars heksadecimālā, FF patiešām ir tik liels, 201 00:10:35,955 --> 00:10:38,610 cik mēs varam saskaitīt. 202 00:10:38,610 --> 00:10:42,570 Un, ja katrs F ir 15, tad vienkārši rēķināsim kā nultajā nedēļā. 203 00:10:42,570 --> 00:10:46,410 Tātad 16 reiz f plus 1 reiz f ir tas, kā mēs visi mācāmies matemātiku 204 00:10:46,410 --> 00:10:50,250 pamatskolā, kaut arī ne heksadecimālā veidā. 205 00:10:50,250 --> 00:10:54,480 Tas, protams, ir 16 reiz 15 plus 1 reiz 15. 206 00:10:54,480 --> 00:10:57,810 Reiziniet to, iegūsiet 240 plus 15. 207 00:10:57,810 --> 00:11:01,348 Un tāpēc, izmantojot divus heksadecimālos ciparus, varat saskaitīt 208 00:11:01,348 --> 00:11:04,887 pat 255. 209 00:11:04,887 --> 00:11:07,408 Tātad tas nav nekas tāds, kas būtu interesants prāta vingrinājums, 210 00:11:07,408 --> 00:11:09,930 lai kādreiz rēķinātu galvā. 211 00:11:09,930 --> 00:11:12,496 Kopumā jūs pieradīsit pie tā, ka pēc deviņi nāk A un lielākais cipars 212 00:11:12,496 --> 00:11:15,063 ir F. 213 00:11:12,740 --> 00:11:16,130 Un jūs vienkārši sāksit redzēt šādas sistēmas Photoshop pasaulē, 214 00:11:16,130 --> 00:11:19,520 tīmekļa lapās pēc dažām nedēļām un vēlāk. 215 00:11:19,520 --> 00:11:22,760 Bet kāpēc heksadecimāla sistēma ir noderīga? 216 00:11:22,760 --> 00:11:25,225 Kāpēc mēs sarežģījam pasauli un pievienojam decimālai sistēmai kaut 217 00:11:25,225 --> 00:11:27,690 ko vēl? 218 00:11:27,690 --> 00:11:30,325 Nu, izrādās, ka viens decimālskaitlis, kā F, piemēram, lielākais, ir 219 00:11:30,325 --> 00:11:32,960 15. 220 00:11:32,960 --> 00:11:35,360 Un šeit ļaujiet man tikai piedāvāt mazliet matemātikas galvā. 221 00:11:35,360 --> 00:11:41,270 Cik bitu jums ir nepieciešams, lai binārā sitēmā attēlotu skaitli 15? 222 00:11:41,270 --> 00:11:47,166 Ja jums ir vieninieki, divnieki, 4 un tā tālāk, cik bitu ir kopā? 223 00:11:47,166 --> 00:11:47,980 Auditorija: pieci. 224 00:11:47,980 --> 00:11:51,610 DEIVIDS Dž. Meilans: Manuprāt, mazāk par pieciem, lai saskaitītu 15. 225 00:11:51,610 --> 00:11:53,350 Bet tuvu. 226 00:11:53,350 --> 00:11:55,960 Kāds cits? 227 00:11:55,960 --> 00:11:56,720 Es redzu roku. 228 00:11:56,720 --> 00:11:57,220 Jā. 229 00:11:57,220 --> 00:11:57,845 Auditorija: četri. 230 00:11:57,845 --> 00:12:00,340 DEIVIDS J. Meilans: Tātad ar četriem bitiem, manuprāt, pietiek. 231 00:12:00,340 --> 00:12:03,625 Jo, ja vēlaties skaitīt līdz F, tas ir, 15, es domāju, ka, ja jums ir 232 00:12:03,625 --> 00:12:06,910 četri biti, jūs varat to izdarīt. 233 00:12:06,910 --> 00:12:10,330 Jo, ja šeit ir vieninieku vieta no nultās nedēļas binārās sistēmas, 234 00:12:10,330 --> 00:12:13,750 šī ir divnieku vieta, šī ir četrinieku vieta, šī ir astotnieku vieta. 235 00:12:13,750 --> 00:12:14,710 Veiciet ātru aprēķinu. 236 00:12:14,710 --> 00:12:19,370 Tātad 8 plus 4 ir 12, plus 2 ir 14, plus 1 ir 15. 237 00:12:19,370 --> 00:12:22,865 Tātad izrādās, ka ērtības labad heksadecimālos ciparus var 238 00:12:22,865 --> 00:12:26,360 konsekventi attēlot ar četriem vai mazāk bitiem. 239 00:12:26,360 --> 00:12:27,190 Bet četri. 240 00:12:27,190 --> 00:12:29,140 Un četri, protams, ir puse no astoņi. 241 00:12:29,140 --> 00:12:31,365 Un astoņi ir visur, tāpat kā 8 biti ir baits, kas atkal ir tikai 242 00:12:31,365 --> 00:12:33,590 pieņemta sistēma, ko mēs esam redzējuši. 243 00:12:33,590 --> 00:12:37,660 Iemesls tam, ka Photoshop pasaulē un, visbeidzot, arī tīmekļa lapās 244 00:12:37,660 --> 00:12:41,730 redzat heksadecimālo, ir tas, ka patiesībā tas vienkārši lieliski 245 00:12:41,730 --> 00:12:45,800 atbilst bināro skaitļu izteiksmei kodolīgāk ar fiksētu ciparu skaitu. 246 00:12:45,800 --> 00:12:49,530 Tā, piemēram, ikreiz, kad redzat 11111111 binārajā pasaulē, jūs zināt 247 00:12:49,530 --> 00:12:53,260 ko? 248 00:12:53,260 --> 00:12:55,600 To ir nedaudz garlaicīgi gan teikt, gan rakstīt. 249 00:12:55,600 --> 00:13:02,455 Jebkuru četru 1 bitu grupu varat precīzāk attēlot heksadecimālā veidā 250 00:13:02,455 --> 00:13:09,310 kā tikai F. 251 00:13:02,230 --> 00:13:08,590 Tātad 11111111 binārajā formātā daudz kodolīgāk un tagad Photoshop 252 00:13:08,590 --> 00:13:14,950 pasaulē, atmiņā, attēlos un tamlīdzīgi tiek attēloti kodolīgāk kā FF. 253 00:13:14,950 --> 00:13:18,350 Un tieši tāpēc, jo tas vienkārši lieliski tiek kartēts līdz 4 bitiem. 254 00:13:18,350 --> 00:13:20,630 Un tāpēc mēs varam būt nedaudz kodolīgāki. 255 00:13:20,630 --> 00:13:22,956 Vai jums ir jautājumi par heksadecimālo sistēmu, kas ir tikai vēl 256 00:13:22,956 --> 00:13:25,283 viens veids, kā attēlot informāciju, bet izmantojot to pašu 257 00:13:25,283 --> 00:13:27,610 pamatskolas pieeju? 258 00:13:27,610 --> 00:13:28,110 Jā. 259 00:13:28,110 --> 00:13:30,030 Auditorija: Tātad... DEIVIDS Dž. Meilans: Labs jautājums. 260 00:13:30,030 --> 00:13:33,130 Ja jūs attēlojat 15 ar F, tas izmantotu 4 bitus. 261 00:13:33,130 --> 00:13:35,980 Tātad bāzes sistēmas patiesībā ir tikai veids, kā mums, cilvēkiem, uz 262 00:13:35,980 --> 00:13:38,830 papīra vai ekrāna attēlot informāciju. 263 00:13:38,830 --> 00:13:42,220 Ja F apzīmē decimālskaitli 15, datoram zem “pārsega” ir jāizmanto 4 264 00:13:42,220 --> 00:13:45,610 biti, lai to attēlotu. 265 00:13:45,610 --> 00:13:51,160 Tātad viens heksadecimālais cipars vienmēr nozīmē 4 bitus datorā . 266 00:13:51,160 --> 00:13:53,840 Tāpēc, ja jums ir divi heksadecimālie cipari, piemēram, nulle, nulle, 267 00:13:53,840 --> 00:13:56,520 tas nozīmē, ka datorā ir astoņi nulles biti, piemēram, sarkanai vai 268 00:13:56,520 --> 00:13:59,200 zaļai. 269 00:13:59,200 --> 00:14:01,330 Ja redzat FF, tagad mēs zinām, ka tie ir 4 vieninieka biti un vēl 4 270 00:14:01,330 --> 00:14:03,460 vieninieka biti. 271 00:14:03,460 --> 00:14:05,650 Un, ja mēs veicam aprēķinu, tas ir 255. 272 00:14:05,650 --> 00:14:09,985 Tāpēc programmā Photoshop 0000FF nozīmē, ka nav sarkanas, nav zaļas 273 00:14:09,985 --> 00:14:14,320 un ir 255 zilas. 274 00:14:14,320 --> 00:14:16,705 Un tas ir daudz kodolīgāk nekā uzrakstīt ko, 8 plus 8, plus 8, 24 275 00:14:16,705 --> 00:14:19,090 nulles un vieninieki. 276 00:14:19,090 --> 00:14:22,181 Un tas ir vienkārši tīrāk nekā pat decimālskaitļu izmantošana, ja 277 00:14:22,181 --> 00:14:25,273 izmantojat vienības pa astoņi, ko arī datori izmanto visur. 278 00:14:25,273 --> 00:14:26,440 Tātad tā ir tikai cita sistēma. 279 00:14:26,440 --> 00:14:28,273 Tā nav tāda, pie kā jums vajadzētu daudz pakavēties. 280 00:14:28,273 --> 00:14:32,110 Bet atkal, tā būtībā neatšķiras no binārās vai decimālās. 281 00:14:32,110 --> 00:14:34,977 Mēs tikai izmantojam nedaudz atšķirīgu bāzi. 282 00:14:34,977 --> 00:14:35,560 Tagad viss kārtībā. 283 00:14:35,560 --> 00:14:37,720 Nu, mums šeit bija šis tukšais audekls. 284 00:14:37,720 --> 00:14:39,930 Un es domāju, vai jūs abi varbūt esat gatavi atklāt pasaulei to, ko 285 00:14:39,930 --> 00:14:42,140 esat radījuši? 286 00:14:42,140 --> 00:14:45,170 Vai vēlaties turpināt un... Es to pagriezīšu jūsu vietā. 287 00:14:45,170 --> 00:14:45,670 Labi. 288 00:14:45,670 --> 00:14:46,180 Lūk. 289 00:14:46,180 --> 00:14:46,870 Lielā atklāšana. 290 00:14:46,870 --> 00:14:51,760 Un šodienas pikseļu māksla, aplausi, lūdzu. 291 00:14:54,280 --> 00:14:55,325 Ļoti labi padarīts. 292 00:14:55,325 --> 00:14:56,200 Nu paldies abiem. 293 00:14:56,200 --> 00:14:58,315 Ja vēlaties uznākt pēc tam, noplēst to un nest mājās, laipni lūgti, 294 00:14:58,315 --> 00:15:00,430 un paturiet arī līmlapiņas. 295 00:15:00,430 --> 00:15:02,140 Nu, paldies mūsu brīvprātīgajiem. 296 00:15:02,140 --> 00:15:05,050 Tagad pārtulkosim to uz patiešām tehniskāku pasauli, kur mēs to 297 00:15:05,050 --> 00:15:07,960 redzēsim un apsvērsim biežāk. 298 00:15:07,960 --> 00:15:10,467 Jo patiesībā dažreiz, kad pēdējo nedēļu laikā esat saņēmis kļūdu 299 00:15:10,467 --> 00:15:12,975 ziņojumus no kompilatora Clang, jūs, iespējams, esat redzējis pat 300 00:15:12,975 --> 00:15:15,483 heksadecimālās sistēmas pierādījumus. 301 00:15:15,483 --> 00:15:16,400 Mēs to neizsaucām. 302 00:15:16,400 --> 00:15:17,980 Toreiz to zināt nebija lietderīgi. 303 00:15:17,980 --> 00:15:22,455 Taču izrādās, ka daudzas programmas izmanto un daudzi kodi izmanto 304 00:15:22,455 --> 00:15:26,930 heksadecimālo sistēmu precīzāku – kodolīgāku attēlojumu dēļ. 305 00:15:26,930 --> 00:15:28,840 Piemēram, kur vēl mēs to varētu redzēt? 306 00:15:28,840 --> 00:15:31,990 Nu, lūk, tas attēls, ko mēs turpinām izvilkt no sava datora atmiņas. 307 00:15:31,990 --> 00:15:34,600 Un katrs no šiem kvadrātiem šajā režģī apzīmē baitu, datora atmiņā no 308 00:15:34,600 --> 00:15:37,210 augšējā kreisā uz apakšējo labo. 309 00:15:37,210 --> 00:15:39,730 Bet atkal tikai mākslinieka reprezentācija. 310 00:15:39,730 --> 00:15:41,650 Pirms dažām nedēļām es apgalvoju, ka katru no šiem baitiem, protams, 311 00:15:41,650 --> 00:15:43,570 var numurēt. 312 00:15:43,570 --> 00:15:46,665 Tāpat kā šis ir  baits 0 augšējā kreisajā stūrī, tad baits 1, tad 313 00:15:46,665 --> 00:15:49,760 baits 2, tad baits 2 miljardi, ja jums ir 2 gigabaiti atmiņas. 314 00:15:49,760 --> 00:15:52,260 Un tāpēc mēs varētu tos vienkārši numurēt šādi, no nulles līdz 15 uz 315 00:15:52,260 --> 00:15:54,760 augšu. 316 00:15:54,760 --> 00:15:56,480 16, 17, 18 un tā tālāk. 317 00:15:56,480 --> 00:15:59,996 Taču, ņemot vērā iepriekš minētos iemeslus, datorsistēmās un 318 00:15:59,996 --> 00:16:03,513 programmatūrā tikai biežāk tiek izmantota heksadecimālā sistēma, lai 319 00:16:03,513 --> 00:16:07,030 aprakstītu atmiņā esošo lietu atrašanās vietas, adreses. 320 00:16:07,030 --> 00:16:10,630 Tā vietā tipisks programmētājs vai datorzinātnieks šos pirmos 16 321 00:16:10,630 --> 00:16:14,230 baitus nosauktu par nulli līdz F, tā pat vien. 322 00:16:14,230 --> 00:16:17,000 Bet tas ir tāpēc, ka tas ir paredzams bitu skaits. 323 00:16:17,000 --> 00:16:21,506 Tātad, ja mēs turpināsim iet tālāk, jūs iegūtu nevis 10, nevis 11, 324 00:16:21,506 --> 00:16:26,013 nevis 12, bet heksadecimālos, viens, nulle, viens, viens, viens, divi 325 00:16:26,013 --> 00:16:30,520 un tā tālāk, ekrānā līdz vienam F. 326 00:16:25,900 --> 00:16:31,650 Un, ja es to samazinātu vai dabūtu lielāku monitoru, mēs beidzot 327 00:16:31,650 --> 00:16:37,400 redzētu 255 baitus, vēlāk arī no sākuma 255. 328 00:16:37,400 --> 00:16:39,120 Bet, izmantojot heksadecimālo sistēmu šādā veidā, pastāv potenciāla 329 00:16:39,120 --> 00:16:40,840 problēma. 330 00:16:40,840 --> 00:16:42,730 Ir neskaidrība. 331 00:16:42,730 --> 00:16:47,845 Vai kāds var iedomāties, kas var noiet greizi, ja mēs izmantojam hex, 332 00:16:47,845 --> 00:16:52,960 lai vienkārši aprakstītu šādas vietas atmiņā? 333 00:16:52,960 --> 00:16:53,650 Jā. 334 00:16:53,650 --> 00:16:55,285 Auditorija: Viena nulle var būt arī 10. 335 00:16:55,285 --> 00:16:56,160 DEIVIDS Dž. Meilāns: Jā. 336 00:16:56,160 --> 00:16:57,960 Viena nulle var būt arī 10. 337 00:16:57,960 --> 00:17:01,090 Un varbūt, ja jūs esat ļoti rūpīgi, labi, uzgaidiet minūti. 338 00:17:01,090 --> 00:17:02,950 Tas nevar būt 10, jo šeit ir F. 339 00:17:02,950 --> 00:17:04,200 Tātad tas acīmredzami nav decimāls. 340 00:17:04,200 --> 00:17:06,306 Bet kāpēc radīt potenciālu apjukumu, it īpaši, ja jūs sadarbojaties, 341 00:17:06,306 --> 00:17:08,412 kaut ko veidojat ar kādu? 342 00:17:08,412 --> 00:17:09,760 Mēs vēlamies izvairīties no šīs neskaidrības. 343 00:17:09,760 --> 00:17:13,436 Un tāpēc pirms gadiem pieņemtā vienošanās ir tāda, ka, ja vēlaties 344 00:17:13,436 --> 00:17:17,113 skaidri norādīt, ka skaitlis ir heksadecimāls pēc vienošanās, jūs 345 00:17:17,113 --> 00:17:20,790 visus ciparus prefiksējat ar 0x. 346 00:17:20,790 --> 00:17:22,950 X nav cita rakstzīme. 347 00:17:22,950 --> 00:17:24,720 Tā nav 17. rakstzīme. 348 00:17:24,720 --> 00:17:27,210 Tā ir tikai cilvēku pieņemta sistēma likt 0x, lai apzīmētu, šeit nāk 349 00:17:27,210 --> 00:17:29,700 heksadecimāls. 350 00:17:29,700 --> 00:17:31,020 Un tagad tas ir nepārprotami. 351 00:17:31,020 --> 00:17:33,390 Tātad tagad mēs redzam, ka 0x10 acīmredzami nav 10, kā mēs to zinām 352 00:17:33,390 --> 00:17:35,760 decimālā sistēmā. 353 00:17:35,760 --> 00:17:39,060 Bet drīzāk tas ir skaitlis, kas nāk aiz viena F. 354 00:17:39,060 --> 00:17:41,430 Tātad tas tiešām ir 16 decimālā. 355 00:17:41,430 --> 00:17:45,185 Tātad 0x, kad vien to redzat, tas ir tikai vizuāls signāls, ka tas, 356 00:17:45,185 --> 00:17:48,940 kas ir priekšā, patiesībā ir heksadecimālā sistēmā. 357 00:17:48,940 --> 00:17:52,480 Tāpēc tagad sāksim spēlēties ar šo informāciju. 358 00:17:52,480 --> 00:17:55,962 Tātad, šeit ir ļoti vienkārša koda rinda no pirmās nedēļas, kurā es 359 00:17:55,962 --> 00:17:59,445 tikai deklarēju mainīgo n un definēju to kā vērtību 50. 360 00:17:59,445 --> 00:18:00,570 Un tas ir ārpus konteksta. 361 00:18:00,570 --> 00:18:02,612 Mums, iespējams, ir vajadzīga galvenā funkcija un tas viss. 362 00:18:02,612 --> 00:18:05,571 Bet atcerēsimies pirmo nedēļu, kurā mēs redzējām šādu kodu, un 363 00:18:05,571 --> 00:18:08,530 darīsim kaut ko noderīgu ar šādu koda rindiņu. 364 00:18:08,530 --> 00:18:10,500 Tāpēc ļaujiet man pāriet uz VS Code. 365 00:18:10,500 --> 00:18:14,070 Un VS Code es izveidošu programmu ar nosaukumu… Kā būtu ar addresses? 366 00:18:14,070 --> 00:18:17,190 Tā kā šī mērķis ir-- mērķis ir vienkārši paspēlēties, galu galā ar 367 00:18:17,190 --> 00:18:20,310 tādu mainīgo kā n. 368 00:18:20,310 --> 00:18:21,750 Un ļaujiet man turpināt un darīt šādi. 369 00:18:21,750 --> 00:18:24,510 Es iekļaušu, kā būtu ar standarta I/O.h? 370 00:18:24,510 --> 00:18:25,770 Es ievadīšu int main void. 371 00:18:25,770 --> 00:18:28,260 Tāpēc pagaidām bez komandrindas argumentiem. 372 00:18:28,260 --> 00:18:30,090 Int n saņem 50. 373 00:18:30,090 --> 00:18:33,050 Un tagad, lai mēs varētu ar to izdarīt kaut ko nedaudz noderīgu, 374 00:18:33,050 --> 00:18:36,010 izmantosim printf un izdrukāsim ar %i un pēc tam jaunu rindiņu 375 00:18:36,010 --> 00:18:38,970 neatkarīgi no šīs n vērtības. 376 00:18:38,970 --> 00:18:41,020 Tāpēc tas pats par sevi nebūs interesanti. 377 00:18:41,020 --> 00:18:43,315 Mēs par to runājām pirmajā nedēļā, kurā es definēju mainīgo un 378 00:18:43,315 --> 00:18:45,610 izdrukāju to uz ekrāna. 379 00:18:45,610 --> 00:18:47,450 Tāpēc ļaujiet man doties uz savu termināļa logu un izpildītmake 380 00:18:47,450 --> 00:18:49,290 addresses. 381 00:18:49,290 --> 00:18:50,405 Nav kļūdu. 382 00:18:50,405 --> 00:18:51,030 Tātad tas ir labi. 383 00:18:51,030 --> 00:18:52,440 Es rakstīšu punkts, slīpsvītra, addresses. 384 00:18:52,440 --> 00:18:55,500 Un, protams, man šeit vajadzētu redzēt skaitli 50. 385 00:18:55,500 --> 00:18:57,360 Kas tagad notiek datorā? 386 00:18:57,360 --> 00:19:00,395 Tagad tulkosim kodu, lai patiesi saprastu, kas notiek zem datora 387 00:19:00,395 --> 00:19:03,430 pārsega. 388 00:19:03,430 --> 00:19:05,766 Tātad, ja tas ir mūsu atmiņas režģis, es ne vienmēr zinu kā 389 00:19:05,766 --> 00:19:08,103 programmētājs, un man kā programmētājam noteikti ir vienalga, kur 390 00:19:08,103 --> 00:19:10,440 tieši tas nonāk atmiņā. 391 00:19:10,440 --> 00:19:11,670 Tā ir visa koda izmantošanas jēga. 392 00:19:11,670 --> 00:19:13,140 Ļaujiet datoram to izskaitļot. 393 00:19:13,140 --> 00:19:17,195 Bet vismaz konceptuāli es zinu, ka šādi deklarējot koda rindiņu, 394 00:19:17,195 --> 00:19:21,250 skaitlis 50 nonāk kaut kur datora atmiņā. 395 00:19:21,250 --> 00:19:24,070 Un tam ir piešķirts nosaukums n, simbols n, ar kuru es, 396 00:19:24,070 --> 00:19:26,890 programmētājs, varu uz to atsaukties. 397 00:19:26,890 --> 00:19:30,350 Un kāda iemesla dēļ es ļoti apzināti izmantoju četrus no šiem 398 00:19:30,350 --> 00:19:33,810 kvadrātiem? 399 00:19:33,810 --> 00:19:37,260 Kāds varētu būt iemesls četru kvadrātu izmantošanai? 400 00:19:37,260 --> 00:19:38,100 Jā. 401 00:19:38,100 --> 00:19:39,660 Jā, tātad vesels skaitlis ir 4 baiti. 402 00:19:39,660 --> 00:19:41,265 Vismaz lielākajā daļā gadījumu, mūsdienu sistēmās vesels skaitlis ir 403 00:19:41,265 --> 00:19:42,870 4 baiti. 404 00:19:42,870 --> 00:19:44,760 Vecākā datorā tas varētu izmantot tikai vienu. 405 00:19:44,760 --> 00:19:46,890 Vai varbūt pat 2 baitus. 406 00:19:46,890 --> 00:19:49,710 Bet šeit tradicionāli mēs gandrīz vienmēr redzēsim 4 baitus. 407 00:19:49,710 --> 00:19:51,190 Es nezinu, vai tas nonāks šeit. 408 00:19:51,190 --> 00:19:52,330 Tas var nonākt šeit. 409 00:19:52,330 --> 00:19:53,550 Bet pagaidām, kam tas rūp? 410 00:19:53,550 --> 00:19:56,000 Es tikai zinu, ka dators var glabāt informāciju šādā veidā zem 411 00:19:56,000 --> 00:19:58,450 pārsega. 412 00:19:58,450 --> 00:20:01,846 Tātad, tagad ieviesīsim vēl vienu C funkciju, kuru mums vēl nav bijis 413 00:20:01,846 --> 00:20:05,243 kur izmantot, un kas ļaus mums sākt pabakstīt datora atmiņu, redzēsim 414 00:20:05,243 --> 00:20:08,640 kā būs. 415 00:20:08,640 --> 00:20:10,900 Un šī ir viena no situācijām, kad jūs gatavojaties mācīties, iegūt 416 00:20:10,900 --> 00:20:13,160 iemaņas, spēkus, kas faktiski var atgriezties, lai jums nāktu par 417 00:20:13,160 --> 00:20:15,420 skādi. 418 00:20:15,420 --> 00:20:17,735 Jo, tiklīdz jūs zināt, kā sākt bakstīt datora atmiņu, jūs varat 419 00:20:17,735 --> 00:20:20,050 paveikt ļoti jaudīgas lietas. 420 00:20:20,050 --> 00:20:22,726 Nākamnedēļ mēs redzēsim, ko varat iebūvēt datora atmiņā, taču jūs 421 00:20:22,726 --> 00:20:25,403 varat arī diezgan viegli sabojāt un izraisīt vairāk segmentācijas 422 00:20:25,403 --> 00:20:28,080 kļūmju, kuras daži no jums jau ir pieredzējuši. 423 00:20:28,080 --> 00:20:31,350 Tā sakot, pieņemsim tikai to, vai jūs zināt, ko? 424 00:20:31,350 --> 00:20:34,510 Man ir vienalga, kur atmiņā ir 50. 425 00:20:34,510 --> 00:20:37,230 Bet es zinu, ka tas pastāv kādā adresē atmiņā. 426 00:20:37,230 --> 00:20:42,060 Un, lai man būtu viegli izrunāt adresi, pieņemsim, ka tā ir 0x123. 427 00:20:42,060 --> 00:20:45,180 Tātad pēc vienošanās tā ir adrese atmiņā heksadecimālā veidā. 428 00:20:45,180 --> 00:20:48,730 Un tas vienkārši notiek, kad es rakstu šo koda rindiņu. 429 00:20:48,730 --> 00:20:52,770 Bet izrādās, C ir daži citi operatori, kurus mēs varam izmantot. 430 00:20:52,770 --> 00:20:54,679 Kad mēs iepriekš esam redzējuši zvaigznīti, zvaigzni, un mēs to 431 00:20:54,679 --> 00:20:56,588 izmantojām reizināšanai. 432 00:20:56,588 --> 00:20:59,130 Bet šodien mēs to izmantosim kaut kam jaudīgākam. 433 00:20:59,130 --> 00:21:02,970 Mēs arī ieviesīsim simbolu &, kas ļauj mums arī kaut ko darīt. 434 00:21:02,970 --> 00:21:08,050 Konjunkcijas operators ļaus mums iegūt datu daļas adresi atmiņā, 435 00:21:08,050 --> 00:21:13,130 piemēram, burtiski liekot & pirms mainīgā nosaukuma, C mums pateiks, 436 00:21:13,130 --> 00:21:18,210 pateiks, kādā adresē šis mainīgais dzīvo. 437 00:21:18,210 --> 00:21:20,730 Varbūt tas ir 0x123, varbūt tas ir 0x456. 438 00:21:20,730 --> 00:21:21,270 Kas zina? 439 00:21:21,270 --> 00:21:23,610 Bet tas jums sniegs atbildi. 440 00:21:23,610 --> 00:21:25,360 Zvaigznīte dara pretējo. 441 00:21:25,360 --> 00:21:26,710 Tā nozīmē - dodieties tur. 442 00:21:26,710 --> 00:21:29,855 Tātad, izmantojot zvaigznīti, ko citādi sauc par atsauces noņemšanas 443 00:21:29,855 --> 00:21:33,000 operatoru, es faktiski varu doties uz noteiktu adresi, ja vēlos. 444 00:21:33,000 --> 00:21:35,230 Un mēs redzēsim, ko tas nozīmē kodā. 445 00:21:35,230 --> 00:21:37,850 Tātad, kā es varu to izmantot kaut kādā viegli interesantā veidā, lai 446 00:21:37,850 --> 00:21:40,470 sāktu pabakstīties? 447 00:21:40,470 --> 00:21:42,560 Bet galu galā mēs izmantosim šo primitīvu, lai izveidotu 448 00:21:42,560 --> 00:21:44,650 interesantākas lietas. 449 00:21:44,650 --> 00:21:47,520 Ļaujiet man atgriezties un teikt, VS Code šeit. 450 00:21:47,520 --> 00:21:49,350 Un ļaujiet man turpināt un darīt šādi. 451 00:21:49,350 --> 00:21:51,210 Es notīrīšu savu termināli, lai sāktu no jauna. 452 00:21:51,210 --> 00:21:55,430 Un es ieviesīšu vēl vienu printf formāta kodu, %p. 453 00:21:55,430 --> 00:21:59,630 Un pagaidām vienkārši pieņemiet to ticībā, ka tas ir %p tāpēc, ka. 454 00:21:59,630 --> 00:22:03,890 Bet %p ļaus man izdrukāt mainīgā adresi, ja es papildus saku C, 455 00:22:03,890 --> 00:22:08,150 iegūstu n adresi. 456 00:22:08,150 --> 00:22:10,340 Tāpēc es mainu %i uz %p. 457 00:22:10,340 --> 00:22:13,700 Un tas ir tikai kaut kas, kas jums jādara, drukājot adreses. 458 00:22:13,700 --> 00:22:17,310 Bet man ir jāmaina mainīgā nosaukuma priekšā. 459 00:22:17,310 --> 00:22:19,220 Tāpēc es nedrukāju n, skaitli 50. 460 00:22:19,220 --> 00:22:21,178 Es izdrukāju kaut ko līdzīgu 0x123. 461 00:22:21,178 --> 00:22:22,970 Un tas nebūs tik vienkārši. 462 00:22:22,970 --> 00:22:25,030 Tomēr mēs uz ekrāna redzēsim, kur tas patiesībā nonāca manas code 463 00:22:25,030 --> 00:22:27,090 space vides atmiņā. 464 00:22:27,090 --> 00:22:28,490 Tā nu lūk. 465 00:22:28,490 --> 00:22:30,605 Punkts — uz leju manā terminālī, vēlreiz izveidojiet addresses, lai 466 00:22:30,605 --> 00:22:32,720 pārkompilētu. 467 00:22:32,720 --> 00:22:36,515 Un tagad punkts, slīpsvītra, addresses ir jāatklāj nevis 50, bet gan 468 00:22:36,515 --> 00:22:40,310 50 adrese. 469 00:22:40,310 --> 00:22:41,570 Un tur tā ir. 470 00:22:41,570 --> 00:22:42,890 Tā ir diezgan gara. 471 00:22:42,890 --> 00:22:45,230 Tā nav tik vienkārša un skaista kā 0x123. 472 00:22:45,230 --> 00:22:47,720 Bet tur ir 0x, kas nozīmē, ka šeit ir heksadecimālā adrese. 473 00:22:47,720 --> 00:22:52,070 Un tā ir 7ffcc784a04c. 474 00:22:52,070 --> 00:22:54,415 Pietiek pateikt, ka jūsu koda vietai un pat jūsu Mac un PC datoriem 475 00:22:54,415 --> 00:22:56,760 mūsdienās ir daudz atmiņas. 476 00:22:56,760 --> 00:23:02,040 Tāpēc daļēji šī adrese ir tik liela, nevis tik maza kā manā slaidā. 477 00:23:02,040 --> 00:23:05,840 Tāpēc šobrīd tā vēl nav tik noderīga. 478 00:23:05,840 --> 00:23:09,800 Bet tas mūs iepazīstina ar jēdzienu, ko mēs tagad sauksim par norādēm. 479 00:23:09,800 --> 00:23:14,420 Un norādes, protams, ir viens no grūtākajiem C aspektiem. 480 00:23:14,420 --> 00:23:17,100 Un, ja turpmākajā dzīvē jūs draugiem sakāt, ka es apmeklēju kursu, ko 481 00:23:17,100 --> 00:23:19,780 sauc par CS50, un mēs iemācījāmies C, jūs, iespējams, redzēsiet tādu 482 00:23:19,780 --> 00:23:22,460 skatienu no cilvēkiem, piemēram, kāpēc jūs mācījāties C? 483 00:23:22,460 --> 00:23:23,900 Vai, piemēram, ak, C bija grūti. 484 00:23:23,900 --> 00:23:27,356 Un tas lielā mērā ir šīs tēmas dēļ, kas nenozīmē, ka ir tik grūti 485 00:23:27,356 --> 00:23:30,812 izprast šo. 486 00:23:30,812 --> 00:23:32,270 Bet tas noteikti ir ļoti atšķirīgs. 487 00:23:32,270 --> 00:23:36,035 Un tā nav funkcija, ko varat izmantot augstāka līmeņa valodās, ko mēs 488 00:23:36,035 --> 00:23:39,800 redzēsim otrā nodarbībā, piemēram, Python, Java un tamlīdzīgi. 489 00:23:39,800 --> 00:23:42,575 C ir aptuveni tieši tik tuvu datora aparatūrai, tā teikt, pirms 490 00:23:42,575 --> 00:23:45,350 lietas kļūst patiešām biedējošas, tā sauktā asembleru valoda, ko mēs 491 00:23:45,350 --> 00:23:48,125 redzējām otrajā nedēļā, kad man bija saite, kompilēšana un salikšana, 492 00:23:48,125 --> 00:23:50,900 un viss tas. 493 00:23:50,900 --> 00:23:52,100 Tas nonāk ļoti zemā līmenī. 494 00:23:52,100 --> 00:23:54,220 Un jums patiešām ir jābūt datora CPU vai smadzeņu ekspertam, lai to 495 00:23:54,220 --> 00:23:56,340 saprastu. 496 00:23:56,340 --> 00:23:58,735 Bet, izmantojot C, jūs faktiski varat izmantot datora atmiņu un veikt 497 00:23:58,735 --> 00:24:01,130 jaudīgas darbības ar to. 498 00:24:01,130 --> 00:24:03,470 Bet atkal ar lielu varu nāk atbildība. 499 00:24:03,470 --> 00:24:06,053 Ir ļoti viegli izjaukt programmas, nepareizi izmantojot atmiņu vai 500 00:24:06,053 --> 00:24:08,636 vienkārši izveidojot kļūdu, kas skar atmiņu kaut kādā veidā, kādā jūs 501 00:24:08,636 --> 00:24:11,220 neplānojāt. 502 00:24:11,220 --> 00:24:16,370 Tātad norādes galu galā ir gandrīz tas, ko mēs tikko redzējām. 503 00:24:16,370 --> 00:24:22,910 Norāde patiesībā ir tikai mainīgais, kas satur kādas vērtības adresi. 504 00:24:22,910 --> 00:24:25,595 Norāde ir mainīgs lielums, kas satur kādas vērtības adresi vai, 505 00:24:25,595 --> 00:24:28,280 vienkāršāk sakot, to var uzskatīt par adresi. 506 00:24:28,280 --> 00:24:31,650 Norāde ir kāda datora atmiņā esošā adrese. 507 00:24:31,650 --> 00:24:35,880 Tagad, ko mēs varētu darīt, lai to īstenotu? 508 00:24:35,880 --> 00:24:37,440 Nu, lūk, divas koda rindiņas. 509 00:24:37,440 --> 00:24:40,216 Izrādās, šodien izmantojot mūsu divus jaunos operatorus, es varu 510 00:24:40,216 --> 00:24:42,993 deklarēt int, nosaukt to n un piešķirt tam vērtību, piemēram, 50, 511 00:24:42,993 --> 00:24:45,770 tāpat kā iepriekš. 512 00:24:45,770 --> 00:24:48,666 Ja es vēlos saglabāt n adresi mainīgajā, nevis vienkārši izdrukāt to 513 00:24:48,666 --> 00:24:51,562 uzreiz, izmantojot printf, es varu deklarēt mainīgo, piemēram, ar 514 00:24:51,562 --> 00:24:54,458 nosaukumu p. 515 00:24:54,458 --> 00:24:56,750 Bet es to varētu saukt par jebko, ko vēlos, tāpat kā jebkuru mainīgo. 516 00:24:56,750 --> 00:24:59,960 Bet tā kā tā ir adrese, tā nav int p. 517 00:24:59,960 --> 00:25:03,410 Tā teikt, tai ir jābūt int, zvaigznīte, p. 518 00:25:03,410 --> 00:25:07,100 Un zvaigznīte šeit, vienādības zīmes kreisajā pusē, ir tikai 519 00:25:07,100 --> 00:25:10,790 indikators, kas nozīmē, ka p būs norāde. 520 00:25:10,790 --> 00:25:13,520 Tas ir, p būs kāda adrese? 521 00:25:13,520 --> 00:25:15,450 Vesela skaitļa adrese. 522 00:25:15,450 --> 00:25:18,340 Tātad tehniski tas joprojām ir vesels skaitlis, jo adrese ir tikai 523 00:25:18,340 --> 00:25:21,230 skaitlis neatkarīgi no tā, vai tas ir 1, 2, 3 vai 0x123. 524 00:25:21,230 --> 00:25:23,310 Tātad šī patiešām ir tikai semantiska atšķirība. 525 00:25:23,310 --> 00:25:25,945 Tātad int, zvaigznīte, p nozīmē tikai to, ka šis mainīgais nesatur 526 00:25:25,945 --> 00:25:28,580 nevienu vecu skaitli, piemēram, 50. 527 00:25:28,580 --> 00:25:33,570 Tas konkrēti satur skaitli, kas ir kāda cita adrese. 528 00:25:33,570 --> 00:25:35,670 Tātad, kā es tagad varu to izmantot? 529 00:25:35,670 --> 00:25:37,400 Nu, ļaujiet man atgriezties pie VS Code. 530 00:25:37,400 --> 00:25:41,670 Un ļaujiet man ierosināt pievienot šādu koda rindiņu. 531 00:25:41,670 --> 00:25:46,266 Tā vietā, lai tieši izdrukātu šo vērtību, turpināsim un definēsim 532 00:25:46,266 --> 00:25:50,863 otru mainīgo p, kura tips ir int, zvaigznīte, p, iestatiet to vienādu 533 00:25:50,863 --> 00:25:55,460 ar & n un tad šoreiz neizdrukāsim tikai & n. 534 00:25:55,460 --> 00:25:57,530 Faktiski izdrukāsim p vērtību. 535 00:25:57,530 --> 00:26:00,845 Tātad vienīgās divas jaunās lietas, ja es pietuvinu, es esmu 536 00:26:00,845 --> 00:26:04,160 izmantojis ne tikai labajā pusē esošo &, lai iegūtu n adresi. 537 00:26:04,160 --> 00:26:07,175 Es tagad izmantoju zvaigznīti kreisajā pusē, lai pateiktu C, ka p 538 00:26:07,175 --> 00:26:10,190 joprojām ir mainīgais, kā vienmēr. 539 00:26:10,190 --> 00:26:11,450 Bet tā ir norāde. 540 00:26:11,450 --> 00:26:14,897 Tā ir kādas citas vērtības adrese, piemēram, šī. 541 00:26:14,897 --> 00:26:17,480 Un es joprojām grasos to izdrukāt ar tādu paša formāta kodu, %p. 542 00:26:17,480 --> 00:26:18,660 Tātad tas nemainās. 543 00:26:18,660 --> 00:26:24,680 Tāpēc ļaujiet man attālināt un ievadīt make addresses un ./addresses. 544 00:26:24,680 --> 00:26:27,620 Un šeit tas ir, tieši tas pats. 545 00:26:27,620 --> 00:26:30,500 Pats par sevi tas vēl nav tik noderīgs. 546 00:26:30,500 --> 00:26:34,230 Taču fakts, ka tagad varat piekļūt atmiņā saglabātajām lietu adresēm, 547 00:26:34,230 --> 00:26:37,960 nozīmē, ka mēs varēsim būvēt lietas, konstruēt lietas un saistīt 548 00:26:37,960 --> 00:26:41,690 lietas kopā, zinot, kur tās dzīvo, tā sakot. 549 00:26:41,690 --> 00:26:44,570 Tātad, vai ir kādi jautājumi par šo tehniku līdz šim? 550 00:26:44,570 --> 00:26:45,511 Jā. 551 00:26:45,511 --> 00:26:48,767 apmulsis par [nesaklausāms].. 552 00:26:48,767 --> 00:26:50,100 DEIVIDS Dž. Meilans: Labs jautājums. 553 00:26:50,100 --> 00:26:52,320 Vai sestajā rindā ir jābūt zvaigznītei, p un &? 554 00:26:52,320 --> 00:26:54,210 Un šajā gadījumā, jā. 555 00:26:54,210 --> 00:26:55,290 Jo ko es daru? 556 00:26:55,290 --> 00:26:58,430 Kreisajā pusē, un es pagaidām atbrīvošos no vienādības zīmes, tas man 557 00:26:58,430 --> 00:27:01,570 dotu mainīgo ar nosaukumu p, kas pats par sevi nav vesels skaitlis, 558 00:27:01,570 --> 00:27:04,710 bet tā ir vesela skaitļa adrese. 559 00:27:04,710 --> 00:27:08,110 Bet bez vienādības zīmes es neko nesaglabāju šajā mainīgajā. 560 00:27:08,110 --> 00:27:13,176 Tātad, pievienojot vienādības zīmi un pēc tam & n, es precīzi 561 00:27:13,176 --> 00:27:18,243 noskaidroju, kāda ir n adrese, kas jau pastāv katrā piektajā rindā, 562 00:27:18,243 --> 00:27:23,310 un ievietoju to šajā jaunajā mainīgajā, ko sauc par p. 563 00:27:23,310 --> 00:27:24,100 Citi jautājumi? 564 00:27:24,100 --> 00:27:24,600 Jā. 565 00:27:24,600 --> 00:27:26,570 Auditorija: [NESAKLAUSĀMS] 566 00:27:26,570 --> 00:27:27,820 DEIVIDS Dž. Meilans: Labs jautājums. 567 00:27:27,820 --> 00:27:30,695 Katru reizi, kad es palaižu programmu, tā izmanto citu atmiņas daļu? 568 00:27:30,695 --> 00:27:31,770 Īsā atbilde, jā. 569 00:27:31,770 --> 00:27:33,470 Tomēr, īsi sakot, datoriem ir arī kaut kas, ko sauc par virtuālo 570 00:27:33,470 --> 00:27:35,170 atmiņu. 571 00:27:35,170 --> 00:27:37,880 Tātad, ja to palaižat atkal un atkal, iespējams, redzēsit vienas un 572 00:27:37,880 --> 00:27:40,590 tās pašas adreses tajā pašā Mac datorā, datorā vai mākoņa serverī. 573 00:27:40,590 --> 00:27:44,580 Bet pēc brīža redzēsim, kur tas ir augstā līmenī. 574 00:27:44,580 --> 00:27:47,447 Bet tas vienmēr pastāvēs kādā adresē. 575 00:27:47,447 --> 00:27:48,030 Labs jautājums. 576 00:27:48,030 --> 00:27:48,530 Jā. 577 00:27:48,530 --> 00:27:50,120 Auditorija: [NESAKLAUSĀMS] 578 00:27:50,120 --> 00:27:51,120 DEIVIDS Dž. Meilans: Pareizi. 579 00:27:51,120 --> 00:27:52,980 Ampersands n ir n adrese. 580 00:27:52,980 --> 00:27:57,660 Un int, zvaigznīte, p ir norāde, ko sauc par p. 581 00:27:57,660 --> 00:28:01,180 Un godīgi sakot, ideālā pasaulē, ja C būtu izveidots šodien, nevis 582 00:28:01,180 --> 00:28:04,700 pirms gadu desmitiem, kad cilvēki pirmo reizi radīja valodas, ideālā 583 00:28:04,700 --> 00:28:08,220 gadījumā mums būtu tikai datu tips, ko sauc par norādi. 584 00:28:08,220 --> 00:28:10,350 Un tad tas būtu nedaudz mazāk sarežģīti, jo tas burtiski būtu tas, 585 00:28:10,350 --> 00:28:12,480 kas tajā teikts. 586 00:28:12,480 --> 00:28:14,290 Cilvēki, kuri izgudroja C, to neizdarīja. 587 00:28:14,290 --> 00:28:15,580 Bet šī ir ideja. 588 00:28:15,580 --> 00:28:18,060 Tātad pointer kodā nav derīgs vārds. 589 00:28:18,060 --> 00:28:20,070 Tas ir R termins angļu valodā. 590 00:28:20,070 --> 00:28:21,780 Bet patiesībā šī ir tikai ideja. 591 00:28:21,780 --> 00:28:25,655 Bet veids, kā jūs apzīmējat norādi kā datu tipu, ir nedaudz 592 00:28:25,655 --> 00:28:29,530 noslēpumaināks parint, zvaigznīte, p, šeit. 593 00:28:29,530 --> 00:28:32,086 Bet ievērojiet septītajā rindā, kad izdrukāju p, es neizmantoju 594 00:28:32,086 --> 00:28:34,643 zvaigznīti. 595 00:28:34,643 --> 00:28:35,685 Es nelietoju ampersandu. 596 00:28:35,685 --> 00:28:36,090 Kāpēc? 597 00:28:36,090 --> 00:28:38,040 Es burtiski tikai vēlos izdrukāt p vērtību. 598 00:28:38,040 --> 00:28:39,748 Un mēs to darām kopš pirmās nedēļas. 599 00:28:39,748 --> 00:28:41,339 Ja vēlaties izdrukāt mainīgo, vienkārši aprakstiet mainīgo pēc tā 600 00:28:41,339 --> 00:28:42,930 nosaukuma. 601 00:28:42,930 --> 00:28:44,400 Nav īpašas sintakses. 602 00:28:44,400 --> 00:28:46,690 Vai ir kādi citi jautājumi par šo līdz šim? 603 00:28:46,690 --> 00:28:48,148 Auditorija: [NESAKLAUSĀMS] 604 00:28:48,148 --> 00:28:50,440 DEIVIDS Dž. Meilans: Kādas ir norāžu izmantošanas priekšrocības? 605 00:28:50,440 --> 00:28:53,967 Izmantojot norādes, mēs šodien redzēsim dažus to lietojumus, un ideja 606 00:28:53,967 --> 00:28:57,494 tiks īstenota nākamnedēļ, kad mēs izveidosim tā sauktās datu 607 00:28:57,494 --> 00:29:01,021 struktūras atmiņā, kur mēs varam izveidot ne tikai, piemēram, vienas 608 00:29:01,021 --> 00:29:04,548 dimensijas datu struktūras kā masīvu. 609 00:29:04,548 --> 00:29:07,316 Nākamnedēļ mēs redzēsim, ka mēs faktiski varēsim izveidot 610 00:29:07,316 --> 00:29:10,084 līdzvērtīgas divdimensiju datu struktūras vai pat trīsdimensiju datu 611 00:29:10,084 --> 00:29:12,852 struktūras, izmantojot šīs adreses un kaut kā sasaistot lietas. 612 00:29:12,852 --> 00:29:14,810 Un mēs redzēsim to sākumu šonedēļ. 613 00:29:14,810 --> 00:29:17,647 Bet pagaidām koncentrējieties vismaz uz sintaksi un to, ko šie 614 00:29:17,647 --> 00:29:20,485 elementi var darīt mūsu labā. 615 00:29:20,485 --> 00:29:22,960 Auditorija: Vai rādītājam p ir jābūt veselam skaitlim? 616 00:29:22,960 --> 00:29:25,441 DEIVIDS Dž. Meilans: Vai p veselam skaitlim — vai p norādei ir 617 00:29:25,441 --> 00:29:27,922 jābūt — jānorāda uz veselu skaitli? 618 00:29:27,922 --> 00:29:28,630 Īsā atbilde, nē. 619 00:29:28,630 --> 00:29:29,500 Un mēs atgriezīsimies pie šī. 620 00:29:29,500 --> 00:29:31,480 Pagaidām diskusijas labad mēs runājam tikai par veseliem skaitļiem, 621 00:29:31,480 --> 00:29:33,460 piemēram, skaitli 50. 622 00:29:33,460 --> 00:29:35,410 Jūs minējāt virknes vai rakstzīmes. 623 00:29:35,410 --> 00:29:36,010 Pilnīgi noteikti. 624 00:29:36,010 --> 00:29:38,060 Mēs drīz dosimies pie tiem. 625 00:29:38,060 --> 00:29:41,510 Tātad datora atmiņā varat izmantot visu, ko vēlaties. 626 00:29:41,510 --> 00:29:45,255 Tāpēc tagad pārtulkosim to uz to pašu attēlu, lai palīdzētu jums 627 00:29:45,255 --> 00:29:49,000 saprast, ko šīs divas koda rindiņas patiesībā dara. 628 00:29:49,000 --> 00:29:52,500 Tātad, ja es šeit atgriezīšos pie sava atmiņas režģa, iemetīsim 629 00:29:52,500 --> 00:29:56,000 skaitli 50 mainīgajā n apakšējā labajā stūrī, kā tas bija iepriekš. 630 00:29:56,000 --> 00:29:58,040 Tātad šī ir pirmā koda rinda tāpat kā iepriekš. 631 00:29:58,040 --> 00:30:03,080 Bet ar jauno otro koda rindiņu, tiklīdz es izveidoju p, ko man darīt? 632 00:30:03,080 --> 00:30:07,177 Pirmkārt, atcerieties, ka n atrodas kaut kur datora atmiņā. 633 00:30:07,177 --> 00:30:09,010 Parasti man ir vienalga, kur tas ir. 634 00:30:09,010 --> 00:30:11,745 Bet diskusijas labad pieņemsim, ka tas ir 0x123, ko ir vieglāk 635 00:30:11,745 --> 00:30:14,480 pateikt, nekā to, kur tas faktiski nonāca. 636 00:30:14,480 --> 00:30:15,820 Un kas tagad ir p? 637 00:30:15,820 --> 00:30:17,630 Nu, p ir tikai vēl viens mainīgais. 638 00:30:17,630 --> 00:30:19,280 Un arī mainīgie dzīvo atmiņā. 639 00:30:19,280 --> 00:30:22,550 Tāpēc ļaujiet man izvirzīt hipotēzi, ka p dzīvo šeit. 640 00:30:22,550 --> 00:30:28,216 Un izrādās, ka p, kad to piešķirat, ampersand n vērtība nozīmē, ka C 641 00:30:28,216 --> 00:30:33,883 apskatīs mainīgo n un sapratīs, ak, tas dzīvo pie 0x123, un tas, kas 642 00:30:33,883 --> 00:30:39,550 ir p vērtībā, burtiski ir 0x123. 643 00:30:39,550 --> 00:30:42,440 Tātad atkal tas joprojām ir vesels skaitlis, kas ir mulsinoši. 644 00:30:42,440 --> 00:30:45,520 Bet tehniski tas ir vesels skaitlis, kas tiek izmantots kā adrese. 645 00:30:45,520 --> 00:30:47,740 Un tagad tikai uzvedne šeit: ievērojiet, ka šī norāde ir diezgan 646 00:30:47,740 --> 00:30:49,960 liela. 647 00:30:49,960 --> 00:30:51,940 Tā ir astoņus kvadrātus liela. 648 00:30:51,940 --> 00:30:53,350 Kādas no tā sekas? 649 00:30:53,350 --> 00:30:55,000 Jo es to darīju apzināti. 650 00:30:55,000 --> 00:30:57,102 Kā jūs teiktu, cik lielai norādei acīmredzot jābūt lielākajā daļā 651 00:30:57,102 --> 00:30:59,205 mūsdienu sistēmu? 652 00:30:59,205 --> 00:31:00,080 Auditorija: [NESAKLAUSĀMS] 653 00:31:00,080 --> 00:31:00,490 DEIVIDS Dž. Meilans: Labi, labi. 654 00:31:00,490 --> 00:31:01,480 Mūsdienās datori ir ļoti lieli. 655 00:31:01,480 --> 00:31:03,310 Jūsu datorā ir gigabaitiem RAM. 656 00:31:03,310 --> 00:31:05,475 Tāpēc jums ir nepieciešamas lielas norādes, lai varētu norādīt, un 657 00:31:05,475 --> 00:31:07,640 atmiņa, kas konceptuāli ir diezgan tālu. 658 00:31:07,640 --> 00:31:10,840 Tātad, lai būtu skaidrs, cik baitus šķietami aizņem norāde? 659 00:31:10,840 --> 00:31:12,820 Nu, šķiet, ka kopā aizņem 8. 660 00:31:12,820 --> 00:31:15,280 Veselie skaitļi mūsdienās parasti ap 4. 661 00:31:15,280 --> 00:31:18,393 Tomēr mūsdienās šajā gadījumā norādes parasti ir 8. 662 00:31:18,393 --> 00:31:21,491 Tāpēc es to zīmēju tādā veidā, kas atbilst realitātei, lai gan galu 663 00:31:21,491 --> 00:31:24,590 galā nav īsti interesanti, kādas vērtības šeit ir. 664 00:31:24,590 --> 00:31:27,012 Patiesībā izkļūsim no šīm nezālēm. 665 00:31:27,012 --> 00:31:30,731 Man ir vienalga, kas vēl šobrīd notiek mana datora atmiņā, jo man ir 666 00:31:30,731 --> 00:31:34,450 tikai šīs divas sulīgās koda rindas, kas nosaka n un definē p. 667 00:31:34,450 --> 00:31:36,370 Tātad paslēpsim visus pārējos kvadrātus. 668 00:31:36,370 --> 00:31:39,947 Un, godīgi sakot, es to domāju, sakot, ka programmētājiem ir jāzina, 669 00:31:39,947 --> 00:31:43,525 ka kaut kur atmiņā pastāv mainīgais, un viņiem ir jāspēj iegūt šī 670 00:31:43,525 --> 00:31:47,102 adrese, izmantojot &, bet jūs nekad neizdrukāsit tā, kā es to darīju, 671 00:31:47,102 --> 00:31:50,680 faktisko adresi. 672 00:31:50,680 --> 00:31:53,680 Tas parasti nav interesanti, ja vien jūs neatkļūdojat savu kodu. 673 00:31:53,680 --> 00:31:56,025 Bet jūs nesāksit savā kodā rakstīt trakus 0x skaitļus, lai pārvietotu 674 00:31:56,025 --> 00:31:58,370 lietas. 675 00:31:58,370 --> 00:32:01,720 Jums tikai jāzina, ka dators var saprast, kur lietas atrodas. 676 00:32:01,720 --> 00:32:05,800 Atklāti sakot, pēc šīs loģikas, kuru interesē, ka tas ir 0x123? 677 00:32:05,800 --> 00:32:08,510 Rīt tas varētu būt 0x456 vai kaut kas cits. 678 00:32:08,510 --> 00:32:12,200 Tātad viens no veidiem, kā domāt par norādi, ir burtiski kā 679 00:32:12,200 --> 00:32:15,890 mainīgais, kas norāda uz kaut ko citu. 680 00:32:15,890 --> 00:32:19,750 Un tiešām, šajā gadījumā p, jā, tehniski tam ir adrese. 681 00:32:19,750 --> 00:32:22,030 Un jā, tehniski šajā stāstā tas ir 0x123. 682 00:32:22,030 --> 00:32:23,140 Bet, godīgi sakot, kuru tas interesē? 683 00:32:23,140 --> 00:32:28,900 Man tikai jāzina, ka, izmantojot p, es varu iegūt vērtību n. 684 00:32:28,900 --> 00:32:30,370 Un kas tad ir šīs adreses? 685 00:32:30,370 --> 00:32:32,425 Un patiesībā, ja Kārters neiebilstu man uz mirkli pievienoties, kādas 686 00:32:32,425 --> 00:32:34,480 ir šīs adreses? 687 00:32:34,480 --> 00:32:37,340 Nu, tāpat kā mūsu cilvēku pasaulē, mums ir pastkastītes, lai gan 688 00:32:37,340 --> 00:32:40,200 mūsdienās tās nepārbaudāt pārāk bieži, taču, lai saņemtu fizisko 689 00:32:40,200 --> 00:32:43,060 pastu, katrai mājai, katram uzņēmumam ir unikāla adrese. 690 00:32:43,060 --> 00:32:46,495 Zinātnes un inženierzinātņu komplekss atrodas 150 Western Avenue 691 00:32:46,495 --> 00:32:49,930 Allston, Masačūsetsā, 02134 ASV. 692 00:32:49,930 --> 00:32:53,830 Un teorētiski tas unikāli identificē šo ēku pasaulē. 693 00:32:53,830 --> 00:32:56,170 Nu, lūk, mums ir divas pastkastītes. 694 00:32:56,170 --> 00:33:01,960 Šeit mums ir vērtība n, kas dzīvo, es apgalvošu, adresē 0x123. 695 00:33:01,960 --> 00:33:07,092 Un tad šeit es apgalvoju, ka ir vēl viena adrese, ko sauc par p. 696 00:33:07,092 --> 00:33:09,316 Man ir vienalga, kur tā atrodas, lai gan tas noteikti pastāv kaut kur 697 00:33:09,316 --> 00:33:11,540 datora atmiņā. 698 00:33:11,540 --> 00:33:14,266 Bet, ja tas ir p, kas ir mainīgais, un tas ir n, vēl viens mainīgais, 699 00:33:14,266 --> 00:33:16,993 ideālā gadījumā šī pastkaste būtu divreiz lielāka izmantoto baitu 700 00:33:16,993 --> 00:33:19,720 skaita dēļ. 701 00:33:19,720 --> 00:33:22,060 Bet Home Depot bija tikai identiska izmēra pastkastes. 702 00:33:22,060 --> 00:33:23,830 Bet šeit ir p, viens mainīgais. 703 00:33:23,830 --> 00:33:25,690 Ir n, vēl viens mainīgais. 704 00:33:25,690 --> 00:33:29,470 Ja es atveru šo pastkasti, kas man tajā jāatrod, pamatojoties uz mūsu 705 00:33:29,470 --> 00:33:33,250 līdzšinējo stāstu? 706 00:33:33,250 --> 00:33:36,970 Kādu vērtību es dramatiski izvilkšu pēc mirkļa? 707 00:33:36,970 --> 00:33:37,810 Jā, es domāju. 708 00:33:37,810 --> 00:33:41,980 Tagad, izmantojot šo, jūs varat domāt par to, ka X apzīmē vietu, kur 709 00:33:41,980 --> 00:33:46,150 es tagad varu staigāt pa datora atmiņu un atrast ceļu uz šo vietu, 710 00:33:46,150 --> 00:33:50,320 sekojot dārgumu kartei. 711 00:33:50,320 --> 00:33:53,008 Vai arī, ja es to vēlos dramatiskāk, pateicoties mūsu mazajam Jēlas 712 00:33:53,008 --> 00:33:55,696 putu pirkstiņam, jūs varat domāt par to abstraktāk, jo p tikai norāda 713 00:33:55,696 --> 00:33:58,385 uz n. 714 00:33:58,385 --> 00:33:59,510 Tas neiet labi. 715 00:33:59,510 --> 00:34:01,177 Tātad, pāriesim pie Hārvardas. 716 00:34:01,177 --> 00:34:03,400 Tātad p norāda — AUDITORIJA: Oho. 717 00:34:06,100 --> 00:34:07,740 DEIVIDS Dž. Meilans: Tātad p norāda uz n. 718 00:34:07,740 --> 00:34:10,496 Un tā izrādās, ka mēs tagad varēsim uzrakstīt kodu, kas būs 719 00:34:10,496 --> 00:34:13,252 līdzvērtīgs tam, ka es eju uz n. 720 00:34:13,252 --> 00:34:16,211 Bet pagaidām, Kārter, ja vēlaties atklāt pastkastītes saturu, mums 721 00:34:16,211 --> 00:34:19,170 patiešām vajadzētu redzēt skaitli 50. 722 00:34:19,170 --> 00:34:22,170 Tas tiešām arī viss... Kārters gaida aplausus. 723 00:34:22,170 --> 00:34:24,300 Tik tiešām, labi izdarīts. 724 00:34:28,270 --> 00:34:28,929 Paldies. 725 00:34:28,929 --> 00:34:31,900 Tātad tā ir tikai fiziska metafora tam, kas šeit notiek. 726 00:34:31,900 --> 00:34:33,760 Vienā mainīgajā mums ir adrese. 727 00:34:33,760 --> 00:34:36,070 Un šo mainīgo tradicionāli sauc par norādi. 728 00:34:36,070 --> 00:34:39,550 Otrajā pirmās nedēļas mainīgajā mums ir tāda vērtība kā n. 729 00:34:39,550 --> 00:34:44,230 Un jūs varat, jā, sekot kartei un doties uz konkrēto adresi. 730 00:34:44,230 --> 00:34:45,772 Un mēs redzēsim, kā to izdarīt kodā. 731 00:34:45,772 --> 00:34:50,041 Bet patiesi interesanta ir šī abstrakcija, kas burtiski norāda vai, 732 00:34:50,041 --> 00:34:54,310 manuprāt, pārnestā nozīmē norāda uz kādu citu vērtību atmiņā. 733 00:34:54,310 --> 00:34:56,658 Labi, jautājumi par norādēm šajā formā. 734 00:34:56,658 --> 00:34:58,450 Auditorija: Vai norādes var norādīt viena uz otru? 735 00:34:58,450 --> 00:34:59,990 DEIVIDS Dž. Meilans: Vai norādes var norādīt viena uz otru? 736 00:34:59,990 --> 00:35:00,790 Tātad jā. 737 00:35:00,790 --> 00:35:02,590 Ir lietas, ko sauc par dubultajām norādēm. 738 00:35:02,590 --> 00:35:04,298 Mēs tās drīzumā neredzēsim. 739 00:35:04,298 --> 00:35:08,380 Bet, izmantojot zvaigznīti, zvaigznīti, varat izteikt adreses adresi. 740 00:35:08,380 --> 00:35:10,370 Bet mēs to vēl neredzēsim. 741 00:35:10,370 --> 00:35:13,920 Citi jautājumi par norādēm? 742 00:35:13,920 --> 00:35:15,401 Jā, priekšā. 743 00:35:15,401 --> 00:35:18,630 Auditorija: [NESAKLAUSĀMS] 744 00:35:18,630 --> 00:35:20,265 DEIVIDS Dž. Meilans: Vai masīvs — tātad rezumējot, vai masīvi ir 745 00:35:20,265 --> 00:35:21,900 norādes? 746 00:35:21,900 --> 00:35:23,767 Tātadīsā atbilde, tie ir saistīti. 747 00:35:23,767 --> 00:35:25,600 Un mēs pie tā atgriezīsimies pēc brīža. 748 00:35:25,600 --> 00:35:28,020 Bet masīvi tehniski atšķiras no norādēm. 749 00:35:28,020 --> 00:35:29,805 Taču mēs, tā teikt, nedaudz izpludināt līnijas, izmantojot vienu kā 750 00:35:29,805 --> 00:35:31,590 otru. 751 00:35:31,590 --> 00:35:34,090 Bet ļaujiet man atgriezties pie tā pēc neilga laika. 752 00:35:34,090 --> 00:35:34,590 Labi. 753 00:35:34,590 --> 00:35:38,960 Tātad, ja mums ir šis priekšstats, tā teikt, par to, kas norāde ir 754 00:35:38,960 --> 00:35:43,330 atmiņā, es domāju, ka mēs varam sākt noņemt vienkāršošanas slāni, ko 755 00:35:43,330 --> 00:35:47,700 mēs esam pieņēmuši pēdējo nedēļu laikā kopš pirmās nedēļas. 756 00:35:47,700 --> 00:35:50,380 Tātad virkne, atcerieties, ir rakstzīmju secība. 757 00:35:50,380 --> 00:35:52,746 Un tāpēc, ja vēlaties izveidot virkni, kas saka: HI, ar lielajiem 758 00:35:52,746 --> 00:35:55,113 burtiem un izsaukuma zīmi, mēs rakstām virkne s vienāds ar 759 00:35:55,113 --> 00:35:57,480 atvērējpēdiņas un aizvērējpēdiņas “HI!”. 760 00:35:57,480 --> 00:36:00,070 Un mēs varam to iekodēt šādi, vai arī mēs varam izmantot get string. 761 00:36:00,070 --> 00:36:03,083 Bet pagaidām pieņemsim, ka es to iekodēju savā kodā, lai vienmēr 762 00:36:03,083 --> 00:36:06,097 teiktu: “Sveiki!”, ar lielajiem burtiem un izsaukuma zīmi. 763 00:36:06,097 --> 00:36:08,430 Nu, kā tas izskatās datora atmiņā? 764 00:36:08,430 --> 00:36:10,530 Nu, pārtrauksim skatīties uz visu atmiņu un koncentrēsimies tikai uz 765 00:36:10,530 --> 00:36:12,630 notiekošo. 766 00:36:12,630 --> 00:36:16,185 Kad esat izveidojis virkni ar nosaukumu S un saglabājis tajā “HI!”, 767 00:36:16,185 --> 00:36:19,740 jūs zināt, ka notiek dažas lietas. 768 00:36:19,740 --> 00:36:24,030 H un I, un izsaukuma zīme nonāk datora atmiņā. 769 00:36:24,030 --> 00:36:28,331 Jau no otrās nedēļas mēs zinām, ka šī lieta, tā sauktā NUL rakstzīme, 770 00:36:28,331 --> 00:36:32,632 NUL, AKA reversā slīpsvītra, nulle, tiek arī pievienota. 771 00:36:32,632 --> 00:36:33,840 Un tā ir kaut kur atmiņā. 772 00:36:33,840 --> 00:36:36,360 Šobrīd man ir vienalga, kur es to uzzīmēju apakšējā labajā stūrī. 773 00:36:36,360 --> 00:36:37,435 Jā, tai ir adrese. 774 00:36:37,435 --> 00:36:39,060 Bet pagaidām tā tikai kaut kur nonāk. 775 00:36:39,060 --> 00:36:43,470 Un patiesībā šeit ir neliela vizuāla norāde par to, kā tas notiek. 776 00:36:43,470 --> 00:36:46,532 C versijā ikreiz, kad izmantojat dubultpēdiņas, lai pievienotu 777 00:36:46,532 --> 00:36:49,595 virkni, varat iedomāties, ka dubultpēdiņas ir kā pavediens, lai ne 778 00:36:49,595 --> 00:36:52,657 tikai saglabātu - HI, izsaukuma zīme, bet arī ievietotu rakstzīmi 779 00:36:52,657 --> 00:36:55,720 NUL. 780 00:36:55,720 --> 00:36:58,632 Un tas ir pretstatā kādām rakstzīmēm, ja vēlaties atsevišķas 781 00:36:58,632 --> 00:37:01,545 rakstzīmes, kādu sintaksi mēs izmantojām tā vietā? 782 00:37:01,545 --> 00:37:02,420 Auditorija: [NESAKLAUSĀMS] 783 00:37:02,420 --> 00:37:03,795 DEIVIDS Dž. Meilans: Tātad pēdiņas. 784 00:37:03,795 --> 00:37:06,190 Pēdiņas maģiski nepievieno reverso slīpsvītru, nulli. 785 00:37:06,190 --> 00:37:08,000 Tie burtiski tikai glabā vienu rakstzīmi. 786 00:37:08,000 --> 00:37:10,167 Tātad atkal virknes vienmēr ir bijušas nedaudz īpašas. 787 00:37:10,167 --> 00:37:12,534 Jūs saņemat papildus — papildu baitu bez maksas, lai jūs zinātu, kur 788 00:37:12,534 --> 00:37:14,902 virkne beidzas, un tādas funkcijas kā STR salīdzināšana var atrasties 789 00:37:14,902 --> 00:37:17,270 tur. 790 00:37:17,270 --> 00:37:20,630 Tāpēc atmiņā tas patiešām varētu izskatīties nedaudz šādi. 791 00:37:20,630 --> 00:37:23,510 Un, ja mēs pieņemam, ka kaut kur būs atmiņā, šīs lietas būs kaut kur 792 00:37:23,510 --> 00:37:26,390 atmiņā, mēs varam tās risināt kā otrajā nedēļā, izmantojot mainīgā 793 00:37:26,390 --> 00:37:29,270 nosaukumu. 794 00:37:29,270 --> 00:37:31,320 Tātad, ja S ir mainīgā nosaukums, S, kvadrātiekava, 0 ir tas, kā jūs 795 00:37:31,320 --> 00:37:33,370 varētu atsaukties uz pirmo burtu. 796 00:37:33,370 --> 00:37:34,630 S, kvadrātiekava, 1; S, kvadrātiekava, 2. 797 00:37:34,630 --> 00:37:37,500 Un, ja jūs patiešām vēlaties, S, kvadrātiekava, 3 aizvedīs jūs uz 798 00:37:37,500 --> 00:37:40,370 rakstzīmes NUL pašām beigām. 799 00:37:40,370 --> 00:37:41,830 Bet kas ir S? 800 00:37:41,830 --> 00:37:46,410 Tātad tehniski šajā koda rindā dators ne tikai piešķir atmiņu HI, 801 00:37:46,410 --> 00:37:50,990 izsaukuma zīme, kas ir reversā slīpsvītra, nulle, mums — izrādās, ka 802 00:37:50,990 --> 00:37:55,570 pašam S ir jāaizņem zināms daudzums vietas, jo S ir mainīgais. 803 00:37:55,570 --> 00:37:58,275 Un katru reizi, kad mēs līdz šim esam runājuši par mainīgajiem, es 804 00:37:58,275 --> 00:38:00,980 ekrānā esmu parādījis taisnstūri, kurā saglabāt tā vērtību. 805 00:38:00,980 --> 00:38:06,360 Tātad diskusijas labad pieņemsim, ka H ir 0x123 un I ir 0x124, 806 00:38:06,360 --> 00:38:11,740 izsaukuma zīme ir 0x125, un NUL rakstzīme ir 0x126. 807 00:38:11,740 --> 00:38:13,390 Nu, kas tad ir S? 808 00:38:13,390 --> 00:38:16,107 Nu, s vienkārši būs kāds cits mainīgais. 809 00:38:16,107 --> 00:38:17,868 Un es to uzzīmēšu nedaudz abstrakti bez visām pārējām kastēm, šeit 810 00:38:17,868 --> 00:38:19,630 augšā. 811 00:38:19,630 --> 00:38:22,270 Un es apgalvošu, ka šī mainīgā nosaukums ir s. 812 00:38:22,270 --> 00:38:25,000 Bet izrādās, kas tad īsti ir s? 813 00:38:25,000 --> 00:38:27,130 Kā īsti darbojas virknes? 814 00:38:27,130 --> 00:38:30,640 Nu, s ir mainīgs lielums, un tas ir bijis kopš pirmās nedēļas. 815 00:38:30,640 --> 00:38:33,240 Bet, kad jūs to definējat, tas, ko dators jūsu vietā dara 816 00:38:33,240 --> 00:38:35,840 automātiski, ir tad, kad tas zina, ka vēlaties saglabāt HI, izsaukuma 817 00:38:35,840 --> 00:38:38,440 zīme, tas ievieto to kaut kur atmiņā. 818 00:38:38,440 --> 00:38:42,880 Pēc tam dators izdomās, kāda ir pašas pirmās rakstzīmes adrese? 819 00:38:42,880 --> 00:38:46,480 Un tas saglabā šo adresi un tikai šo adresi mainīgajā, kuru 820 00:38:46,480 --> 00:38:50,080 izveidojāt vienādības zīmes kreisajā pusē. 821 00:38:50,080 --> 00:38:51,370 Un ar to pietiek. 822 00:38:51,370 --> 00:38:54,480 Lai attēlotu virkni ar trim alfabēta burtiem vai pieturzīmēm, nav 823 00:38:54,480 --> 00:38:57,590 nepieciešami trīs mainīgie. 824 00:38:57,590 --> 00:38:58,450 Tev vajag tikai vienu. 825 00:38:58,450 --> 00:39:02,050 Jums vienkārši jāzina virknes sākums. 826 00:39:02,050 --> 00:39:02,810 Kāpēc? 827 00:39:02,810 --> 00:39:06,133 Kāpēc pietiek ar to, ka mainīgais saglabā tikai pirmā baita adresi, 828 00:39:06,133 --> 00:39:09,456 nevis visas baitu adreses? 829 00:39:09,456 --> 00:39:11,380 Auditorija: [NESAKLAUSĀMS] 830 00:39:11,380 --> 00:39:12,380 DEIVIDS Dž. Meilans: Tieši tā. 831 00:39:12,380 --> 00:39:14,870 Sakarā ar to, ka virknes tiek veidotas tā kā otrajā nedēļā, mēs tās 832 00:39:14,870 --> 00:39:17,360 vienmēr beidzamam ar NUL. 833 00:39:17,360 --> 00:39:20,013 Tāpēc pietiek atcerēties tikai pirmā baita adresi. 834 00:39:20,013 --> 00:39:21,851 Tā kā no turienes jūs varat sekot maizes drupaču baitam, nākamajam 835 00:39:21,851 --> 00:39:23,690 baitam, nākamajam baitam. 836 00:39:23,690 --> 00:39:27,460 Un, kamēr neredzat jauno rindiņu, atvainojiet, rakstzīmi NUL, jūs 837 00:39:27,460 --> 00:39:31,230 zināt, ka visas šīs rakstzīmes acīmredzot ir daļa no vienas virknes. 838 00:39:31,230 --> 00:39:35,600 Tātad tas ir tas, kas notiek datora atmiņā kopš pirmās nedēļas. 839 00:39:35,600 --> 00:39:40,000 Un patiesībā, ja mēs to abstrahējam, jūs patiešām varat uzskatīt, ka 840 00:39:40,000 --> 00:39:44,400 S ir tikai šis, patiesi norāde uz šo atmiņas gabalu. 841 00:39:44,400 --> 00:39:46,920 Tātad patiesībā, kas mums šeit ir? 842 00:39:46,920 --> 00:39:49,906 Kreisajā pusē, lai atkārtotu kodu šeit, kreisās puses virknē, tas 843 00:39:49,906 --> 00:39:52,893 nodrošina, ka mēs faktiski varēsim saglabāt virkni mainīgajā ar 844 00:39:52,893 --> 00:39:55,880 nosaukumu s. 845 00:39:55,880 --> 00:39:59,760 Tomēr mums būs labajā pusē faktiskā vērtība. 846 00:39:59,760 --> 00:40:01,460 Tāpēc ļaujiet man pārslēgties atpakaļ uz VS Code šeit. 847 00:40:01,460 --> 00:40:02,975 Un ļaujiet man mainīt savu kodu, lai vairs nebūtu iesaistīti tikai 848 00:40:02,975 --> 00:40:04,490 veseli skaitļi. 849 00:40:04,490 --> 00:40:07,745 Tāpēc es pievienošu CS50 bibliotēku, lai tajā varētu izmantot dažas 850 00:40:07,745 --> 00:40:11,000 saīsnes. 851 00:40:11,000 --> 00:40:11,783 CS50.h. 852 00:40:11,783 --> 00:40:14,450 Un tad, pildot savu galveno funkciju, es turpināšu un darīšu šādi. 853 00:40:14,450 --> 00:40:16,360 Virkne s ir vienāda ar atvērējpēdiņas, aizvērējpēdiņas, “HI” ar 854 00:40:16,360 --> 00:40:18,270 visiem lielajiem burtiem, izsaukuma zīme. 855 00:40:18,270 --> 00:40:20,770 Un tad es turpināšu un izdrukāšu, izmantojot %S kā vienmēr - reversā 856 00:40:20,770 --> 00:40:23,270 slīpsvītra n - s vērtību. 857 00:40:23,270 --> 00:40:25,530 Tātad šī programma šobrīd nemaz nav interesanta. 858 00:40:25,530 --> 00:40:29,690 Atkal ir tikai pirmās nedēļas lietas. 859 00:40:25,530 --> 00:40:29,690 ./addresses patiešām izdrukā hi. 860 00:40:29,690 --> 00:40:33,110 Bet izrādās, ka tagad, kad es to zinu, kas īsti visu šo laiku ir 861 00:40:33,110 --> 00:40:36,530 noticis zem pārsega? 862 00:40:36,530 --> 00:40:40,640 Nu, šeit ir tā pati koda rinda, kas definē mainīgo, ko sauc par S. 863 00:40:40,640 --> 00:40:46,880 Un izrādās, ka visi vēlas uzminēt, kam virkne patiesībā ir sinonīms? 864 00:40:46,880 --> 00:40:48,710 Virkne, izrādās, ir baltie meli, ko esam stāstījuši kopš pirmās 865 00:40:48,710 --> 00:40:50,540 nedēļas. 866 00:40:50,540 --> 00:40:55,190 C valodā nav tādas lietas kā virkne kā atslēgvārds. 867 00:40:55,190 --> 00:40:57,110 Tehniski tā ir CS50 lieta. 868 00:40:57,110 --> 00:40:57,650 Jā. 869 00:40:57,650 --> 00:40:58,733 Auditorija: [NESAKLAUSĀMS] 870 00:40:58,733 --> 00:41:00,650 DEIVIDS Dž. Meilans: Tā ir norāde uz rakstzīmi. 871 00:41:00,650 --> 00:41:03,410 Tātad patiešām visu šo laiku mēs jums esam melojuši. 872 00:41:03,410 --> 00:41:05,510 Nav tādas virknes, aizvērējpēdiņas, atvērējpēdiņas. 873 00:41:05,510 --> 00:41:07,430 Patiesībā tā ir rakstzīme zvaigznīte. 874 00:41:07,430 --> 00:41:12,890 Un, ja es drīkstu dramatiski šeit nomest palīgritenīšus. 875 00:41:12,890 --> 00:41:14,310 Tas nebija īpaši labi. 876 00:41:14,310 --> 00:41:16,490 Tātad, ko mēs esam darījuši? 877 00:41:16,490 --> 00:41:18,858 Nu, izrādās, ka virkne ir daudz vienkāršāks veids, kā konceptuāli 878 00:41:18,858 --> 00:41:21,227 domāt par to, kas ir rakstzīmju virkne. 879 00:41:21,227 --> 00:41:23,223 Dievs, ja mēs sāktu pirmo nedēļu, liekot jums ierakstīt rakstzīmi 880 00:41:23,223 --> 00:41:25,220 zvaignzīti, jā, jūs varētu tam tikt pāri. 881 00:41:25,220 --> 00:41:28,800 Bet šī ir pārāk neglīta sintakse, intelektuāli neinteresanti. 882 00:41:28,800 --> 00:41:30,020 Tāpēc mēs to abstrahējam. 883 00:41:30,020 --> 00:41:32,615 Kas rakstzīme zvaigznīte bija C pirmajā nedēļā, sakot, ka to 884 00:41:32,615 --> 00:41:35,210 patiesībā sauc par virkni. 885 00:41:35,210 --> 00:41:37,400 Tagad virkne ir R termins. 886 00:41:35,210 --> 00:41:38,320 C programmētāji, programmētāji jebkurā valodā izmantos vārdu virkni, 887 00:41:38,320 --> 00:41:41,430 lai apzīmētu rakstzīmju secību. 888 00:41:41,430 --> 00:41:45,510 Bet C valodā tas tehniski nav vārds pats par sevi. 889 00:41:45,510 --> 00:41:49,080 Tas drīzāk ir sinonīms, ko mēs paši kaut kādā veidā radījām. 890 00:41:49,080 --> 00:41:50,960 Tātad patiesībā, kā mēs to izdarījām? 891 00:41:50,960 --> 00:41:52,550 Nu, atcerieties pagājušo nedēļu. 892 00:41:52,550 --> 00:41:54,905 Pagājušajā nedēļā es ierosināju, ka būtu patiešām jauki, ja mums būtu 893 00:41:54,905 --> 00:41:57,261 personas datu tips, par kuru C veidotāji pirms gadu desmitiem 894 00:41:57,261 --> 00:41:59,617 neiedomājās. 895 00:41:59,617 --> 00:42:00,200 Bet viss ir kārtībā. 896 00:42:00,200 --> 00:42:01,520 Mēs paši to varam definēt. 897 00:42:01,520 --> 00:42:02,940 Ko mēs šeit darījām? 898 00:42:02,940 --> 00:42:05,400 Nu, mēs izmantojam šādu sintaksi. 899 00:42:05,400 --> 00:42:08,210 Atcerieties, ka mēs definējām cilvēku kā ko? 900 00:42:08,210 --> 00:42:09,800 Lai būtu šī struktūra. 901 00:42:09,800 --> 00:42:12,200 Šī struktūra, izmantojot jauno atslēgvārdu pagājušajā nedēļā, struct, 902 00:42:12,200 --> 00:42:14,600 nozīmē, ka persona ir tikai vārds un skaitlis. 903 00:42:14,600 --> 00:42:16,100 Un tas varēja būt arī citas lietas. 904 00:42:16,100 --> 00:42:17,180 Mēs vienkārši saglabājām to vienkāršu. 905 00:42:17,180 --> 00:42:22,640 Bet kā es cilvēku saistīju ar šo struktūru? 906 00:42:22,640 --> 00:42:25,705 Mēs apgalvojām, ka tā ir šī vērtība typedef, kas, kā jūs varētu 907 00:42:25,705 --> 00:42:28,770 gaidīt, nosaka datu tipu. 908 00:42:28,770 --> 00:42:33,020 Tātad, ko mēs kā CS50 darījām pirmajā nedēļā, jums neko nesakot? 909 00:42:33,020 --> 00:42:36,950 Nu, mēs būtu varējuši darīt ko līdzīgu. 910 00:42:36,950 --> 00:42:38,318 Int pats par sevi ir nedaudz noslēpumains. 911 00:42:38,318 --> 00:42:39,839 Un varbūt mums vajadzētu padarīt lietas vēl vienkāršākas, sakot: Hei, 912 00:42:39,839 --> 00:42:41,360 visi. 913 00:42:41,360 --> 00:42:44,990 Izrādās, ka jūs varat definēt veselus skaitļus valodā C. 914 00:42:41,360 --> 00:42:45,560 Un, ja vēlaties to izdarīt, ja vēlaties izveidot atslēgvārdu - vesels 915 00:42:45,560 --> 00:42:49,760 skaitlis kā datu tipu, varat to vienkārši ierakstīt kā int. 916 00:42:49,760 --> 00:42:53,540 Tātad typedef izveido vārdu tālajā labajā pusē, veselu skaitli, un 917 00:42:53,540 --> 00:42:57,320 izveido tam sinonīmu šajā gadījumā, ko sauc par int. 918 00:42:57,320 --> 00:43:00,590 Tātad, ko mēs darījām pirmajā nedēļā, jums neko nesakot? 919 00:43:00,590 --> 00:43:05,540 Mums ir šāda koda rinda CS50 bibliotēkā, kas saista atvērējpēdiņas, 920 00:43:05,540 --> 00:43:10,490 aizvērējpēdiņas,virkne; šifrētāk kā rakstzīmi zvaigznīti. 921 00:43:10,490 --> 00:43:13,092 Un tāpēc pirmajā nedēļā jebkurā laikā, kad izmantojat CS50 922 00:43:13,092 --> 00:43:15,694 bibliotēku, varat rakstīt vārdu virkni tā, it kā tas būtu īsts C datu 923 00:43:15,694 --> 00:43:18,297 tips. 924 00:43:18,297 --> 00:43:20,662 Un tas ir tikai tāpēc, ka mēs vēlējāmies, lai pirmajās nedēļās būtu 925 00:43:20,662 --> 00:43:23,027 šī abstrakcija, šie palīgritenīši, lai mums nebūtu jāpinās visu šo 926 00:43:23,027 --> 00:43:25,393 trako atmiņu jautājumu nezālēs. 927 00:43:25,393 --> 00:43:27,740 Mēs varam runāt par virknēm augstākā līmenī. 928 00:43:27,740 --> 00:43:29,120 Bet tas ir viss, kas tās ir. 929 00:43:29,120 --> 00:43:34,760 Virknes ir pirmās rakstzīmes adrese šajā rakstzīmju secībā. 930 00:43:34,760 --> 00:43:38,220 Vai jums ir jautājumi par kādu no šīm detaļām? 931 00:43:38,220 --> 00:43:38,720 Jā. 932 00:43:38,720 --> 00:43:41,460 bibliotēkas, kas [NESAKLAUSĀMS]? 933 00:43:41,460 --> 00:43:42,710 DEIVIDS Dž. Meilans: Labs jautājums. 934 00:43:42,710 --> 00:43:45,910 Kā ir ar virkņu bibliotēku, ko esam izmantojuši? 935 00:43:45,910 --> 00:43:46,600 Nesaistīti. 936 00:43:46,600 --> 00:43:48,520 Tātad tas nedefinē vārdu virkni. 937 00:43:48,520 --> 00:43:51,430 Viss tur patiesībā ir saistīts ar zvaigznītēm. 938 00:43:51,430 --> 00:43:54,960 Un tāpēc patiesībā, ja esat izmantojis CS50 rokasgrāmatu, kas ir 939 00:43:54,960 --> 00:43:58,490 tikai mūsu lietotājam draudzīgā versija faktiskajām rokasgrāmatas 940 00:43:58,490 --> 00:44:02,020 lapām oficiālajai valodai C, jūs tajā redzēsit tagad, ja sāksit 941 00:44:02,020 --> 00:44:05,550 pabakstīties vai izslēgt mazāk ērto režīmu, jūs redzēsiet, ka mēs 942 00:44:05,550 --> 00:44:09,080 esam mainījuši visas atzīmes par zvaigznīti oficiālajā dokumentācijā 943 00:44:09,080 --> 00:44:12,610 šajās pirmajās nedēļās, lai to vienkāršotu. 944 00:44:12,610 --> 00:44:17,350 Bet zem pārsega, C nezina vārdu virkni kā atslēgvārdu. 945 00:44:17,350 --> 00:44:21,320 Bet tas absolūti ir jēdziens, par kuru zina katra pasaules programma. 946 00:44:21,320 --> 00:44:24,315 Un patiesībā citās valodās, piemēram, Python, patiešām būs īsta 947 00:44:24,315 --> 00:44:27,310 virkne, lai gan to nesauks par virkni. 948 00:44:27,310 --> 00:44:30,340 To sauks STR, saīsināti STR. 949 00:44:30,340 --> 00:44:33,470 Jautājumi par šīm virknēm šeit. 950 00:44:33,470 --> 00:44:36,215 Ļaujiet man ierosināt, ka šai sintaksei ir vēl viena iezīme, ko mēs 951 00:44:36,215 --> 00:44:38,960 tagad varam izmantot šādi. 952 00:44:38,960 --> 00:44:42,170 Ļaujiet man ierosināt, ka, ja mēs šeit atgriezīsimies pie 953 00:44:42,170 --> 00:44:45,380 iepriekšējās mana koda versijas, kurā, ļaujiet man pēc brīža 954 00:44:45,380 --> 00:44:48,590 pārslēgties atpakaļ uz VS code, es aiztīšu VS code uz iepriekšējā 955 00:44:48,590 --> 00:44:51,800 koda veselo skaitļu versiju. 956 00:44:51,800 --> 00:44:55,185 Un pavisam nesen tas izskatījās šādi, kad mēs izmantojām tikai 957 00:44:55,185 --> 00:44:58,570 veselus skaitļus, nevis virknes. 958 00:44:58,570 --> 00:45:01,465 Ļaujiet man ierosināt, ka mēs varam izmantot citu C līdzekli, kas 959 00:45:01,465 --> 00:45:04,360 faktiski ļauj mums doties uz adresi. 960 00:45:04,360 --> 00:45:06,460 Tāpēc šobrīd ļaujiet man vienkārši attīt un izpildītt, make 961 00:45:06,460 --> 00:45:08,560 addresses, lai atgādinātu, ko šī programma darīja, kad tā izmantoja 962 00:45:08,560 --> 00:45:10,660 tikai veselus skaitļus. 963 00:45:10,660 --> 00:45:12,010 Un tur ir tā adrese. 964 00:45:12,010 --> 00:45:12,670 Kāpēc? 965 00:45:12,670 --> 00:45:15,190 Tā kā septītajā rindā, ievērojiet, es izdrukāju p vērtību, kas ir 966 00:45:15,190 --> 00:45:17,710 norāde. 967 00:45:17,710 --> 00:45:20,060 Tātad, protams, tā izskatīsies pēc adreses. 968 00:45:20,060 --> 00:45:22,660 Bet ļaujiet man tagad attālināt un veikt vienu izmaiņu. 969 00:45:22,660 --> 00:45:27,340 Tā vietā, lai izdrukātu p, kā es varu izmantot šodienas otro jauno 970 00:45:27,340 --> 00:45:32,020 operatoru, nevis simbolu &, bet zvaigznīti, lai pārietu uz šo adresi? 971 00:45:32,020 --> 00:45:35,170 Tas, ko es faktiski varu darīt šajā koda rindā, ir šis. 972 00:45:35,170 --> 00:45:38,830 Ja es vēlos izdrukāt faktisko veselo skaitli 50, kas atrodas šajā 973 00:45:38,830 --> 00:45:42,490 mainīgajā vai līdzvērtīgi šajā adresē, es varu šeit pāriet uz p un 974 00:45:42,490 --> 00:45:46,150 nedrukāt p burtiski, jo tā ir tikai adrese. 975 00:45:46,150 --> 00:45:48,910 Tagad varu teikt, zvaigznīte, p. 976 00:45:48,910 --> 00:45:51,310 Un zvaigznīte, p nozīmē doties tur. 977 00:45:51,310 --> 00:45:53,200 Tehniskāk, noņemiet atsauci uz p. 978 00:45:53,200 --> 00:45:54,880 Tas ir, sekojiet dārgumu kartei uz faktisko adresi un dariet to, ko 979 00:45:54,880 --> 00:45:56,560 darīja Kārters. 980 00:45:56,560 --> 00:45:59,470 Atveriet pastkastīti un izdrukājiet visu, kas atrodas pastkastē, un 981 00:45:59,470 --> 00:46:02,380 atcerieties, ka faktiskais skaitlis bija 50. 982 00:46:02,380 --> 00:46:03,680 Tāpēc ļaujiet man izmēģināt šo. 983 00:46:03,680 --> 00:46:05,270 Ļaujiet man pārkompilēt kodu. 984 00:46:05,270 --> 00:46:08,020 Tāpēc make addresses. 985 00:46:08,020 --> 00:46:09,520 Labi, ļaujiet man notīrīt termināļa logu. 986 00:46:09,520 --> 00:46:10,510 Punkts, slīpsvītra, addresses. 987 00:46:10,510 --> 00:46:12,640 Šoreiz man nevajadzētu redzēt 0x. 988 00:46:12,640 --> 00:46:16,550 Šajā gadījumā man vajadzētu redzēt tikai skaitli 50. 989 00:46:16,550 --> 00:46:19,920 Un arī šeit ir sava veida neveiksmīgs dizaina lēmums, protams, 990 00:46:19,920 --> 00:46:23,290 pedagoģiski es teiktu C. 991 00:46:19,990 --> 00:46:23,162 Ja es tuvinu šo kodu, zvaigznīte diemžēl tiek izmantota divos dažādos 992 00:46:23,162 --> 00:46:26,335 veidos. 993 00:46:26,335 --> 00:46:28,442 Ideālā pasaulē viņi būtu izmantojuši trīs dažādus simbolus, lai 994 00:46:28,442 --> 00:46:30,550 padarītu to semantiski skaidrāku. 995 00:46:30,550 --> 00:46:32,030 Bet tas ir tas, ar ko mēs esam iestrēguši. 996 00:46:32,030 --> 00:46:34,738 Tātad sestajā rindā, kad deklarējat rādītāju, kas ir mainīgais, kas 997 00:46:34,738 --> 00:46:37,447 saglabā adresi, jūs ievietojat mainīgā veidu, uz kuru vēlaties 998 00:46:37,447 --> 00:46:40,156 norādīt, pēc tam zvaigznīti, tā pat vien, un pēc tam mainīgā 999 00:46:40,156 --> 00:46:42,865 nosaukumu. 1000 00:46:42,865 --> 00:46:45,227 Un tad labajā pusē jūs faktiski saņemat adresi neatkarīgi no tā, kas 1001 00:46:45,227 --> 00:46:47,590 izmantoto &. 1002 00:46:47,590 --> 00:46:50,485 Bet, ja vēlaties doties uz adresi, vēlaties noņemt norādes atsauci, 1003 00:46:50,485 --> 00:46:53,380 jūs vairs neizmantojat int. 1004 00:46:53,380 --> 00:46:54,640 Un mēs nekad to neesam darījuši. 1005 00:46:54,640 --> 00:46:57,100 Kad esat deklarējis mainīgo, jūs vairs nekad neminat datu tipu. 1006 00:46:57,100 --> 00:47:01,140 Bet tagad norāžu pasaulē, ja nevēlaties izdrukāt p, bet doties uz 1007 00:47:01,140 --> 00:47:05,180 jebkuru adresi, ko glabā p, šeit izmantojiet zvaigznīti, p. 1008 00:47:05,180 --> 00:47:08,086 Tātad labs vizuālais indikators būtu, kad jūs deklarējat norādi, tas 1009 00:47:08,086 --> 00:47:10,993 ir, ieviesiet to savā programmā, datu tips ir jādeklarē ar 1010 00:47:10,993 --> 00:47:13,900 zvaigznīti. 1011 00:47:13,900 --> 00:47:16,405 Bet, kad izmantojat norādi, jūs izmantojat tikai zvaigznīti. 1012 00:47:16,405 --> 00:47:19,030 Ideālā pasaulē tas būtu pavisam cits simbols. 1013 00:47:19,030 --> 00:47:21,310 Bet atkal tas ir tas, kas mums ir. 1014 00:47:21,310 --> 00:47:23,920 Jautājumi tagad par šo sintaksi. 1015 00:47:23,920 --> 00:47:25,077 Jā. 1016 00:47:25,077 --> 00:47:27,850 Auditorija: [NESAKLAUSĀMS] 1017 00:47:27,850 --> 00:47:29,350 DEIVIDS Dž. Meilans: Kāpēc mēs nevaram šeit vienkārši ievadīt &, vai 1018 00:47:29,350 --> 00:47:30,850 to jūs sakāt? 1019 00:47:30,850 --> 00:47:32,260 Vēl bija mazliet klusi. 1020 00:47:32,260 --> 00:47:34,600 Tātad, konkrēti runājot, mums nav vajadzīga sestā rinda. 1021 00:47:34,600 --> 00:47:37,960 Tātad tas tiešām ir pedagoģiskos nolūkos, ka es definēju atsevišķu 1022 00:47:37,960 --> 00:47:41,320 mainīgo p un pēc tam izdrukāju. 1023 00:47:41,320 --> 00:47:44,500 Tomēr šobrīd es vienkārši eju pa apli, tā teikt. 1024 00:47:44,500 --> 00:47:47,220 Jo vienkāršāk būtu bijis tas, ko es būtu darījis pirmajā nedēļā, 1025 00:47:47,220 --> 00:47:49,940 proti, atbrīvotos no p pavisam, atbrīvotos no p šeit un vienkārši 1026 00:47:49,940 --> 00:47:52,660 izdrukātu n. 1027 00:47:52,660 --> 00:47:56,590 Bet šodien mēs jums tikai piešķiram šo jauno veidošanas bloku, šo 1028 00:47:56,590 --> 00:48:00,520 jauno sintaksi, ar kuras palīdzību jūs varat izdomāt kāda objekta 1029 00:48:00,520 --> 00:48:04,450 adresi un pēc tam apgriezt procesu vēlāk un faktiski iet uz to. 1030 00:48:04,450 --> 00:48:08,200 Citi jautājumi par to, ko mēs šeit esam izdarījuši ar šīm norādēm. 1031 00:48:08,200 --> 00:48:08,700 Labi. 1032 00:48:08,700 --> 00:48:12,750 Tagad atgriezīsimies kontekstā pie virknes un paskatīsimies, ko vēl 1033 00:48:12,750 --> 00:48:16,800 varam darīt ar šo šeit esošo virkņu gadījumā. 1034 00:48:16,800 --> 00:48:19,900 Ļaujiet man to precizēt, lai atālinātu, ļaujiet man izdzēst ar 1035 00:48:19,900 --> 00:48:23,000 veseliem skaitļiem saistīto kodu, ļaujiet man ievadīt virkni s ir 1036 00:48:23,000 --> 00:48:26,100 vienāds ar atvērējpēdiņas, aizvērējpēdiņas, HI; ar visiem lielajiem 1037 00:48:26,100 --> 00:48:29,200 burtiem, ļaujiet man turpināt un pagaidām iekļaut CS50.h augšpusē, 1038 00:48:29,200 --> 00:48:32,300 lai tiešām es varu izmantot atslēgas vārdu s, drīzāk virkni, un 1039 00:48:32,300 --> 00:48:35,400 ļaujiet man tagad turpinātun darīt kaut ko vairāk, nekā darīju 1040 00:48:35,400 --> 00:48:38,500 pagājušajā reizē. 1041 00:48:38,500 --> 00:48:40,760 Iepriekšējā reizē es izdrukāju %s, reversā slīpsvītra, n un tad 1042 00:48:40,760 --> 00:48:43,020 izdrukāju s. 1043 00:48:43,020 --> 00:48:44,970 Un atkal skaidrības labad es to pārkompilēšu, izveidošu adreses, dot 1044 00:48:44,970 --> 00:48:46,920 slash addresses. 1045 00:48:46,920 --> 00:48:47,920 Tas vienkārši izdrukā hi. 1046 00:48:47,920 --> 00:48:49,450 Tātad tās atkal ir pirmās nedēļas lietas. 1047 00:48:49,450 --> 00:48:52,040 Bet tagad, kad mums ir šī cita sintakse, mēs varam darīt arī dažas 1048 00:48:52,040 --> 00:48:54,630 interesantas lietas. 1049 00:48:54,630 --> 00:48:57,750 Piemēram, pieņemsim, ka es vēlos izdrukāt nevis pašu s, bet ja es 1050 00:48:57,750 --> 00:49:00,870 vēlos izdrukāt s adresi? 1051 00:49:00,870 --> 00:49:03,210 Kurā atmiņas vietā atrodas s? 1052 00:49:03,210 --> 00:49:07,350 Nu, es varu mainīt savu %s uz %p, kas tagad ir zināms, ka p ir norāde. 1053 00:49:07,350 --> 00:49:10,200 Tātad %p nozīmē izdrukāt norādes vērtību. 1054 00:49:10,200 --> 00:49:11,280 Tā ir adrese. 1055 00:49:11,280 --> 00:49:15,150 Un šeit es faktiski varu izdrukāt to pašu. 1056 00:49:15,150 --> 00:49:17,200 Bet kāpēc tas tā ir, mēs redzēsim pēc brīža. 1057 00:49:17,200 --> 00:49:19,200 Ļaujiet man to izdarīt. 1058 00:49:19,200 --> 00:49:20,850 Šeit iet palīgritenīši. 1059 00:49:20,850 --> 00:49:25,350 Virkne tehniski nepastāv, bet tā pastāv, ja izmantoju CS50 bibliotēku. 1060 00:49:25,350 --> 00:49:28,520 Bet, ja es atbrīvojos no CS50 bibliotēkas, kā to metaforiski daru, 1061 00:49:28,520 --> 00:49:31,690 noņemot palīgritenīšus, es vairs nevaru lietot vārdu virkne. 1062 00:49:31,690 --> 00:49:33,785 Un patiesībā ļaujiet man pieļaut šo kļūdu apzināti, kā jūs, 1063 00:49:33,785 --> 00:49:35,880 iespējams, nejauši izdarījāt pēdējo nedēļu laikā. 1064 00:49:35,880 --> 00:49:39,150 Šis ir kļūdas ziņojums, ko saņemu, ja aizmirstu CS50 bibliotēku, 1065 00:49:39,150 --> 00:49:42,420 izmantojot nedeklarētu identifikatora virkni. 1066 00:49:42,420 --> 00:49:43,830 Vai jūs domājāt standarta? 1067 00:49:43,830 --> 00:49:45,351 Tas mēģina būt noderīgs, bet tas nav tāpēc, ka es nedomāju standarta 1068 00:49:45,351 --> 00:49:46,872 n. 1069 00:49:46,872 --> 00:49:49,326 Patiešām, tas ir apstiprinājums, ka C nezina, ka vārds virkne pastāv, 1070 00:49:49,326 --> 00:49:51,780 vismaz kā atslēgvārds. 1071 00:49:51,780 --> 00:49:54,130 Pastāv kā jēdziens, bet ne atslēgvārds. 1072 00:49:54,130 --> 00:49:57,515 Tāpēc es varētu to novērst, pievienojot atpakaļ CS50 bibliotēku. 1073 00:49:57,515 --> 00:49:59,222 Bet tas ir sava veida solis atpakaļ, izglītības ziņā, nevis solis uz 1074 00:49:59,222 --> 00:50:00,930 priekšu. 1075 00:50:00,930 --> 00:50:03,267 Ko es varētu darīt, lai to tagad labotu, ja palīgritenīši tagad ir 1076 00:50:03,267 --> 00:50:05,605 noņemti? 1077 00:50:05,605 --> 00:50:06,105 Jā. 1078 00:50:06,105 --> 00:50:09,210 Auditorija: [NESAKLAUSĀMS] 1079 00:50:09,210 --> 00:50:10,210 DEIVIDS Dž. Meilans: Tieši tā. 1080 00:50:10,210 --> 00:50:12,009 Aizstājiet "string"t, atvērējpēdiņas, aizvērējpēdiņas ar rakstzīmi 1081 00:50:12,009 --> 00:50:13,808 zvaigznīti. 1082 00:50:13,808 --> 00:50:15,850 Tāpēc es mainīšu šo uz rakstzīmi. 1083 00:50:15,850 --> 00:50:18,580 Tehniski jūs varat ievietot burtisko zvaigzni šeit, zvaigznīti vai 1084 00:50:18,580 --> 00:50:21,310 ievietot to tur, vai arī šeit. 1085 00:50:21,310 --> 00:50:24,745 Tradicionāli ir jādara tas, ko esmu darījis no sākuma, novietojiet 1086 00:50:24,745 --> 00:50:28,180 zvaigznīti blakus mainīgā nosaukumam, nevis jebkur citur. 1087 00:50:28,180 --> 00:50:30,447 Ļaujiet man turpinātu tagad un... vai atvainojiet. 1088 00:50:30,447 --> 00:50:31,780 Es gribēju pievienot atstarpes. 1089 00:50:31,780 --> 00:50:32,560 Jūs varētu arī to izdarīt. 1090 00:50:32,560 --> 00:50:34,480 Bet tā būtu visnormālākā konvencija. 1091 00:50:34,480 --> 00:50:35,590 Tātad tagad darīsim šādi. 1092 00:50:35,590 --> 00:50:39,850 Izveidojiet adreses, apkopojiet OK tūlīt, ar dot slash addresses. 1093 00:50:39,850 --> 00:50:40,990 Kas man jāredz? 1094 00:50:40,990 --> 00:50:44,660 Hi vai kas cits? 1095 00:50:44,660 --> 00:50:45,970 Jūtieties brīvi, vienkārši izsauciet to. 1096 00:50:45,970 --> 00:50:46,918 Auditorija: [NESAKLAUSĀMS] 1097 00:50:46,918 --> 00:50:48,460 DEIVIDS Dž. Meilans: Tātad joprojām hi, jūs sakāt? 1098 00:50:48,460 --> 00:50:50,307 Kāds cits? 1099 00:50:50,307 --> 00:50:51,390 AUDITORIJA: Atmiņas vieta? 1100 00:50:51,390 --> 00:50:52,410 DEIVIDS Dž. Meilans: Atmiņas vieta. 1101 00:50:52,410 --> 00:50:54,510 Labi, tā varētu būt viena no divām iespējām. 1102 00:50:54,510 --> 00:50:57,552 Vai nu es redzēšu virkni, vai arī es redzēšu atmiņas adresi. 1103 00:50:57,552 --> 00:50:59,400 Lai gan patiesībā es redzu atmiņas adresi. 1104 00:50:59,400 --> 00:51:01,608 Un šī ir diezgan atšķirīga no vesela skaitļa. 1105 00:51:01,608 --> 00:51:04,950 Bet vai kāds tagad vēlas paskaidrot, kāpēc jums bija taisnība? 1106 00:51:04,950 --> 00:51:09,000 Kāpēc es šeit redzu adresi, nevis hi? 1107 00:51:09,000 --> 00:51:09,640 Tā ir nianse. 1108 00:51:09,640 --> 00:51:10,140 Jā. 1109 00:51:10,140 --> 00:51:12,500 Auditorija: [NESAKLAUSĀMS] 1110 00:51:12,500 --> 00:51:13,500 DEIVIDS Dž. Meilans: Tieši tā. 1111 00:51:13,500 --> 00:51:17,490 Jo es tur atstāju savu %p, kas nozīmē, hey, printf, parādi man norādi. 1112 00:51:17,490 --> 00:51:21,030 Bet šeit printf ir gudrs un ir bijis gudrs kopš nulltās nedēļas. 1113 00:51:21,030 --> 00:51:24,684 Cilvēki, kuri izgudroja printf pirms gadu desmitiem, uzrakstīja kodu, 1114 00:51:24,684 --> 00:51:28,338 kas ievēro, ka OK, %s nozīmē, ka šī vērtība ir jāuztver nevis kā 1115 00:51:28,338 --> 00:51:31,992 tikai adrese pati par sevi, kas tiek izdrukāta burtiski, bet 1116 00:51:31,992 --> 00:51:35,646 jāizdrukā tā kā pastkastes demonstrācijā, kā sava veida dārgumu 1117 00:51:35,646 --> 00:51:39,300 karte, kura ved uz rakstzīmes adresi. 1118 00:51:39,300 --> 00:51:42,770 Tātad, vienkārši mainot vienu rakstzīmi, %p uz %s, un, ja es tagad 1119 00:51:42,770 --> 00:51:46,240 atkal izveidoju adreses un dot,slash, addresses, tas tagad ir 1120 00:51:46,240 --> 00:51:49,710 identisks pirmajai nedēļai, bet, cerams, tam ir jēga. 1121 00:51:49,710 --> 00:51:52,905 Tā kā %s ir tikai norāde uz printf, tas nozīmē, ka dodieties uz šo 1122 00:51:52,905 --> 00:51:56,100 adresi s. 1123 00:51:56,100 --> 00:52:00,990 Izdrukājiet katru rakstzīmi tur un pēc tam, līdz redzat, ko? 1124 00:52:00,990 --> 00:52:01,890 NUL rakstzīmi. 1125 00:52:01,890 --> 00:52:04,060 Un pēc tam pārtrauciet drukāt kaut ko vairāk. 1126 00:52:04,060 --> 00:52:07,050 Un tāpēc hi ir drukājies kopš pirmās nedēļas. 1127 00:52:07,050 --> 00:52:09,690 Šodien mēs varam redzēt adresi %p. 1128 00:52:09,690 --> 00:52:13,520 Taču šī piekļuves adresēm un NUL terminatora kombinācija ir visa 1129 00:52:13,520 --> 00:52:17,350 informācija, kas printf nepieciešama, lai faktiski paveiktu kaut ko 1130 00:52:17,350 --> 00:52:21,180 noderīgāku, izdrukājot faktiskās virknes. 1131 00:52:21,180 --> 00:52:26,250 Vai jums ir jautājumi par šo pieeju %s? 1132 00:52:26,250 --> 00:52:28,102 Jā, aizmugurē. 1133 00:52:28,102 --> 00:52:29,363 Auditorija: [NESAKLAUSĀMS] 1134 00:52:29,363 --> 00:52:30,821 DEIVIDS Dž. Meilans: Ak, kāpēc tas tradicionāli tiek izmantots šādā 1135 00:52:30,821 --> 00:52:32,280 veidā? 1136 00:52:32,280 --> 00:52:34,662 Godīgi sakot, vārds virkne pastāv jau vairākus gadu desmitus. 1137 00:52:34,662 --> 00:52:37,056 Tas nav atslēgas vārds, ko vajadzētu rakstīt C, ja vien neizmantojat 1138 00:52:37,056 --> 00:52:39,450 bibliotēku, piemēram, CS50. 1139 00:52:39,450 --> 00:52:41,190 Un s nozīmē tikai virkni. 1140 00:52:41,190 --> 00:52:45,060 Tātad, lai gan tas neeksistē kā atslēgas vārds, %s nozīmē virkne. 1141 00:52:45,060 --> 00:52:46,655 Un cilvēki pirms vairākiem gadu desmitiem, tāpat kā šodien, vienkārši 1142 00:52:46,655 --> 00:52:48,250 zināja, ko tas nozīmē. 1143 00:52:48,250 --> 00:52:50,458 Tātad viņi varēja izvēlēties jebkuru alfabēta burtu. 1144 00:52:50,458 --> 00:52:52,420 Bet s ir visloģiskākais. 1145 00:52:52,420 --> 00:52:52,920 Labi. 1146 00:52:52,920 --> 00:52:54,150 Nu, iesim atpakaļ. 1147 00:52:54,150 --> 00:52:54,930 Cits jautājums? 1148 00:52:54,930 --> 00:52:56,310 Auditorija: [NESAKLAUSĀMS] 1149 00:52:56,310 --> 00:52:57,560 DEIVIDS Dž. Meilans: Labs jautājums. 1150 00:52:57,560 --> 00:52:58,560 Pirms — ļaujiet man pietuvināt. 1151 00:52:58,560 --> 00:53:01,010 Es neizmantoju zvaigznīti pirms s. 1152 00:53:01,010 --> 00:53:01,760 Kāpēc? 1153 00:53:01,760 --> 00:53:03,290 Nu, tā šeit ir nianse. 1154 00:53:03,290 --> 00:53:07,360 Bet printf tika izgudrots pirms gadiem, lai zinātu, ņemot vērā tādu 1155 00:53:07,360 --> 00:53:11,430 adresi kā mainīgajā s, printf zina, ka tur jāiet. 1156 00:53:11,430 --> 00:53:13,826 Tātad, ja mēs aplūkotu avota kodu, ko daži cilvēki pirms gadiem 1157 00:53:13,826 --> 00:53:16,223 uzrakstīja C, mēs, visticamāk, redzētu īsto zvaigznīti, uz kuru jūs 1158 00:53:16,223 --> 00:53:18,620 atsaucāties. 1159 00:53:18,620 --> 00:53:21,650 Printf uzņemas atbildību par došanos uz s. 1160 00:53:21,650 --> 00:53:25,610 Ja jūs šeit ievietotu zvaigznīti s, zvaigznīti un s, tā tagad būtu 1161 00:53:25,610 --> 00:53:29,570 burtiski rakstzīme. 1162 00:53:29,570 --> 00:53:33,345 Jo, ja es saku zvaigznīte s, tas nozīmē doties uz adresi s. 1163 00:53:33,345 --> 00:53:35,720 Un viss, ko jūs tur atradīsit, ir tikai viena rakstzīme. 1164 00:53:35,720 --> 00:53:39,680 Tas, ko printf vēlas zināt, nav, kāda tur ir rakstzīme? 1165 00:53:39,680 --> 00:53:41,430 Kāda ir šīs rakstzīmes adrese? 1166 00:53:41,430 --> 00:53:41,930 Kāpēc? 1167 00:53:41,930 --> 00:53:45,350 Jo printf ir jāiet cauri pārējām šīm rakstzīmēm, meklējot pēdējo NUL 1168 00:53:45,350 --> 00:53:48,770 rakstzīmi. 1169 00:53:48,770 --> 00:53:50,800 Un patiesībā, ļaujiet man paskatīties, ar mazliet vairāk sintakses, 1170 00:53:50,800 --> 00:53:52,830 vai mēs varam to izcelt mazliet vairāk. 1171 00:53:52,830 --> 00:53:53,570 Ļaujiet man to izdarīt. 1172 00:53:53,570 --> 00:53:56,930 Papildus s drukāšanai izmēģināsim mūsu sintaksi citā veidā. 1173 00:53:56,930 --> 00:54:01,385 Ļaujiet man izdrukāt ar %s, ja nebūtu s šeit, bet izdrukāsim dažas 1174 00:54:01,385 --> 00:54:05,840 adreses. 1175 00:54:05,840 --> 00:54:06,935 %s, reversā slīpsvītra, n, aizvērējpēdiņas un tad izdrukāsim, kā ar 1176 00:54:06,935 --> 00:54:08,030 šo? 1177 00:54:08,030 --> 00:54:12,440 Pirmā rakstzīme virknē s tiks saukta par s, kvadrātiekava, 0. 1178 00:54:12,440 --> 00:54:16,425 Bet kā es varu iegūt s pirmās rakstzīmes adresi? 1179 00:54:16,425 --> 00:54:18,800 Nu, es varētu tehniski vienkārši izmantot šodienas jauno primitīvu. 1180 00:54:18,800 --> 00:54:19,967 Es varu pievienot tikai & zīmi. 1181 00:54:19,967 --> 00:54:22,620 Tā vienmēr dod man kādu vērtību. 1182 00:54:22,620 --> 00:54:25,702 Tātad, kad es pabeidzu šo domu un notīru savu termināļa logu un 1183 00:54:25,702 --> 00:54:28,785 palaižu make addresses, joprojām kompilējas, kad es palaidīšu 1184 00:54:28,785 --> 00:54:31,867 addresses pēc mirkļa, vai ir minējumi par to, ko es redzēšu rindiņu 1185 00:54:31,867 --> 00:54:34,950 pa rindiņai? 1186 00:54:34,950 --> 00:54:37,083 Tas izdrukās divas lietas. 1187 00:54:37,083 --> 00:54:39,500 Un jums nav jāatceras, kāds bija faktiskais skaitlis. 1188 00:54:39,500 --> 00:54:42,440 Bet augstā līmenī, kas tagad tiks drukāts? 1189 00:54:42,440 --> 00:54:44,120 Divreiz tas pats. 1190 00:54:44,120 --> 00:54:44,700 Kāpēc? 1191 00:54:44,700 --> 00:54:47,740 Kad es palaižu šo, ko es šeit drukāju, un ļaujiet man pietuvināt 1192 00:54:47,740 --> 00:54:50,780 apakšā, es patiešām redzu divas ļoti garas adreses. 1193 00:54:50,780 --> 00:54:52,100 Bet patiesībā tās ir vienādas. 1194 00:54:52,100 --> 00:54:52,650 Kāpēc? 1195 00:54:52,650 --> 00:54:56,556 Tas ir tāpēc, ka, ja s ir rakstzīmes adrese, kā to tagad norāda vai 1196 00:54:56,556 --> 00:55:00,463 nu CS50 vārdu virkne, vai faktiskā frāze char star, tad s ir tikai 1197 00:55:00,463 --> 00:55:04,370 adrese. 1198 00:55:04,370 --> 00:55:09,050 Turpretim otrajā nedēļā s, kvadrātiekava, 0 ir rakstzīme. 1199 00:55:09,050 --> 00:55:11,230 Vienmēr ir bijusi rakstzīme, īpaša rakstzīme. 1200 00:55:11,230 --> 00:55:12,667 Bet, ja vēlaties šīs rakstzīmes adresi, vienkārši pievienojiet 1201 00:55:12,667 --> 00:55:14,105 simbolu &. 1202 00:55:14,105 --> 00:55:17,297 Nu, izrādās, ka virknes saskaņā ar definīciju, ko mēs pastāvīgi 1203 00:55:17,297 --> 00:55:20,490 uzsveram, ir tikai virknes pirmās rakstzīmes adrese. 1204 00:55:20,490 --> 00:55:23,550 Tātad, protams, ja jūs to darīsit, jūs redzēsit tieši to pašu. 1205 00:55:23,550 --> 00:55:25,000 Un, ja es to daru mazliet vairāk, parasti jūs nevēlaties kopēt 1206 00:55:25,000 --> 00:55:26,450 ielīmēt. 1207 00:55:26,450 --> 00:55:28,940 Bet tas ir tikai vizualizācijas dēļ. 1208 00:55:28,940 --> 00:55:30,440 Ļaujiet man izdrukāt visas rakstzīmes. 1209 00:55:30,440 --> 00:55:32,330 Tātad cita, cita, cita. 1210 00:55:32,330 --> 00:55:34,925 Un ļaujiet man to mainīt, lai izdrukātu pirmās, otrās un trešās 1211 00:55:34,925 --> 00:55:37,520 kvadrātiekavas adresi. 1212 00:55:37,520 --> 00:55:41,480 Tātad visas četras rakstzīmes, H, I, izsaukuma zīme un NUL rakstzīmi. 1213 00:55:41,480 --> 00:55:43,920 Ievērojiet, ka visiem tiem izmantoju %p. 1214 00:55:43,920 --> 00:55:46,755 Tātad, ja es tagad veidoju adreses un dot, slash, addresses, tagad 1215 00:55:46,755 --> 00:55:49,590 ievērojiet, un tas ir lieliski. 1216 00:55:49,590 --> 00:55:51,530 Pirmie divi patiešām joprojām ir tie paši. 1217 00:55:51,530 --> 00:55:53,052 Bet kas ir ievērības cienīgs attiecībā uz citām ekrānā redzamajām 1218 00:55:53,052 --> 00:55:54,575 vērtībām? 1219 00:55:57,180 --> 00:55:58,380 Jā, tās ir pēc kārtas. 1220 00:55:58,380 --> 00:55:59,822 Katra no tām ir tikai 1 baita attālumā. 1221 00:55:59,822 --> 00:56:01,746 Pat ja jums vēl nav saprotama heksadecimālā sistēma un šeit ir 1222 00:56:01,746 --> 00:56:03,670 neprātīgi daudz ciparu, kuru tas interesē? 1223 00:56:03,670 --> 00:56:05,795 Tie visi ir vienādi, izņemot pēdējos, četri, četri un pēc tam pieci, 1224 00:56:05,795 --> 00:56:07,920 seši, septiņi. 1225 00:56:07,920 --> 00:56:12,150 Un tas apstiprina to, ko esmu apgalvojis vairākas nedēļas, ka masīvā 1226 00:56:12,150 --> 00:56:16,380 visas rakstzīmes atrodas viena otrai blakus viena baita attālumā. 1227 00:56:16,380 --> 00:56:19,993 Tātad, izmantojot tikai & un tikai šo zvaigznīti, tas patiesībā ir 1228 00:56:19,993 --> 00:56:23,606 diezgan foršs rīks rīku komplektā, jo varat sākt meklēt informāciju 1229 00:56:23,606 --> 00:56:27,220 par to, kas patiesībā notiek datora atmiņā. 1230 00:56:27,220 --> 00:56:29,855 Un patiesībā, ja mēs to darīsim, es varu šeit ieviest vēl vienu foršu 1231 00:56:29,855 --> 00:56:32,490 triku, ja vēlaties. 1232 00:56:32,490 --> 00:56:35,325 Ļaujiet man ierosināt, ka mēs faktiski tagad varam veikt norāžu 1233 00:56:35,325 --> 00:56:38,160 aritmētiku. 1234 00:56:38,160 --> 00:56:39,090 Un jums nevajag. 1235 00:56:39,090 --> 00:56:40,780 Jūs redzēsit vienkāršāku veidu, kā to izdarīt. 1236 00:56:40,780 --> 00:56:43,470 Bet tagad, kad jums, iespējams, ir šī pamatizpratne par to, kur 1237 00:56:43,470 --> 00:56:46,160 lietas ir atmiņā un tās ir tikai adreses, mēs faktiski varam kaut ko 1238 00:56:46,160 --> 00:56:48,850 darīt glīti. 1239 00:56:48,850 --> 00:56:50,950 Mēs varam darīt kaut ko līdzīgu šim. 1240 00:56:50,950 --> 00:56:55,470 Ļaujiet man atgriezties pie šīs virkņu versijas ar hi. 1241 00:56:55,470 --> 00:56:57,120 Un ļaujiet man izdarīt šo tā vietā. 1242 00:56:57,120 --> 00:56:59,255 Ļaujiet man to mazliet iztīrīt un atbrīvoties no dažām no šīm koda 1243 00:56:59,255 --> 00:57:01,390 rindām. 1244 00:57:01,390 --> 00:57:02,290 Un ļaujiet man izdarīt šādi. 1245 00:57:02,290 --> 00:57:04,975 Ļaujiet man izdrukāt %c, %c, %c. 1246 00:57:04,975 --> 00:57:06,600 Ļaujiet man atbrīvoties no visām šī & rakstzīmēm. 1247 00:57:06,600 --> 00:57:09,210 Mēs atgriezīsimies pie otrās nedēļas lietām. 1248 00:57:09,210 --> 00:57:13,155 Skaidrības labad, kad es kompilēju un palaižu šo programmas versiju, 1249 00:57:13,155 --> 00:57:17,100 kā arī pietuvināšu, kam vajadzētu tikt izdrukātam ekrānā? 1250 00:57:17,100 --> 00:57:19,380 Tagad šī ir tikai otrā nedēļa. 1251 00:57:19,380 --> 00:57:20,864 Nav norādes kā tādas. 1252 00:57:20,864 --> 00:57:21,364 Jā. 1253 00:57:21,364 --> 00:57:23,800 Auditorija: [NESAKLAUSĀMS] 1254 00:57:23,800 --> 00:57:25,920 DEIVIDS Dž. Meilans: Tikai HI, izsaukuma zīme, viena katrā rindiņā, 1255 00:57:25,920 --> 00:57:28,040 jo man ir visas šīs reversās slīpsvītras n. 1256 00:57:28,040 --> 00:57:29,150 Tāpēc ļaujiet man izdarīt šādi. 1257 00:57:29,150 --> 00:57:32,285 Ļaujiet man noiet šeit, make addresses, Enter. 1258 00:57:32,285 --> 00:57:32,960 Labi, diezgan labi. 1259 00:57:32,960 --> 00:57:33,980 Dot, slash, addresses. 1260 00:57:33,980 --> 00:57:36,140 Un tiešām HI, izsaukuma zīme. 1261 00:57:36,140 --> 00:57:39,650 Bet tagad, ja jūs jūtaties mazliet ērtāk, un viss ir labi, ja vēl ne 1262 00:57:39,650 --> 00:57:43,160 šodien, bet nākamajā nedēļā vai nedēļās, jo jūs zināsietnedaudz 1263 00:57:43,160 --> 00:57:46,670 vairāk par adrešu līdzvērtību ar mūsu masīvu un virkņu definīcijām, 1264 00:57:46,670 --> 00:57:50,180 un tas viss, jūs varat sākt spēlēties. 1265 00:57:50,180 --> 00:57:51,680 Un es varu darīt šādi. 1266 00:57:51,680 --> 00:57:54,851 Ja es vēlos izdrukāt pirmo rakstzīmi virknē, es varētu darīt, 1267 00:57:54,851 --> 00:57:58,023 piemēram, kā otrajā nedēļā, s, iekava, 0. 1268 00:57:58,023 --> 00:57:58,940 Tas vienmēr darbosies. 1269 00:57:58,940 --> 00:57:59,960 Un jūs varat turpināt to izmantot. 1270 00:57:59,960 --> 00:58:00,960 Tā nav CS50 lieta. 1271 00:58:00,960 --> 00:58:05,570 Tas ir tikai ērtība C. 1272 00:58:00,960 --> 00:58:07,650 Bet es varētu tehniski izdrukāt nevis s, jo s ir adrese. 1273 00:58:07,650 --> 00:58:10,445 Bet kāda būtu sintakse, ko es varētu izmantot, lai pateiktu, izdrukāt 1274 00:58:10,445 --> 00:58:13,240 rakstzīmi s? 1275 00:58:13,240 --> 00:58:15,070 Vai ir kādi ierosinājumi? 1276 00:58:15,070 --> 00:58:19,050 Kā lai saka, ej uz adresi s? 1277 00:58:19,050 --> 00:58:21,840 Tā ir viena no divām iespējamām atbildēm šodien. 1278 00:58:21,840 --> 00:58:24,570 Tātad no mūsu diviem jaunajiem — no mūsu diviem jaunajiem operatoriem 1279 00:58:24,570 --> 00:58:27,300 šodien, mums ir & un zvaigznīte. 1280 00:58:27,300 --> 00:58:30,405 Kurš no tiem mūs aizvedīs uz to, kas atrodas adresē? 1281 00:58:30,405 --> 00:58:31,540 Auditorija: [NESAKLAUSĀMS] 1282 00:58:31,540 --> 00:58:32,707 DEIVIDS Dž. Meilans: Tātad zvaigznīte. 1283 00:58:32,707 --> 00:58:36,048 Tātad patiesībā, ja es vēlos izdrukāt to, kas atrodas nulles adresē, 1284 00:58:36,048 --> 00:58:39,390 adresē s, es varu vienkārši atzīmēt s. 1285 00:58:39,390 --> 00:58:42,345 Un, ja jūs patiešām vēlaties kļūt smalki, kā izdrukāt otro rakstzīmi, 1286 00:58:42,345 --> 00:58:45,300 kas, tā sakot, atrodas uzreiz pa labi? 1287 00:58:45,300 --> 00:58:47,591 Nu, jūs varat doties uz, izmantojot atsauces noņemšanas operatoru, un 1288 00:58:47,591 --> 00:58:49,882 vai vēlaties atbildēt uz šo? 1289 00:58:49,882 --> 00:58:50,826 Auditorija: [NESAKLAUSĀMS] 1290 00:58:50,826 --> 00:58:52,380 DEIVIDS Dž. Meilans: S plus 1. 1291 00:58:52,380 --> 00:58:54,300 Tātad, norāžu aritmētika. 1292 00:58:54,300 --> 00:58:56,220 Ja vēlaties, varat veikt matemātiku, vienkāršu saskaitīšanu, 1293 00:58:56,220 --> 00:58:58,140 atņemšanu un visu citu, izmantojot norādes. 1294 00:58:58,140 --> 00:58:59,850 Un to var izdarīt arī šeit. 1295 00:58:59,850 --> 00:59:02,382 Tātad, zvaigznīte, ja vēlaties noņemt arī šo, kā izdrukāt pēdējo, 1296 00:59:02,382 --> 00:59:04,914 trešo rakstzīmi? 1297 00:59:04,914 --> 00:59:05,870 Auditorija: s plus 2? 1298 00:59:05,870 --> 00:59:07,227 DEIVIDS Dž. Meilans: s plus 2. 1299 00:59:07,227 --> 00:59:10,538 Jo, ja jūs zināt un saprotat, ka virkne ir tikai rakstzīmju secība, 1300 00:59:10,538 --> 00:59:13,849 katra rakstzīme ir tikai baits, un šie baiti ir savstarpēji saistīti, 1301 00:59:13,849 --> 00:59:17,160 varat vienkārši doties, kur vien vēlaties datora atmiņā. 1302 00:59:17,160 --> 00:59:20,150 Un šeit es varu atkal izveidot adreses, dot, slash, addresses. 1303 00:59:20,150 --> 00:59:23,030 Un voila, mums tagad ir hi, izsaukuma zīme. 1304 00:59:23,030 --> 00:59:25,100 Tātad neko jaunu neesam izdrukājuši. 1305 00:59:25,100 --> 00:59:27,740 Bet atkal, tikai izmantojot šos divus jaunos operatorus — & zīmi un 1306 00:59:27,740 --> 00:59:30,380 zvaigznīti, jūs varat izdomāt kaut kā adresi un varat doties uz kaut 1307 00:59:30,380 --> 00:59:33,020 kā adresi. 1308 00:59:33,020 --> 00:59:34,250 Labi, jautājums aizmugurē. 1309 00:59:34,250 --> 00:59:35,352 Auditorija: [NESAKLAUSĀMS] 1310 00:59:35,352 --> 00:59:36,310 DEIVIDS Dž. Meilans: Patiešām. 1311 00:59:36,310 --> 00:59:37,770 Galu galā tas ir tieši tāds pats. 1312 00:59:37,770 --> 00:59:39,520 Tāpēc es varētu būt lietojis šo terminu iepriekš. 1313 00:59:39,520 --> 00:59:41,890 & tehnika — atvainojiet. 1314 00:59:41,890 --> 00:59:44,340 Kvadrātiekavu paņēmiens, kurā jūs ievadat s, kvadrātiekava, nulle, 1315 00:59:44,340 --> 00:59:46,790 s,kvadrātiekava, viens, s, kvadrātiekava, divi, patiesībā mēs to 1316 00:59:46,790 --> 00:59:49,240 saucam par sintaktisko cukuru. 1317 00:59:49,240 --> 00:59:49,780 Tas darbojas. 1318 00:59:49,780 --> 00:59:50,572 Un jūs varat to izmantot. 1319 00:59:50,572 --> 00:59:51,322 Jums vajadzētu to izmantot. 1320 00:59:51,322 --> 00:59:52,210 Tas ir jauki un vienkārši. 1321 00:59:52,210 --> 00:59:55,158 Taču apzīmējums kvadrātiekavās zem pārsega būtībā tiek pārveidots par 1322 00:59:55,158 --> 00:59:58,107 to, kas nav tik jautri. 1323 00:59:58,107 --> 00:59:59,940 Tas ir tad, kad vēlaties izrādīties saviem draugiem, jūs zināt, kā 1324 00:59:59,940 --> 01:00:01,773 kodā paveikt foršas lietas. 1325 01:00:01,773 --> 01:00:03,543 Bet tas nav tik labi nolasāms kā tikai s, kvadrātiekava nulle, viens 1326 01:00:03,543 --> 01:00:05,313 un divi. 1327 01:00:05,313 --> 01:00:07,480 Bet tas ir viss, kas notiek zem pārsega. 1328 01:00:07,480 --> 01:00:09,550 Un tas ir iemesls, kāpēc CS50 mēs veltām laiku dažiem no šiem zemākā 1329 01:00:09,550 --> 01:00:11,620 līmeņa blokiem. 1330 01:00:11,620 --> 01:00:15,280 Jo, ja pieņemat, ka jūsu datora atmiņa patiešām ir tikai šis baitu 1331 01:00:15,280 --> 01:00:18,940 režģis un jums tagad ir koda iespēja kodā iegūt adresi un doties uz 1332 01:00:18,940 --> 01:00:22,600 adresi, varat sākt darīt visu, ko vēlaties. 1333 01:00:22,600 --> 01:00:25,210 Un jūs varat pabakstīt datora atmiņu jebkurā vietā. 1334 01:00:25,210 --> 01:00:26,950 Un šeit slēpjas briesmas. 1335 01:00:26,950 --> 01:00:30,940 Es pašlaik izmantoju godprāta sistēmu, jo, ja mana virkne ir hi, 1336 01:00:30,940 --> 01:00:34,930 izsaukuma zīme, es varu pāriet uz pirmo, otro un trešo baitu. 1337 01:00:34,930 --> 01:00:36,910 Bet tagad es varētu kļūt traks. 1338 01:00:36,910 --> 01:00:40,240 Un, ja es vēlos redzēt, kas notiek datora atmiņā, es domāju, nekas 1339 01:00:40,240 --> 01:00:43,570 neliedz man rīkoties tāpat kā s plus 50. 1340 01:00:43,570 --> 01:00:44,780 Un paskatīsimies, kas tur ir. 1341 01:00:44,780 --> 01:00:47,160 Tāpēc izveidojiet dot, slash, addresses, hi, un tad, labi, šķiet 1342 01:00:47,160 --> 01:00:49,540 nekas. 1343 01:00:49,540 --> 01:00:51,522 Nu, kā būtu ar 5000 baitu attālumā? 1344 01:00:51,522 --> 01:00:52,480 Iesim tikai pabakstīties apkārt. 1345 01:00:52,480 --> 01:00:54,105 Kas atrodas datora atmiņā? 1346 01:00:54,105 --> 01:00:56,562 Tātad vēlreiz izveidojiet adreses, make addresses, dot, slash, 1347 01:00:56,562 --> 01:00:59,020 addresses, Enter.. 1348 01:00:59,020 --> 01:01:00,400 Labi, joprojām nekā. 1349 01:01:00,400 --> 01:01:02,470 Mēģināsim 50 000. 1350 01:01:02,470 --> 01:01:03,190 Labi. 1351 01:01:03,190 --> 01:01:05,860 Make addresses, dot, slash, addresses. 1352 01:01:05,860 --> 01:01:07,530 Labi, mēs to redzam. 1353 01:01:07,530 --> 01:01:09,923 Tātad daži no jums, iespējams, esat to izdarījuši nejauši, jo, 1354 01:01:09,923 --> 01:01:12,316 iespējams, esat aizgājuši pārāk tālu pa kreisi vai pa labi kādā 1355 01:01:12,316 --> 01:01:14,710 masīvā aiztiekot atmiņu, kuru jums nevajadzētu. 1356 01:01:14,710 --> 01:01:16,945 Pietiek pateikt, ka es nedrīkstu akli aiztikt atmiņu 50 000 baitu 1357 01:01:16,945 --> 01:01:19,180 attālumā. 1358 01:01:19,180 --> 01:01:20,650 Jo kas zina, kas tur ir? 1359 01:01:20,650 --> 01:01:23,730 Un patiešām datorā, kad programma darbojas, dators to sadala dažādos 1360 01:01:23,730 --> 01:01:26,810 atmiņas segmentos. 1361 01:01:26,810 --> 01:01:30,146 Un, ja jūs kļūstat pārāk mantkārīgi un pieskaraties citam atmiņas 1362 01:01:30,146 --> 01:01:33,483 segmentam, kuru jums tehniski nepiešķīra operētājsistēma Mac OS vai 1363 01:01:33,483 --> 01:01:36,820 Windows, vai Linux, vai operētājsistēma, notiek sliktas lietas. 1364 01:01:36,820 --> 01:01:38,320 Un jūs saņemat segmentācijas kļūmi. 1365 01:01:38,320 --> 01:01:40,040 Un tas nozīmē, ka tā ir kļūda jūsu kodā. 1366 01:01:40,040 --> 01:01:41,500 Tātad jūs tagad varat to izdarīt. 1367 01:01:41,500 --> 01:01:44,410 Un tas nozīmē, ka arī hakeri var darīt šādas lietas. 1368 01:01:44,410 --> 01:01:47,325 Ja viņi var kaut kādā veidā ievadīt kodu jūsu C programmā, iespējams, 1369 01:01:47,325 --> 01:01:50,240 viņi var pabakstīties datora atmiņā. 1370 01:01:50,240 --> 01:01:53,500 Un patiešām, šis ir sava veida paņēmiens, ar kuru, iespējams, 1371 01:01:53,500 --> 01:01:56,760 patiešām advancēts hakeris var pāriet uz šo atmiņu, šo atmiņu, šo 1372 01:01:56,760 --> 01:02:00,020 atmiņu, meklējot kaut ko līdzīgu jūsu parolei vai finanšu 1373 01:02:00,020 --> 01:02:03,280 informācijai, vai jebkam, kas atrodas programmā, bet citā adresē. 1374 01:02:03,280 --> 01:02:07,200 Vismaz šobrīd nekas neliedz pretiniekam kaut ko darīt, ja viņi var 1375 01:02:07,200 --> 01:02:11,120 izpildīt kodu jūsu datorā. 1376 01:02:11,120 --> 01:02:13,750 Tātad te atkal ir C spēks, bet arī briesmas. 1377 01:02:13,750 --> 01:02:16,910 Un turpmākajās dienās jūs noteikti cietīsit no vairākām seg kļūmēm. 1378 01:02:16,910 --> 01:02:19,700 Bet galu galā mērķis būs palīdzēt jums tos atrisināt un salabot 1379 01:02:19,700 --> 01:02:22,490 lietas. 1380 01:02:22,490 --> 01:02:27,170 Bet pagaidām, manuprāt, tas bija diezgan pietiekami. 1381 01:02:27,170 --> 01:02:30,450 Ļaujiet man ierosināt, lai mēs šeit paņemam ilgāku pārtraukumu, 1382 01:02:30,450 --> 01:02:33,730 varbūt 10 minūtes, un paēdam kūciņas šķērsjomā. 1383 01:02:33,730 --> 01:02:35,710 Mēs atgriezīsimies pēc 10. 1384 01:02:35,710 --> 01:02:37,090 Labi. 1385 01:02:37,090 --> 01:02:38,470 Tātad esam atpakaļ. 1386 01:02:38,470 --> 01:02:41,712 Un, lai atgādinātu, kur mēs pārtraucām, jums tagad ir šī jaunā 1387 01:02:41,712 --> 01:02:44,955 iespēja kodā veikt norāžu aritmētiku, piemēram, apstrādāt adreses kā 1388 01:02:44,955 --> 01:02:48,197 skaitļus, kas patiesībā ir heksadecimālā vai citādā veidā, un 1389 01:02:48,197 --> 01:02:51,440 saskaitīt tos kopā un pabakstīt datora atmiņu. 1390 01:02:51,440 --> 01:02:54,210 Un pārtraukumā tika jautāts, kā mēs to varētu vēl vairāk izmantot 1391 01:02:54,210 --> 01:02:56,980 virkņu kontekstā. 1392 01:02:56,980 --> 01:02:59,650 Tāpēc es nemainīju kodu, kuru rakstījām tieši pirms pārtraukuma. 1393 01:02:59,650 --> 01:03:02,305 Atcerieties, ka pēdējo reizi mēs sabojājām programmu, pārbaudot 1394 01:03:02,305 --> 01:03:04,960 baitus 50 000 baitu attālumā. 1395 01:03:04,960 --> 01:03:06,070 Bet nedarīsim to. 1396 01:03:06,070 --> 01:03:09,143 Un patiesībā mēģināsim izdrukāt nevis atsevišķas rakstzīmes, kā es to 1397 01:03:09,143 --> 01:03:12,216 darīju, saskaņā ar %c, bet kāpēc gan mums nepamēģināt izdrukāt 1398 01:03:12,216 --> 01:03:15,290 virknes un apakšvirknes, ja vēlaties? 1399 01:03:15,290 --> 01:03:16,810 Tāpēc ļaujiet man notīrīt termināļa logu. 1400 01:03:16,810 --> 01:03:21,490 Ļaujiet man mainīt visus šos %c uz %s, %s, %s. 1401 01:03:21,490 --> 01:03:23,900 Un tad ļaujiet man attīt atpakaļ uz to, ko mēs esam darījuši kopš 1402 01:03:23,900 --> 01:03:26,310 pirmās nedēļas ar virknēm, proti, vienkārši izdrukājiet tos, 1403 01:03:26,310 --> 01:03:28,720 piemēram, ar šo pirmo rindiņu. 1404 01:03:28,720 --> 01:03:32,800 Un vienīgā atšķirība šobrīd ir tā, ka tagad es noņēmu palīgritenīšus. 1405 01:03:32,800 --> 01:03:35,875 Es atbrīvojos no CS50.h, kurā virkne ir typedef, uz char zvaigznīti 1406 01:03:35,875 --> 01:03:38,950 jums. 1407 01:03:38,950 --> 01:03:39,920 Tiku no tā vaļā. 1408 01:03:39,920 --> 01:03:42,071 Tāpēc tagad piektajā rindā es deklarēju s kā rakstzīmi zvaigznīti, 1409 01:03:42,071 --> 01:03:44,223 kas nozīmē tikai rakstzīmes adresi. 1410 01:03:44,223 --> 01:03:46,391 Un printf ir pietiekami gudrs, lai zinātu, ka virknes beigas ir 1411 01:03:46,391 --> 01:03:48,560 visur, kur atrodas šī NUL rakstzīme. 1412 01:03:48,560 --> 01:03:50,735 Bet tagad, kad es varu veikt norādes aritmētiku, ievērojiet, ka es 1413 01:03:50,735 --> 01:03:52,910 varētu darīt kaut ko līdzīgu šim. 1414 01:03:52,910 --> 01:03:55,390 Ja es gribu izdrukāt s, es vienkārši izdrukāju s. 1415 01:03:55,390 --> 01:03:58,735 Pieņemsim, ka pēc %c maiņas uz %s es šeit ievadu s plus 1 un šeit 1416 01:03:58,735 --> 01:04:02,080 atkal s plus 2. 1417 01:04:02,080 --> 01:04:06,160 Jebkāda intuīcija par to, ko šis kods tagad izdrukās uz ekrāna 1418 01:04:06,160 --> 01:04:10,240 rindiņu pa rindiņai. 1419 01:04:10,240 --> 01:04:11,180 Jā, domas? 1420 01:04:11,180 --> 01:04:12,260 Auditorija: [NESAKLAUSĀMS] 1421 01:04:12,260 --> 01:04:14,010 DEIVIDS Dž. Meilan: Labi, pamatots minējums. 1422 01:04:14,010 --> 01:04:17,500 Varbūt h atmiņas adrese, i, izsaukuma zīmes. 1423 01:04:17,500 --> 01:04:18,550 Bet citas domas? 1424 01:04:18,550 --> 01:04:20,105 Auditorija: [NESAKLAUSĀMS] 1425 01:04:20,105 --> 01:04:20,980 DEIVIDS Dž. Meilāns: Jā. 1426 01:04:20,980 --> 01:04:22,510 Es domāju, ka tas faktiski darīs pēdējo. 1427 01:04:22,510 --> 01:04:24,430 Labdien, tas tiks izdrukāts parastajā veidā. 1428 01:04:24,430 --> 01:04:27,160 Jo godīgi sakot, piektā rinda ir šī — drīzāk sestā rinda ir tāda pati 1429 01:04:27,160 --> 01:04:29,890 kā pirmās nedēļas jautājumi, izņemot to, ka mēs noņēmām virknes 1430 01:04:29,890 --> 01:04:32,620 palīgritenīšus un to saucam par rakstzīmi zvaigznīti. 1431 01:04:32,620 --> 01:04:35,770 Bet es domāju, ka septītā rinda patiešām izdrukās i. 1432 01:04:35,770 --> 01:04:38,125 Un astotā rindiņa tikai tiks izdrukāta, jo tā būs tikai izsaukuma 1433 01:04:38,125 --> 01:04:40,480 zīme. 1434 01:04:40,480 --> 01:04:42,940 Printf joprojām būs pietiekami gudrs, lai zinātu, kur katra no šīm 1435 01:04:42,940 --> 01:04:45,400 apakšvirknēm, virkņu daļām, beidzas pēc tādas pašas loģikas kā 1436 01:04:45,400 --> 01:04:47,860 vienmēr. 1437 01:04:47,860 --> 01:04:50,905 Bet ļaujiet turpināt un attālināt, palaist make addresses, Enter, 1438 01:04:50,905 --> 01:04:53,950 kompilē OK, dot, slash, addresses. 1439 01:04:53,950 --> 01:04:57,340 Un tagad patiešām, tas viss ir virkne. 1440 01:04:57,340 --> 01:05:00,340 Tā ir rakstzīmju secība, ko identificē pēc tās pirmā baita. 1441 01:05:00,340 --> 01:05:04,393 Ja pēc tam sākat pabakstīties un sakāt printf drukāt to, kas pie 1442 01:05:04,393 --> 01:05:08,446 nākamā baita vai nākamā, nākamā baita, tas darīs to pašu, izdrukājot 1443 01:05:08,446 --> 01:05:12,500 šo rakstzīmi un visu pēc tam līdz šai NUL rakstzīmei. 1444 01:05:12,500 --> 01:05:14,946 Tātad atkal, lai gan notiek daudzkas, mēs esam ieviesuši šos divus 1445 01:05:14,946 --> 01:05:17,393 jaunos operatorus, šodien nenotiek nekas tāds, kas nav jau noticis 1446 01:05:17,393 --> 01:05:19,840 nedēļām ilgi. 1447 01:05:19,840 --> 01:05:22,550 Bet cerams, ka šīs nedēļas laikā, šīs nedēļas lekcijā, šīs nedēļas 1448 01:05:22,550 --> 01:05:25,260 problēmu kopas laikā un pēc tam jūs sāksit saprast, ka tagad jums ir 1449 01:05:25,260 --> 01:05:27,970 tikai vairāk rīku, ar ko izmantot šīs zemākā līmeņa ieviešanas 1450 01:05:27,970 --> 01:05:30,680 detaļas. 1451 01:05:30,680 --> 01:05:34,420 Tāpēc pagājušajā nedēļā atcerieties vēl vienu ieviešanas detaļu. 1452 01:05:34,420 --> 01:05:38,620 Es apgalvoju, ka jūs nevarat salīdzināt divas virknes tik vienkārši, 1453 01:05:38,620 --> 01:05:42,820 kā jūs varat salīdzināt, piemēram, divus veselus skaitļus. 1454 01:05:42,820 --> 01:05:46,180 Un es teicu jums izmantot citu funkciju, ko, iespējams, izmantojāt 1455 01:05:46,180 --> 01:05:49,540 vienu vai vairākas reizes ar iepriekšējo problēmu kopu. 1456 01:05:49,540 --> 01:05:52,395 Kā jums šķietami jāsalīdzina virknes? 1457 01:05:52,395 --> 01:05:53,270 Auditorija: [NESAKLAUSĀMS] 1458 01:05:53,270 --> 01:05:54,260 DEIVIDS Dž. Meilans: Jā, tāpēc string compare. 1459 01:05:54,260 --> 01:05:54,825 STR Comp. 1460 01:05:54,825 --> 01:05:56,387 Papildfunkcija, par kuru mēs teicām, jums tā vienkārši pagaidām ir 1461 01:05:56,387 --> 01:05:57,950 jāizmanto. 1462 01:05:57,950 --> 01:06:00,690 Bet jums jau var būt neliela intuīcija par to, kāpēc mums ir 1463 01:06:00,690 --> 01:06:03,430 jāizmanto STR compare, un mēs nevaram izmantot vienādības zīme, 1464 01:06:03,430 --> 01:06:06,170 vienādības zīme, lai salīdzinātu virknes. 1465 01:06:06,170 --> 01:06:07,970 Vai ir jau kāda intuīcija par to? 1466 01:06:07,970 --> 01:06:10,190 Kāpēc pagājušajā nedēļā bija nepieciešams STR salīdzinājums? 1467 01:06:10,190 --> 01:06:11,380 Auditorija: [NESAKLAUSĀMS] 1468 01:06:11,380 --> 01:06:12,380 DEIVIDS Dž. Meilans: Perfekti. 1469 01:06:12,380 --> 01:06:15,230 Vienāds ar, vienāds ar burtiski salīdzinātu divas atmiņas adreses, 1470 01:06:15,230 --> 01:06:18,080 nevis faktiskās virknes rakstzīmi pēc rakstzīmes. 1471 01:06:18,080 --> 01:06:20,970 Un, ja vien atmiņas adreses nav burtiski vienādas, tātad jūs 1472 01:06:20,970 --> 01:06:23,860 salīdzināt tieši to pašu atmiņas adresi, divas dažādas virknes, 1473 01:06:23,860 --> 01:06:26,750 iespējams, netiks uzskatītas par vienādām, pat ja mums, cilvēkiem, 1474 01:06:26,750 --> 01:06:29,640 tās patiešām izskatās vienādas. 1475 01:06:29,640 --> 01:06:30,570 Tātad, paskatīsimies šo. 1476 01:06:30,570 --> 01:06:32,750 Ļaujiet man turpināt un aizvērt addresses.c. 1477 01:06:32,750 --> 01:06:36,052 Un patiesībā, pirms es pieminu pēdējo reizi, viena no spēcīgām lietām 1478 01:06:36,052 --> 01:06:39,354 norāžu aritmētikas jomā ir tā, ka C un patiesībā kompilators ir 1479 01:06:39,354 --> 01:06:42,656 pietiekami gudrs, lai zinātu, cik baitu jāturpina pievienot un 1480 01:06:42,656 --> 01:06:45,958 pievienot. 1481 01:06:45,958 --> 01:06:47,000 Un ar to es domāju šo. 1482 01:06:47,000 --> 01:06:49,875 Šobrīd mums paveicās, jo virkne ir rakstzīmju secība. 1483 01:06:49,875 --> 01:06:52,220 Un pēc definīcijas katra rakstzīme ir viens baits. 1484 01:06:52,220 --> 01:06:55,130 Lai iegūtu nākamo baitu, varat pabakstīties apkārt un ievadīt s plus 1485 01:06:55,130 --> 01:06:58,040 1, lai iegūtu trešo baitu, s plus 2. 1486 01:06:58,040 --> 01:07:00,764 Tomēr, ja mēs nenodarbojamies ar virknēm, pieņemsim, ka mums ir 1487 01:07:00,764 --> 01:07:03,488 darīšana ar veseliem skaitļiem, kas atrodas masīvā viens pēc otra, ja 1488 01:07:03,488 --> 01:07:06,212 vēlaties iegūt nākamo veselo skaitli, jūs joprojām varētu pievienot 1489 01:07:06,212 --> 01:07:08,936 plus 1 vai plus 2, lai nonāktu pie nākamā vai nākamā, nākamā veselā 1490 01:07:08,936 --> 01:07:11,660 skaitļa. 1491 01:07:11,660 --> 01:07:16,310 Jūs neiebrauktus nezālēs, ievadot plus 4 un pēc tam plus 8. 1492 01:07:16,310 --> 01:07:19,460 Jums nav jāzina vai jārūpējas par to, cik lieli datu tipi ir datorā. 1493 01:07:19,460 --> 01:07:21,285 C un kompilators to noskaidros jūsu vietā, pamatojoties uz attiecīgo 1494 01:07:21,285 --> 01:07:23,110 datu tipu. 1495 01:07:23,110 --> 01:07:25,310 Tāpēc paturiet to prātā, ja kādreiz to darāt, izmantojot citu datu 1496 01:07:25,310 --> 01:07:27,510 tipu, nevis rakstzīmes. 1497 01:07:27,510 --> 01:07:31,850 Labi, ļaujiet man atvērt failu, kuru lielāko daļu uzrakstīju iepriekš. 1498 01:07:31,850 --> 01:07:34,380 Un ļaujiet man paslēpt savu termināļa logu un parādīt jums to. 1499 01:07:34,380 --> 01:07:36,790 Tātad šeit ir programma compare.c, kuras dzīves mērķis ir salīdzināt 1500 01:07:36,790 --> 01:07:39,200 divas virknes. 1501 01:07:39,200 --> 01:07:41,032 Es atkal izmantoju CS50 bibliotēku. 1502 01:07:41,032 --> 01:07:43,331 Tā kā vismaz šobrīd un, iespējams, vēl dažas nedēļas, ir daudz 1503 01:07:43,331 --> 01:07:45,630 vieglāk iegūt informāciju no lietotāja, izmantojot CS50 funkciju, get 1504 01:07:45,630 --> 01:07:47,930 int. 1505 01:07:47,930 --> 01:07:51,480 Bet mēs šodienu noslēgsim, noņemot arī šos palīgritenīšus. 1506 01:07:51,480 --> 01:07:53,380 Tātad jūs varat redzēt, kā faktiski var iegūt lietotāja ievadi, 1507 01:07:53,380 --> 01:07:55,280 neizmantojot neko īpašu CS50. 1508 01:07:55,280 --> 01:07:57,890 Tātad sestā un septītā rinda, diezgan garlaicīgas. 1509 01:07:57,890 --> 01:07:58,820 Pirmās nedēļas lietas. 1510 01:07:58,820 --> 01:08:01,265 Iegūstiet int ar nosaukumu i, iegūstiet int ar nosaukumu j un 1511 01:08:01,265 --> 01:08:03,710 saglabājiet tos divos mainīgajos, attiecīgi i un j. 1512 01:08:03,710 --> 01:08:06,035 Ja i ir vienāds ar j, izdrukājiet to pašu, pretējā gadījumā 1513 01:08:06,035 --> 01:08:08,360 izdrukājiet, ka tie atšķiras. 1514 01:08:08,360 --> 01:08:10,055 Ļaujiet man tikai piebilst laika labad, esmu diezgan pārliecināts, ka 1515 01:08:10,055 --> 01:08:11,750 šis kods ir pareizs. 1516 01:08:11,750 --> 01:08:13,550 Tas iegūs divus veselus skaitļus no cilvēka. 1517 01:08:13,550 --> 01:08:15,500 Tas tos salīdzinās un pareizi pateiks, vai tie ir vienādi vai 1518 01:08:15,500 --> 01:08:17,450 atšķirīgi. 1519 01:08:17,450 --> 01:08:20,315 Un es pierādīšu tikpat daudz, palaižot make, compare, dot, slash, 1520 01:08:20,315 --> 01:08:23,180 compare. 1521 01:08:23,180 --> 01:08:25,910 Un es ierakstīšu 50 i, 50 j. 1522 01:08:25,910 --> 01:08:27,029 Un tie ir vienādi. 1523 01:08:27,029 --> 01:08:30,859 Un tagad es ievadīšu, kā būtu ar 50, un teiksim 13. 1524 01:08:30,859 --> 01:08:31,920 Un tie ir dažādi. 1525 01:08:31,920 --> 01:08:34,189 Tāpēc ļaujiet man tikai norādīt, ka šis kods patiešām ir pareizs. 1526 01:08:34,189 --> 01:08:37,370 Būtu strādājis pirmajā nedēļā, strādā arī tagad ceturtajā nedēļā. 1527 01:08:37,370 --> 01:08:40,495 Bet tagad ļaujiet man to mainīt, lai salīdzinātu nevis divus veselus 1528 01:08:40,495 --> 01:08:43,620 skaitļus, bet, kā jau minēju, varbūt divas virknes. 1529 01:08:43,620 --> 01:08:47,920 Ļaujiet man iet uz priekšu un mainīt šo koda rindiņu uz varbūt virkne 1530 01:08:47,920 --> 01:08:52,220 s, vienāds ar, get string, prasot lietotājam s. 1531 01:08:52,220 --> 01:08:54,680 Tad mainīsim šo otro rindiņu uz virkni t, lai mainīgo nosaukumi 1532 01:08:54,680 --> 01:08:57,140 pagaidām būtu īsi. 1533 01:08:57,140 --> 01:09:00,680 Un t ir laba izvēle pēc s kaut kam šādam. 1534 01:09:00,680 --> 01:09:02,960 Get string, uzvediniet cilvēku uz t. 1535 01:09:02,960 --> 01:09:05,705 Un tad mainīsim šeit savus i un j, lai darītu nepareizi, saskaņā ar 1536 01:09:05,705 --> 01:09:08,450 iepriekšējiem minējumiem intuīciju. 1537 01:09:08,450 --> 01:09:10,924 Ja s ir vienāds ar t, tad izdrukājiet to pašu, pretējā gadījumā 1538 01:09:10,924 --> 01:09:13,399 izdrukājiet, ka tie atšķiras. 1539 01:09:13,399 --> 01:09:16,274 Tagad, ja gribētu, es varētu noņemt vismaz dažus palīgritenīšus. 1540 01:09:16,274 --> 01:09:19,430 Es varētu to mainīt uz char star. 1541 01:09:19,430 --> 01:09:20,055 Abi ir labi. 1542 01:09:20,055 --> 01:09:22,346 Tomēr man joprojām ir nepieciešama CS50 bibliotēka, jo es izmantoju 1543 01:09:22,346 --> 01:09:24,638 get string, jo faktiski ir grūti iegūt virknes manuāli, neizmantojot 1544 01:09:24,638 --> 01:09:26,930 bibliotēku, kā mēs šodien redzēsim. 1545 01:09:26,930 --> 01:09:30,470 Bet es to paturēšu, izmantojot virkni tikai tagad ar bibliotēku. 1546 01:09:30,470 --> 01:09:33,890 Labi, make compare vēlreiz, dot, slash, compare. 1547 01:09:33,890 --> 01:09:37,055 Un tagad ļaujiet man iet uz priekšu un ierakstīt, piemēram, hi, 1548 01:09:37,055 --> 01:09:40,220 izsaukuma zīme, Enter, un hi, izsaukuma zīme, Enter. 1549 01:09:40,220 --> 01:09:42,640 Un ak, viņi ir atšķirīgi. 1550 01:09:42,640 --> 01:09:44,390 Labi, tie acīmredzami nav vizuāli. 1551 01:09:44,390 --> 01:09:45,765 Bet tie atrodas zem pārsega. 1552 01:09:45,765 --> 01:09:49,957 Un jums, iespējams, jau ir minējumipar to, bet tas, kas notiek zem 1553 01:09:49,957 --> 01:09:54,149 pārsega, ir kas tāds, ka mēs nejauši salīdzinām abas atmiņas adreses. 1554 01:09:54,149 --> 01:09:55,400 Tātad patiesībā iesim tur. 1555 01:09:55,400 --> 01:09:56,848 Padomāsim par atmiņu. 1556 01:09:56,848 --> 01:09:58,244 Un ļaujiet man tagad attālināt, lai man būtu vairāk baitu, ar kuriem 1557 01:09:58,244 --> 01:09:59,640 spēlēties. 1558 01:09:59,640 --> 01:10:01,330 Tātad kvadrāti ir nedaudz mazāki nekā iepriekš, lai mēs tajos varētu 1559 01:10:01,330 --> 01:10:03,020 ievietot vairāk. 1560 01:10:03,020 --> 01:10:06,350 Un ļaujiet man ierosināt, ka tad, kad es deklarēju s tajā, kas pirms 1561 01:10:06,350 --> 01:10:09,680 brīža bija sestā rinda, diskusijas labad tas nonāk atmiņā kaut kur, 1562 01:10:09,680 --> 01:10:13,010 piemēram, mana attēla augšējā kreisajā stūrī? 1563 01:10:13,010 --> 01:10:17,003 Un, kad es izpildu to pašu koda rindiņu un tiek izsaukts get string, 1564 01:10:17,003 --> 01:10:20,996 un es ierakstu hi, izsaukuma zīme, mēs zinām no pirmās nedēļas, ka 1565 01:10:20,996 --> 01:10:24,990 get stringievieto to kaut kur datora atmiņā. 1566 01:10:24,990 --> 01:10:28,580 Un es ierosināšu, ka tas atrodas ekrāna apakšējā kreisajā stūrī. 1567 01:10:28,580 --> 01:10:29,970 Kas notiek pēc tam? 1568 01:10:29,970 --> 01:10:33,416 Nu, es zinu, lai gan man ir vienalga, ka H, I, izsaukuma zīme un NUL 1569 01:10:33,416 --> 01:10:36,863 rakstzīme pastāv kādā adresē, piemēram, 0x123, 124, 125, 126 1570 01:10:36,863 --> 01:10:40,310 diskusijas labad. 1571 01:10:40,310 --> 01:10:41,480 Un kas ir s? 1572 01:10:41,480 --> 01:10:44,600 Tāpat kā pirms pārtraukuma, 0x123. 1573 01:10:44,600 --> 01:10:47,885 Tas ir viss, kas atkal notiek sestajā rindā, kas ir gandrīz tāds pats 1574 01:10:47,885 --> 01:10:51,170 kā tad, kad mēs izpildījām get s iepriekš. 1575 01:10:51,170 --> 01:10:54,000 Bet ievērojiet tagad ar septīto rindiņu, kad es saņemu otru mainīgo, 1576 01:10:54,000 --> 01:10:56,830 ko sauc par t, un es vēlreiz izsaucu get string. 1577 01:10:56,830 --> 01:10:59,980 Un nejaušības dēļ es kā cilvēks rakstu to pašu. 1578 01:10:59,980 --> 01:11:02,530 Nu, kas šeit notiek? 1579 01:10:59,980 --> 01:11:04,120 t iegūst savu atmiņas daļu, iespējams, augšējā labajā stūrī. 1580 01:11:04,120 --> 01:11:07,643 Otrā hi versija paliek atmiņā kaut kur citur. 1581 01:11:07,643 --> 01:11:10,060 Dators varētu būt gudrs un pamanīt, ka tas ir tas pats. 1582 01:11:10,060 --> 01:11:11,970 Bet C parasti to nedara jūsu vietā. 1583 01:11:11,970 --> 01:11:13,720 Tas vienkārši iespiež to kaut kur citur atmiņā. 1584 01:11:13,720 --> 01:11:16,296 Un varbūt tas atrodas adresē 0x456, 457, 458, 459 vai jebkurā citā 1585 01:11:16,296 --> 01:11:18,873 vietā. 1586 01:11:18,873 --> 01:11:21,040 Bet jūs, iespējams, jau varat redzēt, kur šis iet. 1587 01:11:21,040 --> 01:11:23,770 t tagad, protams, satur šī pirmā baita adresi. 1588 01:11:23,770 --> 01:11:27,567 Un tāpēc manā kodā, devītajā rindā, kad es salīdzinu vai s un t ir 1589 01:11:27,567 --> 01:11:31,365 vienādi, pietiek pateikt, ka tie nav vienādi, jo virknes ir 1590 01:11:31,365 --> 01:11:35,162 izkārtotas datora atmiņā, tās tiešām izskatās vienādi, tās pašas 1591 01:11:35,162 --> 01:11:38,960 vērtības ir tur. 1592 01:11:38,960 --> 01:11:42,125 Bet, ja mēs abstrahējamies tālāk, jūs patiešām varat redzēt, ka s un 1593 01:11:42,125 --> 01:11:45,290 t nav viens un tas pats. 1594 01:11:45,290 --> 01:11:46,870 Un kā mēs to labojām? 1595 01:11:46,870 --> 01:11:49,210 Vai tiešām, kā mēs pagājušajā nedēļā izvairījāmies no tā, neatklājot 1596 01:11:49,210 --> 01:11:51,550 noslēpumu un nebeidzami nepaskaidrojot, kāpēc jums ir jāizmanto STR 1597 01:11:51,550 --> 01:11:53,890 salīdzināšana? 1598 01:11:53,890 --> 01:11:57,760 Nu, ja es atgriezīšos pie sava koda šeit, darīsim to tagad pareizi. 1599 01:11:57,760 --> 01:12:01,120 Ļaujiet man iet uz priekšu un iekļaut koda rindiņu, kurā ir norādīts 1600 01:12:01,120 --> 01:12:04,480 s, komats, t virknes salīdzinājums, abi kā ievades dati. 1601 01:12:04,480 --> 01:12:07,260 Un tad, ja atceraties, ko STR salīdzina - atgriež, ja divas virknes 1602 01:12:07,260 --> 01:12:10,040 ir vienādas? 1603 01:12:10,040 --> 01:12:11,625 Ir trīs iespējamās atgriešanas vērtības. 1604 01:12:11,625 --> 01:12:12,500 Auditorija: [NESAKLAUSĀMS] 1605 01:12:12,500 --> 01:12:13,500 DEIVIDS Dž. Meilans: Tātad nulle. 1606 01:12:13,500 --> 01:12:15,310 Tātad viens ir paredzēts, ja tas ir alfabēta vai ASCIIabētiskā secībā 1607 01:12:15,310 --> 01:12:17,120 pirmais vai otrais. 1608 01:12:17,120 --> 01:12:18,700 Bet pagaidām es gribu tikai nulli. 1609 01:12:18,700 --> 01:12:22,450 Ja es vēlos izmantot STR compare, man ir nepieciešams string.h. 1610 01:12:22,450 --> 01:12:24,130 Tātad string.h pastāv. 1611 01:12:24,130 --> 01:12:25,390 Tā nav CS50 lieta. 1612 01:12:25,390 --> 01:12:28,000 Nav atslēgvārdu virknes kā datu veida. 1613 01:12:28,000 --> 01:12:29,080 Tā ir CS50 lieta. 1614 01:12:29,080 --> 01:12:30,620 Bet string.h pastāv. 1615 01:12:30,620 --> 01:12:33,807 Tāpēc es domāju, ka tagad ar šīm izmaiņām 10. rindiņā, ja es izpildu 1616 01:12:33,807 --> 01:12:36,995 make compare un dot, slash, compare un pēc tam palaižu vēlreiz, 1617 01:12:36,995 --> 01:12:40,182 ierakstu vēlreiz, hi, izsaukuma zīme, es domāju, ka tagad tie ir 1618 01:12:40,182 --> 01:12:43,370 vienādi. 1619 01:12:43,370 --> 01:12:46,905 Un tikai kā otro pārbaudu, HI ar visiem lielajiem burtiem, varbūt hi 1620 01:12:46,905 --> 01:12:50,440 ar mazajiem burtiem, tie patiesībā ir atšķirīgi. 1621 01:12:50,440 --> 01:12:51,110 Kāpēc? 1622 01:12:51,110 --> 01:12:55,116 Nu, STR salīdzinājums, ko pirms vairākiem gadu desmitiem uzrakstīja 1623 01:12:55,116 --> 01:12:59,122 daži citi cilvēki, ir pietiekami gudrs, lai zinātu, ka tam ir jāiet 1624 01:12:59,122 --> 01:13:03,128 uz s un jāiet uz t, jāsāk salīdzināt tos no kreisās uz labo, 1625 01:13:03,128 --> 01:13:07,134 pārtraucot, kad tas sasniedz vienu vai abas NUL rakstzīmes, un 1626 01:13:07,134 --> 01:13:11,140 atgriež nulli tikai tad, ja s un t viss ir tieši vienāds. 1627 01:13:11,140 --> 01:13:15,580 Vai šeit ir kādi jautājumi par šo? 1628 01:13:15,580 --> 01:13:18,680 Vai ir kādi jautājumi par to, kāpēc mēs izmantojam STR compare? 1629 01:13:18,680 --> 01:13:19,180 Labi. 1630 01:13:19,180 --> 01:13:20,530 Ja nē - jā, ak. 1631 01:13:20,530 --> 01:13:22,120 Pa vidu. 1632 01:13:22,120 --> 01:13:24,270 AUDITORIJA: Kāpēc tiek rādīti veseli skaitļi? 1633 01:13:24,270 --> 01:13:25,437 Kāpēc [NESAKLAUSĀMS]? 1634 01:13:25,437 --> 01:13:26,270 DEIVIDS Dž. Meilāns: Jā. 1635 01:13:26,270 --> 01:13:28,610 Tātad, kāpēc - kāpēc tas tā nav gadījumā ar veseliem skaitļiem? 1636 01:13:28,610 --> 01:13:30,760 Tātad izrādās, ka tas tā nav ar veseliem skaitļiem, ar peldošā 1637 01:13:30,760 --> 01:13:32,910 komata, ar loģiskās vērtības, ar dubultajiem, ar gariem veseliem 1638 01:13:32,910 --> 01:13:35,060 skaitļiem. 1639 01:13:35,060 --> 01:13:37,790 Burtiski visi citi datu tipi darbojas pareizi. 1640 01:13:37,790 --> 01:13:39,530 Virknes gan ir īpašas. 1641 01:13:39,530 --> 01:13:42,560 Tās ir pietiekami noderīgas programmēšanā jau vairākus gadu desmitus, 1642 01:13:42,560 --> 01:13:45,590 tāpēc printf un STR compare autori, kā arī daudzu citu funkciju 1643 01:13:45,590 --> 01:13:48,620 autori, šajā gadījumā strlen, tikai uzskata, ka virknes ir īpašas, jo 1644 01:13:48,620 --> 01:13:51,650 tās ir vienkārši noderīgas. 1645 01:13:51,650 --> 01:13:53,155 Mēs, cilvēki, mijiedarbojamies, izmantojot valodu, vai tā būtu angļu 1646 01:13:53,155 --> 01:13:54,660 valoda vai jebkas cits. 1647 01:13:54,660 --> 01:13:58,780 Un tāpēc ir vienkārši noderīgi, ja C valodā ir tikai sava veida 1648 01:13:58,780 --> 01:14:02,900 pirmās klases atbalsts šim cilvēka teksta virkņu jēdzienam. 1649 01:14:02,900 --> 01:14:05,330 Tātad īsā atbilde ir tikai tāpēc. 1650 01:14:05,330 --> 01:14:08,300 Tas vienkārši ir nepieciešams — virknes ir dažādas. 1651 01:14:08,300 --> 01:14:11,480 Tās ir ieviestas ar šo adresi un NUL rakstzīmi. 1652 01:14:11,480 --> 01:14:14,060 Viss pārējais tomēr ir tikai vērtība. 1653 01:14:14,060 --> 01:14:15,680 Bet virkne atkal ir baltie meli. 1654 01:14:15,680 --> 01:14:16,490 Tā ir adrese. 1655 01:14:16,490 --> 01:14:19,550 Tā nav lieta pati par sevi. 1656 01:14:19,550 --> 01:14:20,180 Labs jautājums. 1657 01:14:20,180 --> 01:14:21,020 Jā, priekšā. 1658 01:14:21,020 --> 01:14:23,333 AUDITORIJA: Kā tas nākas [NESAKLAUSĀMS]? 1659 01:14:23,333 --> 01:14:25,000 DEIVIDS Dž. Meilans: Ak, tiešām labs jautājums. 1660 01:14:25,000 --> 01:14:30,310 Tātad manā kodā šeit, VS Code, kā būtu, ja es darītu šādi? 1661 01:14:30,310 --> 01:14:34,685 STR compare vietā un s ir vienāds ar, vienāds ar t vietā, kā būtu, ja 1662 01:14:34,685 --> 01:14:39,060 es sāktu spēlēties, izmantojot zvaigznīti s un zvaigznīti t? 1663 01:14:39,060 --> 01:14:41,020 Tiešām interesants gadījums, kas jāapsver. 1664 01:14:41,020 --> 01:14:43,330 Šeit atgriezīsimies pie sava veida deduktīvās loģikas. 1665 01:14:43,330 --> 01:14:46,720 Tātad zvaigznīte, šodienas zvaigznītes operators, nozīmē doties tur. 1666 01:14:46,720 --> 01:14:50,285 Tātad, kad es vienu reizi esmu ierakstījis HI un pēc tam vēlreiz HI, 1667 01:14:50,285 --> 01:14:53,850 piemēram, abus lielos burtus, kas ir adresē s burtiski? 1668 01:14:53,850 --> 01:14:56,410 Kāds cits. 1669 01:14:56,410 --> 01:14:57,640 Kas atrodas adresē s? 1670 01:14:57,640 --> 01:14:59,080 Jā. 1671 01:14:59,080 --> 01:15:00,100 Tātad ne gluži. 1672 01:15:00,100 --> 01:15:01,645 Adresē. 1673 01:15:01,645 --> 01:15:02,830 Tātad nē, kāda ir adrese? 1674 01:15:02,830 --> 01:15:04,535 Kas atrodas adresē 0x123? 1675 01:15:04,535 --> 01:15:05,410 Auditorija: [NESAKLAUSĀMSi] 1676 01:15:05,410 --> 01:15:06,340 DEIVIDS Dž. Meilans: h. 1677 01:15:06,340 --> 01:15:08,590 Un kas atrodas adresē 0x456? 1678 01:15:08,590 --> 01:15:09,550 Auditorija: [NESAKLAUSĀMS] 1679 01:15:09,550 --> 01:15:10,690 DEIVIDS Dž. Meilans: h arī. 1680 01:15:10,690 --> 01:15:12,850 Un šeit jūs krāpjaties. 1681 01:15:12,850 --> 01:15:17,800 Jūs salīdzināt abu virkņu pirmo rakstzīmi, bet ne katru otro. 1682 01:15:17,800 --> 01:15:19,570 Tagad jūs varētu būt patiešām pedantiski. 1683 01:15:19,570 --> 01:15:22,510 Un šeit atkal tas nav piemērots koda lietojums. 1684 01:15:22,510 --> 01:15:23,600 Bet jūs varētu izdarīt šādi. 1685 01:15:23,600 --> 01:15:26,480 Ja tā, un kā ar šo neprātu? 1686 01:15:26,480 --> 01:15:32,140 Tātad zvaigznīte s plus 1 ir vienāda ar zvaigznīti t plus 1. 1687 01:15:32,140 --> 01:15:34,420 Un jūs varat to izdarīt katrai rakstzīmei manuāli. 1688 01:15:34,420 --> 01:15:35,960 Bet tāpēc pastāv STR compare. 1689 01:15:35,960 --> 01:15:37,130 Tas to visu dara jūsu vietā. 1690 01:15:37,130 --> 01:15:37,798 Bet tāpēc. 1691 01:15:37,798 --> 01:15:38,840 Un tā ir intuīcija. 1692 01:15:38,840 --> 01:15:41,556 Tāpēc es arī jūs iedrošinātu, jebkurā laikā, kad notiek kaut kas 1693 01:15:41,556 --> 01:15:44,273 dīvains, es saprotu, ka mēs tagad varam nedaudz zaudēt uzticamību, 1694 01:15:44,273 --> 01:15:46,990 mēs neesam jums stāstījuši tik daudz balto melu. 1695 01:15:46,990 --> 01:15:50,270 Tātad lielāko daļu visa, ko esam redzējuši C līdz šim, var izskaidrot 1696 01:15:50,270 --> 01:15:53,550 gandrīz visu līdz šim notikušo uzvedību, sākot no pirmās nedēļas un 1697 01:15:53,550 --> 01:15:56,830 turpmāk. 1698 01:15:53,350 --> 01:15:56,830 Tāpēc ļaujiet to novirzīt atpakaļ pareizajā virzienā. 1699 01:15:56,830 --> 01:15:59,219 Ja s STR compare s un tvienāds ar, vienāds ar nulli, šī tagad ir 1700 01:15:59,219 --> 01:16:01,608 pareizā koda versija. 1701 01:16:01,608 --> 01:16:03,400 Un tagad šeit atkal ir vieta, kur jūs varat spēlēties. 1702 01:16:03,400 --> 01:16:04,250 Tāpēc ļaujiet man izdarīt šādi. 1703 01:16:04,250 --> 01:16:07,690 Ļaujiet man notīrīt termināļa logu, lai sakārtotu lietas. 1704 01:16:07,690 --> 01:16:09,670 Ļaujiet man atbrīvoties no visām šīm salīdzināšanas lietām. 1705 01:16:09,670 --> 01:16:12,795 Un paskatīsimies, kas notiek,jūs esat laipni aicināti savā kodā. 1706 01:16:12,795 --> 01:16:15,822 Izdrukāsim, piemēram, kā tas varētu būt pirmajā nedēļā, pašu s 1707 01:16:15,822 --> 01:16:18,850 vērtību jaunā rindā, komats s. 1708 01:16:18,850 --> 01:16:20,880 Un tad vienkārši izdrukāsim t, lai pārliecinātos, ka tas kompilējas 1709 01:16:20,880 --> 01:16:22,910 un es nedaru neko nepareizu. 1710 01:16:22,910 --> 01:16:24,785 Bet tas nebūs tik interesanti. 1711 01:16:24,785 --> 01:16:27,052 Un, atklāti sakot, man vairs nevajag string.h, jo es neizmantoju STR 1712 01:16:27,052 --> 01:16:29,320 compare. 1713 01:16:29,320 --> 01:16:32,305 Tāpēc izveidojiet adreses ar dot, slash, addresses.Te ir mans–ui, 1714 01:16:32,305 --> 01:16:35,290 atvainojiet. 1715 01:16:35,290 --> 01:16:36,430 Tas ir jautri. 1716 01:16:36,430 --> 01:16:39,130 Nevis %t, šeit arī %s. 1717 01:16:39,130 --> 01:16:39,797 Ignorējiet to. 1718 01:16:39,797 --> 01:16:40,630 Darīsim šādi vēlreiz. 1719 01:16:40,630 --> 01:16:43,720 Izveidojiet - ak, un tā ir nepareizā programma. 1720 01:16:43,720 --> 01:16:47,770 Dot, slash — izpildīsim make, compare, dot, slash, compare. 1721 01:16:47,770 --> 01:16:49,990 Un ierakstīsim vēlreiz hi un vēlreiz hi. 1722 01:16:49,990 --> 01:16:51,490 Un tagad mēs tikai redzam divas virknes. 1723 01:16:51,490 --> 01:16:52,360 Es nesalīdzinu. 1724 01:16:52,360 --> 01:16:54,160 Bet tagad mēs varam paspēlēties. 1725 01:16:54,160 --> 01:17:01,960 Tā vietā, lai izdrukātu %s, kas izdrukā virkni, kā izdrukāt adresi s? 1726 01:17:01,960 --> 01:17:04,240 Man tikai jāveic nelielas izmaiņas. 1727 01:17:04,240 --> 01:17:07,298 Ja es gribu redzēt nevis to, kas atrodas s, bet es gribu redzēt s, 1728 01:17:07,298 --> 01:17:10,356 adresi... Jā. 1729 01:17:10,356 --> 01:17:13,050 AUDITORIJA: mainīt %s uz %p? 1730 01:17:13,050 --> 01:17:14,050 DEIVIDS Dž. Meilans: Perfekti. 1731 01:17:14,050 --> 01:17:17,500 Tāpēc mainiet %s abās vietās šeit uz %p. 1732 01:17:17,500 --> 01:17:20,522 Tāpēc tagad printf to uztvers burtiski kā adresi. 1733 01:17:20,522 --> 01:17:24,522 Tas netiks darīts ar cilpu no kreisās uz labo, meklējot NUL rakstzīmi. 1734 01:17:24,522 --> 01:17:26,140 Tas tikai gatavojas izdrukāt s un t. 1735 01:17:26,140 --> 01:17:29,170 Ļaujiet man notīrīt savu termināli, palaist make compare, oi. 1736 01:17:29,170 --> 01:17:31,450 Palaidīsim make, compare, dot, slash, compare. 1737 01:17:31,450 --> 01:17:32,050 Enter. 1738 01:17:32,050 --> 01:17:34,100 Ierakstiet hi, ierakstiet vēlreiz hi. 1739 01:17:34,100 --> 01:17:37,618 Un tagad jūs redzat, ak, tas ir interesanti. 1740 01:17:37,618 --> 01:17:39,784 Tas nav tik vienkārši kā citas vērtības, kas bija nelielas — 1 baita 1741 01:17:39,784 --> 01:17:41,950 attālumā. 1742 01:17:41,950 --> 01:17:43,220 Tie ir gandrīz vienādi. 1743 01:17:43,220 --> 01:17:44,950 Bet šis beidzas ar b0. 1744 01:17:44,950 --> 01:17:46,540 Šis beidzas ar f0. 1745 01:17:46,540 --> 01:17:48,985 Tātad tie patiešām ir atdalīti ar noteiktu baitu skaitu, nevis tikai 1746 01:17:48,985 --> 01:17:51,430 vienu, bet dažiem. 1747 01:17:51,430 --> 01:17:54,000 Jo šīs virknes patiešām ir garākas. 1748 01:17:54,000 --> 01:17:54,500 Labi. 1749 01:17:54,500 --> 01:17:57,375 Tātad, ja jūs to redzējāt šeit, kā mēs tagad varam to izmantot citu 1750 01:17:57,375 --> 01:18:00,250 problēmu risināšanai? 1751 01:18:00,250 --> 01:18:01,880 Ļaujiet man ierosināt darīt šādi. 1752 01:18:01,880 --> 01:18:05,770 Ļaujiet man pietuvināt šeit, ļaujiet man kārtīgi salīdzināt. 1753 01:18:05,770 --> 01:18:07,960 Un ļaujiet man atvērt citu programmu, kuras daļu es uzrakstīju 1754 01:18:07,960 --> 01:18:10,150 iepriekš, ko sauc par copy.c. 1755 01:18:10,150 --> 01:18:14,230 Tātad copy.c teorētiski veido virknes kopiju. 1756 01:18:14,230 --> 01:18:14,920 Kā? 1757 01:18:14,920 --> 01:18:17,920 Astotajā rindā es daru to pašu, ko iepriekš. 1758 01:18:17,920 --> 01:18:20,140 Get string, saglabājiet to virknē vai zvaigznītē un pieprasiet to 1759 01:18:20,140 --> 01:18:22,360 lietotājam. 1760 01:18:22,360 --> 01:18:24,980 Tad es neprasu vēlreiz saņemt virkni. 1761 01:18:24,980 --> 01:18:27,795 Es vienkārši izveidoju kopiju, vienkārši izmantojot 10. rindu, virkne 1762 01:18:27,795 --> 01:18:30,610 t ir vienāda ar s. 1763 01:18:30,610 --> 01:18:33,820 Tagad intuitīvi domāju, ka šādi es kopētu mainīgo. 1764 01:18:33,820 --> 01:18:37,090 Tādā veidā mēs līdz šim katru nedēļu esam kopējuši mainīgos C valodā. 1765 01:18:37,090 --> 01:18:39,160 Taču kaut kas noies greizi. 1766 01:18:39,160 --> 01:18:41,815 Vai 12. rindā angļu valodā kāds vēlas paskaidrot, ko, jūsuprāt, dara 1767 01:18:41,815 --> 01:18:44,470 12. rinda? 1768 01:18:44,470 --> 01:18:46,450 Neuztraucieties par kļūdu vai kļūmju atrašanu. 1769 01:18:46,450 --> 01:18:50,265 Bet ko, šķiet, dara 12. rindiņa, izmantojot divus augšējos, kas ir 1770 01:18:50,265 --> 01:18:54,080 pateicoties C tipa bibliotēkai, kurai esmu iekļāvis galvenes failu? 1771 01:18:54,080 --> 01:18:54,580 Jā. 1772 01:18:54,580 --> 01:18:56,593 Auditorija: [NESAKLAUSĀMS] 1773 01:18:56,593 --> 01:18:57,760 DEIVIDS Dž. Meilans: Jā, vai ne? 1774 01:18:57,760 --> 01:18:59,350 Tā ir tāda kā neglīta sintakse. 1775 01:18:59,350 --> 01:19:04,880 Taču šķiet, ka tas nozīmē t pirmo burtu nomaina uz lielo burtu. 1776 01:19:04,880 --> 01:19:07,720 Tāpēc šeit ir t kvadrātiekava 0, jo mēs vēlamies saglabāt izmaiņas. 1777 01:19:07,720 --> 01:19:10,430 Un mēs pārejam pie diviem augšējiem, pirmā rakstzīme šeit. 1778 01:19:10,430 --> 01:19:12,460 Tā mēs agrāk darījām ar lielajiem burtiem. 1779 01:19:12,460 --> 01:19:16,930 Un tagad es izdrukāju attiecīgi s un t, izmantojot %s. 1780 01:19:16,930 --> 01:19:18,460 Tāpēc šķiet, ka tam vajadzētu darboties. 1781 01:19:18,460 --> 01:19:21,790 Es nokopēju s un saglabāju to t 10. rindā. 1782 01:19:21,790 --> 01:19:25,450 Un tad es mainu t un tikai t 12. rindā. 1783 01:19:25,450 --> 01:19:29,155 Bet, ja līdz šim jūtaties droši, jūs, iespējams, varat redzēt, uz 1784 01:19:29,155 --> 01:19:32,860 kurieni tas iet, ja es ievadu make, copy, dot, slash, copy. 1785 01:19:32,860 --> 01:19:35,040 Un ļaujiet man šoreiz tikai vienu reizi ierakstīt hi, izsaukuma zīme 1786 01:19:35,040 --> 01:19:37,220 ar mazajiem burtiem. 1787 01:19:37,220 --> 01:19:38,410 Tagad es nospiedīšu Enter. 1788 01:19:38,410 --> 01:19:43,510 Un skatieties, ko mēs redzam s un t vērtībai. 1789 01:19:43,510 --> 01:19:48,640 Šķiet, kāda ir jaunā s un t vērtība manas programmas beigās? 1790 01:19:48,640 --> 01:19:52,030 Šķiet, ka tāda pati. 1791 01:19:52,030 --> 01:19:54,165 Hi ir abas reizes ar lielo burtu. 1792 01:19:54,165 --> 01:19:56,620 Kāda tad ir nojauta? 1793 01:19:56,620 --> 01:20:00,100 Kāpēc tas tikko notika? 1794 01:20:00,100 --> 01:20:01,030 Jā, aizmugurē. 1795 01:20:01,030 --> 01:20:02,582 Auditorija: [NESAKLAUSĀMS] 1796 01:20:02,582 --> 01:20:03,936 DEIVIDS Dž. Meilans: Jā, es piešķīru s un t vienu un to pašu atmiņas 1797 01:20:03,936 --> 01:20:05,290 adresi. 1798 01:20:05,290 --> 01:20:07,590 Tātad tas pārkopēja s uz t. 1799 01:20:07,590 --> 01:20:09,540 Bet C to uztver ļoti burtiski. 1800 01:20:09,540 --> 01:20:10,073 Kas ir s? 1801 01:20:10,073 --> 01:20:10,740 Tā ir adrese. 1802 01:20:10,740 --> 01:20:11,280 Kas ir t? 1803 01:20:11,280 --> 01:20:12,790 Tā ir šīs adreses kopija. 1804 01:20:12,790 --> 01:20:15,485 Ja vēlaties kopēt visu virkni, kā to sagaida parasts cilvēks, jums 1805 01:20:15,485 --> 01:20:18,180 vai kādam ir jādara daudz vairāk. 1806 01:20:18,180 --> 01:20:21,285 Jums ir jāiet uz šo adresi, jānokopē šī rakstzīme, šī, šī, šī un 1807 01:20:21,285 --> 01:20:24,390 jāpārkopē uz jaunu vietu un atmiņu. 1808 01:20:24,390 --> 01:20:26,745 Tas nenotiek automātiski šeit jums C. 1809 01:20:26,745 --> 01:20:28,702 Tas notiek dažās citās valodās, tie no jums, kuri ir programmējuši 1810 01:20:28,702 --> 01:20:30,660 noteiktās augstāka līmeņa valodās. 1811 01:20:30,660 --> 01:20:32,090 Tas darbojas tieši tā, kā jūs varētu cerēt. 1812 01:20:32,090 --> 01:20:33,805 Un tā ir viena no Python un citu valodu priekšrocībām, ko mēs drīz 1813 01:20:33,805 --> 01:20:35,520 redzēsim. 1814 01:20:35,520 --> 01:20:38,880 Bet pagaidām tas burtiski tiek vērtēts pēc nominālvērtības. 1815 01:20:38,880 --> 01:20:40,800 Kopējiet adresi šajā adresē. 1816 01:20:40,800 --> 01:20:43,380 Un es to darīšu skaidrāk, atbrīvojoties no virknes atslēgvārda, kas 1817 01:20:43,380 --> 01:20:45,960 atkal ir tikai typedef. 1818 01:20:45,960 --> 01:20:49,570 Tehniski šī šeit ir adrese. 1819 01:20:49,570 --> 01:20:52,660 Tātad tas, kas tiek kopēts, ir šīs adreses vērtība, nevis visas 1820 01:20:52,660 --> 01:20:55,750 rakstzīmes, kas tai varētu arī sekot. 1821 01:20:55,750 --> 01:20:58,530 Tāpēc man vajadzētu arī šeit veikt vienu piezīmi. 1822 01:20:58,530 --> 01:21:01,800 Es sākšu arvien vairāk mēģināt pierast izvairīties no segmentācijas 1823 01:21:01,800 --> 01:21:05,070 kļūmēm, jo šeit lietas var noiet greizi. 1824 01:21:05,070 --> 01:21:09,667 Piemēram, iepriekš 12. rindā es akli, naivi, bīstami pieņēmu, ka s 1825 01:21:09,667 --> 01:21:14,265 vai t būs vismaz viena rakstzīme. 1826 01:21:14,265 --> 01:21:15,390 Tā varētu nebūt. 1827 01:21:15,390 --> 01:21:16,890 Ja lietotājs vienkārši nospiež taustiņu Enter, nav burtu, kurus 1828 01:21:16,890 --> 01:21:18,390 jārakstaar lielajiem burtiem. 1829 01:21:18,390 --> 01:21:21,720 Un tāpēc tas ir neapdomīgi no manis un teorētiski var radīt seg kļūmi. 1830 01:21:21,720 --> 01:21:23,615 Tāpēc man droši vien jāsāk būt gudrākam un jāpasaka kaut kas līdzīgs 1831 01:21:23,615 --> 01:21:25,510 šim. 1832 01:21:25,510 --> 01:21:28,910 Ja t garums ir lielāks par nulli, labi, tagad var droši rakstīt pirmo 1833 01:21:28,910 --> 01:21:32,310 burtu ar lielo burtu. 1834 01:21:32,310 --> 01:21:36,180 Un tas samazinās šo segmentācijas kļūmju iespējamību, vienkārši 1835 01:21:36,180 --> 01:21:40,050 neizdarot nekādus pieņēmumus par to, ko dara cilvēks. 1836 01:21:40,050 --> 01:21:44,630 Gandrīz vienmēr jūsu programmas avarēs, kad esat pieļāvis kļūdu, jā, 1837 01:21:44,630 --> 01:21:49,210 taču lietotājs sniedz ievadi, ko jūs pats negaidījāt. 1838 01:21:49,210 --> 01:21:51,060 Tātad, kā tas viss izskatās atmiņā? 1839 01:21:51,060 --> 01:21:53,135 Nu, atgriezīsimies pie lielā režģa, šoreiz koncentrējoties uz vērtību 1840 01:21:53,135 --> 01:21:55,210 kopēšanu. 1841 01:21:55,210 --> 01:21:56,040 Un darīsim šo. 1842 01:21:56,040 --> 01:22:01,110 Lūk, s šajā jaunajā programmā, kurā tikko deklarēts kā zvaigznīte. 1843 01:22:01,110 --> 01:22:04,560 Šeit, iespējams, datora atmiņā nonāca mans augstais mazais burts. 1844 01:22:04,560 --> 01:22:08,860 Tas, iespējams, ir 0x123, 124, 125, vienalga, kaut kas līdzīgs. 1845 01:22:08,860 --> 01:22:12,180 Un tas, protams, beidzas ar s kā vērtību. 1846 01:22:12,180 --> 01:22:14,520 Kad es deklarēju t, es saņemu otru mainīgo, ko sauc par t, tāpat kā 1847 01:22:14,520 --> 01:22:16,860 iepriekš. 1848 01:22:16,860 --> 01:22:21,330 Bet, kad es iekopēju s uz t, kas notiek? 1849 01:22:21,330 --> 01:22:24,150 Tas tiešām ir tikai burtiski 0x123. 1850 01:22:24,150 --> 01:22:27,060 Neatkarīgi no tā, kāda ir s vērtība, tagad ir arī t vērtība. 1851 01:22:27,060 --> 01:22:30,150 Un tāpēc, ja mēs to abstrahējam augstā līmenī, atbrīvojamies no 1852 01:22:30,150 --> 01:22:33,240 visiem šiem papildu laukumiem, tagad tas ir s un t. 1853 01:22:33,240 --> 01:22:35,655 Tās patiešām ir kopijas, bet viena otras kopijas, nevis pamatā esošo 1854 01:22:35,655 --> 01:22:38,070 rakstzīmju kopijas. 1855 01:22:38,070 --> 01:22:41,130 Un tāpēc, ja sekojat šīm bultiņām un mēģināt izdrukāt tās abas pēc 1856 01:22:41,130 --> 01:22:44,190 tam, kad viena vai otra ir rakstīta ar lielajiem burtiem, jūs diemžēl 1857 01:22:44,190 --> 01:22:47,250 beigās ar lielo burtu uzrakstīsiet ne tikai vienu no tiem — s, bet 1858 01:22:47,250 --> 01:22:50,310 gan abus — s un t. 1859 01:22:50,310 --> 01:22:52,830 Jo burtiski tā ir viena un tā pati adrese. 1860 01:22:52,830 --> 01:22:56,130 Vai ir kādi jautājumi par šo vizualizāciju? 1861 01:22:56,130 --> 01:22:56,730 Jā. 1862 01:22:56,730 --> 01:22:58,330 Auditorija: [NESAKLAUSĀMS] 1863 01:22:58,330 --> 01:22:59,580 DEIVIDS Dž. Meilans: Labs jautājums. 1864 01:22:59,580 --> 01:23:01,200 Vai šī ir atsauce? 1865 01:23:01,200 --> 01:23:07,170 Mēs neesam redzējuši šādu piemēru detalizēti. 1866 01:23:07,170 --> 01:23:09,102 Pašlaik jūs kopējot pēc vērtības. 1867 01:23:09,102 --> 01:23:10,560 Bet atsauces tiks izmantotas. 1868 01:23:10,560 --> 01:23:12,852 Un atgādiniet man, ja es vēl neesmu lietojis šo terminu. 1869 01:23:12,852 --> 01:23:17,370 Bet tā ir tikai lietu kopēšana, kas varēja beigties slikti, vērtība. 1870 01:23:17,370 --> 01:23:19,840 Citi jautājumi. 1871 01:23:19,840 --> 01:23:20,390 Nē? 1872 01:23:20,390 --> 01:23:23,175 Labi, tāpēc, paturot to prātā, kā mēs patiesībā varam pareizi kopēt 1873 01:23:23,175 --> 01:23:25,960 lietas? 1874 01:23:25,960 --> 01:23:27,150 Šim nolūkam mums faktiski ir nepieciešams vēl viens celtniecības 1875 01:23:27,150 --> 01:23:28,340 bloks. 1876 01:23:28,340 --> 01:23:30,080 Tāpēc šodien mēs jums piedāvājam divas funkcijas. 1877 01:23:30,080 --> 01:23:32,860 Viena no tām tiek saukta par malloc, viena tiek saukta par free. 1878 01:23:32,860 --> 01:23:34,885 Un tās visu laiku izmanto visas programmatūras, ko jūs un es 1879 01:23:34,885 --> 01:23:36,910 izmantojam savos Mac datoros, personālajos datoros un tālruņos 1880 01:23:36,910 --> 01:23:38,935 neatkarīgi no tā, vai tā ir rakstīta C valodā vai kādā līdzvērtīgā 1881 01:23:38,935 --> 01:23:40,960 citā valodā. 1882 01:23:40,960 --> 01:23:43,360 Malloc ir paredzēta atmiņas piešķiršanai. 1883 01:23:43,360 --> 01:23:46,440 Tā ir funkcija, kuru varat izmantot, lai operētājsistēmai, MacOS, 1884 01:23:46,440 --> 01:23:49,520 Linux, Windows, jebkurai citai pieprasītu noteiktu baitu skaitu, 1 1885 01:23:49,520 --> 01:23:52,600 baitu, 100 baitus, gigabaitu atmiņas. 1886 01:23:52,600 --> 01:23:55,750 Varat jau iepriekš lūgt malloc tik daudz atmiņas, cik vēlaties. 1887 01:23:55,750 --> 01:23:58,930 Tas atgriezīs jums pirmā atmiņas baita adresi, ko tas atrada jums 1888 01:23:58,930 --> 01:24:02,110 brīvu. 1889 01:24:02,110 --> 01:24:04,940 Atšķirībā no virknes, tai nav NUL gala. 1890 01:24:04,940 --> 01:24:07,960 Tāpēc malloc apdraudējums ir tāds, ka tas attiecas uz goda sistēmu. 1891 01:24:07,960 --> 01:24:12,025 Ja jūs prasāt 1 baitu vai 10 baitus, jums, programmētājam, mainīgajā 1892 01:24:12,025 --> 01:24:16,090 ir jāatceras, cik baitu jūs pieprasījāt, 1, 10 vai tamlīdzīgi. 1893 01:24:16,090 --> 01:24:17,561 Virknes to dara jūsu vietā, nevis tad, kad mēs tagad sasniedzam šo 1894 01:24:17,561 --> 01:24:19,032 zemo līmeni. 1895 01:24:19,032 --> 01:24:20,636 Malloc tikai piešķirs jums atmiņu, un tas ir atkarīgs no jums, kā to 1896 01:24:20,636 --> 01:24:22,240 pārvaldīt. 1897 01:24:22,240 --> 01:24:23,500 Free dara pretējo. 1898 01:24:23,500 --> 01:24:25,907 Kad esat pabeidzis ar kādu atmiņas daļu, varat to atbrīvot, nosūtot 1899 01:24:25,907 --> 01:24:28,315 to pašu adresi un vienkārši nododot to atpakaļ operētājsistēmai Mac 1900 01:24:28,315 --> 01:24:30,722 OS, Windows vai Linux, un teikt, ka esmu pabeidzis, varat ļaut man 1901 01:24:30,722 --> 01:24:33,130 izmantot šo kaut kam citam vēlāk. 1902 01:24:33,130 --> 01:24:36,975 Starp citu, ja jūsu dators kādreiz ir sasalis vai uzkāries, viss, 1903 01:24:36,975 --> 01:24:40,820 iespējams, vienkārši spontāni atsāknējas. Vēl viens šādas kļūdas 1904 01:24:40,820 --> 01:24:44,665 iemesls varētu būt tas, ka rakstāt programmu ar kļūdu, kas turpina 1905 01:24:44,665 --> 01:24:48,510 izpildīt malloc funkciju, kas jautā, lai iegūtu arvien vairāk un 1906 01:24:48,510 --> 01:24:52,355 vairāk atmiņas, bet jūs pieļaujat kļūdu un nekad to neatbrīvojat, 1907 01:24:52,355 --> 01:24:56,200 galu galā datoram burtiski pietrūks atmiņas un kaut kas noies greizi. 1908 01:24:56,200 --> 01:24:58,825 Un tas bieži vien ir tad, kad datori sasalst. 1909 01:24:58,825 --> 01:24:59,950 Viņiem vienkārši trūkst atmiņas. 1910 01:24:59,950 --> 01:25:02,050 Tam ir atmiņa, taču programma centās izmantot pārāk daudz tās 1911 01:25:02,050 --> 01:25:04,150 bezgalīgi. 1912 01:25:04,150 --> 01:25:05,985 Tāpēc arī šī būs kļūda, ko daži no mums noteikti pieļaus tuvāko 1913 01:25:05,985 --> 01:25:07,820 nedēļu laikā. 1914 01:25:07,820 --> 01:25:09,890 Bet, cerams, jūs tagad redzēsit risinājumu. 1915 01:25:09,890 --> 01:25:12,820 Tāpēc ļaujiet man atgriezties pie VS Code šeit. 1916 01:25:12,820 --> 01:25:15,120 Un ļaujiet man ierosināt rīkoties šādi. 1917 01:25:15,120 --> 01:25:16,870 Es uz brīdi paslēpšu savu termināļa logu. 1918 01:25:16,870 --> 01:25:19,698 Un es šeit ieviesīšu vēl vienu galvenes failu. 1919 01:25:19,698 --> 01:25:22,240 Un es apsolu, ka tādu nebūs pārāk daudz. 1920 01:25:22,240 --> 01:25:26,860 Bet šī tiek saukta par standarta lib.h apzīmējot standarta bibliotēku. 1921 01:25:26,860 --> 01:25:29,695 Un šajā failā ir deklarācijas, malloc un free prototipi, kā arī 1922 01:25:29,695 --> 01:25:32,530 virkne citu lietu. 1923 01:25:32,530 --> 01:25:35,270 Tas ļauj man tagad pārvaldīt savu atmiņu. 1924 01:25:35,270 --> 01:25:37,360 Tāpēc tagad pievērsīsimies 11. rindiņai. 1925 01:25:37,360 --> 01:25:39,400 11. rindiņa ir vieta, kur es iepriekš kļūdījos. 1926 01:25:39,400 --> 01:25:41,650 Jo konceptuāli es gribu nokopēt visu virkni. 1927 01:25:41,650 --> 01:25:45,530 Bet, protams, es tikai pieticīgi kopēju individuālo adresi. 1928 01:25:45,530 --> 01:25:47,680 Tātad, kā es varu nokopēt visu šo sasodīto lietu? 1929 01:25:47,680 --> 01:25:49,400 Nu, kas man jādara, ir šis. 1930 01:25:49,400 --> 01:25:53,090 Kad es paziņoju, ka t ir kāda atmiņā esošā adrese, kāpēc gan es 1931 01:25:53,090 --> 01:25:56,780 neiestatu t kā brīvas atmiņas daļas adresi? 1932 01:25:56,780 --> 01:25:59,620 Tāpēc ļaujiet man palūgt operētājsistēmai, dodiet man tik daudz baitu. 1933 01:25:59,620 --> 01:26:00,820 Pastāsti man, kāda ir adrese. 1934 01:26:00,820 --> 01:26:04,850 Un es to sākotnēji uzglabāšu t, lai es zinātu, kur man ir brīva vieta. 1935 01:26:04,850 --> 01:26:06,020 Tātad, kā to izdarīt? 1936 01:26:06,020 --> 01:26:07,935 Nu, gluži vienkārši, es izsaucu malloc un tad ievadu vajadzīgo baitu 1937 01:26:07,935 --> 01:26:09,850 skaitu. 1938 01:26:09,850 --> 01:26:12,850 Tagad par HI, izsaukuma zīme, manuprāt, man vajag trīs. 1939 01:26:12,850 --> 01:26:13,770 Lai gan pagaidiet, nē. 1940 01:26:13,770 --> 01:26:16,620 Man tiešām vajag četrus NUL rakstzīmes dēļ. 1941 01:26:16,620 --> 01:26:19,120 Bet es nedomāju, ka man vajadzētu šifrēt šādus skaitļus. 1942 01:26:19,120 --> 01:26:21,328 Jo kas zina, ko cilvēks rakstīs? 1943 01:26:21,328 --> 01:26:25,630 Tāpēc es faktiski varu izmantot strlen no s un pēc tam plus 1. 1944 01:26:25,630 --> 01:26:29,800 Tas prasīs malloc, lai baitu skaits atbilstu rakstzīmju skaitam, ko 1945 01:26:29,800 --> 01:26:33,970 cilvēks ievadīja plus 1, lai atkal būtu NUL rakstzīme. 1946 01:26:33,970 --> 01:26:35,760 Tāpēc ir vienkārši būt gudram un aizsargātam, nevis pašam izvēlēties 1947 01:26:35,760 --> 01:26:37,550 skaitli. 1948 01:26:37,550 --> 01:26:40,535 Bet tagad viss, kas t ir, ir norāde, tā teikt, uz kādu nejaušu brīvas 1949 01:26:40,535 --> 01:26:43,520 vietas gabalu. 1950 01:26:43,520 --> 01:26:45,010 Tātad tur vēl nekā nav. 1951 01:26:45,010 --> 01:26:45,993 Vai arī tur ir biti. 1952 01:26:45,993 --> 01:26:47,410 Bet kas zina, kāda ir to vērtība? 1953 01:26:47,410 --> 01:26:49,870 Tie noteikti nav identiski tam, ko cilvēks ierakstīja. 1954 01:26:49,870 --> 01:26:51,430 Man tagad ir jādara šis. 1955 01:26:51,430 --> 01:26:55,090 Tātad, kā es varu kopēt vienu virkni otrā? 1956 01:26:55,090 --> 01:26:56,450 Nu, ļaujiet man izdarīt šo. 1957 01:26:56,450 --> 01:26:58,550 Tā vietā, lai vēl kaut ko rakstītu ar lielo burtu, ļaujiet manizdarīt 1958 01:26:58,550 --> 01:27:00,650 šādi. 1959 01:27:00,650 --> 01:27:08,020 Kā būtu ar 4 int i get 0, i ir mazāks par s garumu. 1960 01:27:08,020 --> 01:27:09,262 Un tad i plus plus. 1961 01:27:09,262 --> 01:27:11,720 Tāpēc es iziešu cauri visam virknes garumama. 1962 01:27:11,720 --> 01:27:13,630 Un šeit es vienkārši darīšu šo. 1963 01:27:13,630 --> 01:27:18,640 I-ajai rakstzīmei t ir jābūt identiskai i-ajai rakstzīmei s. 1964 01:27:18,640 --> 01:27:22,870 Tāpēc es tikai burtiski kopēju no labās uz kreiso katru s rakstzīmi. 1965 01:27:22,870 --> 01:27:24,980 Un es varu ticēt, ka ir pietiekami daudz atmiņas t. 1966 01:27:24,980 --> 01:27:25,480 Kāpēc? 1967 01:27:25,480 --> 01:27:27,670 Jo es prasīju tik daudz baitu plus 1. 1968 01:27:27,670 --> 01:27:29,410 Tagad šeit ir tehniska kļūda. 1969 01:27:29,410 --> 01:27:31,240 Man patiesībā būtu jādara šādi. 1970 01:27:31,240 --> 01:27:34,480 Šeit man vajadzētu likt plus 1. 1971 01:27:34,480 --> 01:27:36,790 Vai, ja vēlaties, man vajadzētu izpildīt mazāks par strlen vai 1972 01:27:36,790 --> 01:27:39,100 vienāds ar strlen. 1973 01:27:39,100 --> 01:27:41,440 Bet es domāju, ka ir nedaudz skaidrs, kā likt plus 1. 1974 01:27:41,440 --> 01:27:48,130 Kāpēc es pirmo reizi vēlos pārsniegt s robežu un nokopēt vēl 1 baitu? 1975 01:27:48,130 --> 01:27:49,005 Auditorija: [NESAKLAUSĀMS] 1976 01:27:49,005 --> 01:27:50,963 DEIVIDS Dž. Meilans: Jā, man vajag NUL rakstzīmi. 1977 01:27:50,963 --> 01:27:53,895 Es varētu to tehniski manuāli pievienot ar kādu papildu koda rindiņu. 1978 01:27:53,895 --> 01:27:55,270 Bet es varētu to vienkārši nokopēt. 1979 01:27:55,270 --> 01:27:57,580 Tā kā backslash zero ir backslash zero slīpsvītra nulle ir slīpsvītra 1980 01:27:57,580 --> 01:28:01,070 Tāpēc šoreiz un, iespējams, tikai šoreiz, ir saprātīgi un pareizi iet 1981 01:28:01,070 --> 01:28:04,560 nedaudz aiz virknes robežas, lai nokopētu NUL beigu rakstzīmi, lai 1982 01:28:04,560 --> 01:28:08,050 dators zinātu arī, kur beidzas t. 1983 01:28:08,050 --> 01:28:12,800 Un tagad es domāju, ka tas, ko es varu darīt drošāk, ir šis. 1984 01:28:12,800 --> 01:28:17,084 Ļaujiet man noiet šeit un pateikt: t, kvadrātiekava, 0, vienāds ar, 2 1985 01:28:17,084 --> 01:28:21,368 augšējais no t, no 2 augšējais no t, kvadrātiekavas, 0. 1986 01:28:21,368 --> 01:28:22,660 Tātad tā pati koda rinda kā iepriekš. 1987 01:28:22,660 --> 01:28:25,327 Ja es tiešām vēlos būt patiešām drošs, man droši vien jādara šis. 1988 01:28:25,327 --> 01:28:28,540 Tātad, ja t strlen ir lielāks par nulli. 1989 01:28:28,540 --> 01:28:30,010 Tātad tur ir vismaz 1 baits. 1990 01:28:30,010 --> 01:28:33,700 Labi, tagad varat akli pirmo rakstzīmi rakstīt ar lielo burtu. 1991 01:28:33,700 --> 01:28:36,290 Un es domāju, ka tas tagad liek man būt labākā sagatavotībā. 1992 01:28:36,290 --> 01:28:37,270 Tāpēc ļaujiet man izmēģināt šo tagad. 1993 01:28:37,270 --> 01:28:43,300 Ļaujiet man atvērt savu termināli, izveidot kopiju, dot, slash, copy. 1994 01:28:43,300 --> 01:28:45,790 Es šoreiz rakstīšu: hi, izsaukuma zīme ar visiem mazajiem burtiem, 1995 01:28:45,790 --> 01:28:48,280 sakrustojot pirkstus. 1996 01:28:48,280 --> 01:28:51,925 Un tagad, ja es tuvinātu, šajā gadījumā tas patiešām rakstīja ar 1997 01:28:51,925 --> 01:28:55,570 lielo burtu tikai t, nevis s. 1998 01:28:55,570 --> 01:28:57,610 Tātad vizuāli, ļaujiet man pārslēgties šeit. 1999 01:28:57,610 --> 01:29:00,250 Šeit, tāpat kā iepriekš, mainīgais s norāda uz hi ar visiem mazajiem 2000 01:29:00,250 --> 01:29:02,890 burtiem. 2001 01:29:02,890 --> 01:29:06,160 Tomēr, kad es izsaucu malloc, man tiek piešķirta atmiņas daļa, kurā 2002 01:29:06,160 --> 01:29:09,430 es saglabāšu adresi. 2003 01:29:09,430 --> 01:29:12,400 Tātad, ja t ir kāds cits mainīgais, kā tas ir manā kodā, un ir kāda 2004 01:29:12,400 --> 01:29:15,370 cita pieejama atmiņas daļa, es nezinu, kur tā atrodas. 2005 01:29:15,370 --> 01:29:19,660 Bet pieņemsim, ka tas vienmēr ir 0x456, 457, 458, 459. 2006 01:29:19,660 --> 01:29:20,980 Tātad kopā 4 baiti. 2007 01:29:20,980 --> 01:29:22,360 Kas tagad notiek? 2008 01:29:22,360 --> 01:29:24,760 Nu, t ir definēts kā norāde uz to. 2009 01:29:24,760 --> 01:29:29,260 Jo tieši to malloc mums dod — brīvās atmiņas pirmā baita adresi. 2010 01:29:29,260 --> 01:29:34,525 Un tagad, izmantojot for cilpu, es vienkārši atkārtoju to, kopējot h, 2011 01:29:34,525 --> 01:29:39,790 tad i, tad izsaukuma zīmi un pēc tam reverso slīpsvītru, 0. 2012 01:29:39,790 --> 01:29:43,476 Vai tad ir jautājumi par šo procesu šeit? 2013 01:29:43,476 --> 01:29:44,370 Auditorija: [NESAKLAUSĀMS] 2014 01:29:44,370 --> 01:29:45,995 DEIVIDS Dž. Meilans: Tiešām labs jautājums. 2015 01:29:45,995 --> 01:29:50,423 Ja es savā kodā izlaistu plus 1 un es neiekļautu mazāks par vai 2016 01:29:50,423 --> 01:29:54,851 vienāds ar, lai kopētu ceturto baitu, šajā programmā ir izredzes, jo 2017 01:29:54,851 --> 01:29:59,280 tā ir tik īsa, jūs nepamanītu, ka ir faktiska kļūda. 2018 01:29:59,280 --> 01:30:03,092 Bet kas var notikt, ja es izsaucu printf uz t, ja tur nav NUL baita, 2019 01:30:03,092 --> 01:30:06,904 tas var drukāt h, i, izsaukuma zīmi, dažas nejaušas vērtības, dažas 2020 01:30:06,904 --> 01:30:10,716 nejaušas vērtības, dažas nejaušas vērtības, dažas nejaušas vērtības, 2021 01:30:10,716 --> 01:30:14,528 līdz tam paveicas un tur gadās, ka tas ir 0 baits, piemēram, nejauši 2022 01:30:14,528 --> 01:30:18,340 NUL baits. 2023 01:30:18,340 --> 01:30:20,570 Tātad, ja kaut kādā veidā neiekļausiet reverso slīpsvītru, nulli, tas 2024 01:30:20,570 --> 01:30:22,800 notiks. 2025 01:30:22,800 --> 01:30:23,970 Un es saku kaut kā. 2026 01:30:23,970 --> 01:30:25,030 Es pat varētu izdarīt šādi. 2027 01:30:25,030 --> 01:30:29,356 Es varētu tehniski vienkārši nokopēt virknes s garumu, un šeit pašā 2028 01:30:29,356 --> 01:30:33,683 apakšā es varētu darīt kaut ko līdzīgu t, kvadrātiekava, i-- 2029 01:30:33,683 --> 01:30:38,010 atvainojiet, t, kvadrātiekava, strlen no t. 2030 01:30:38,010 --> 01:30:39,520 Es varētu izdarīt šādi. 2031 01:30:39,520 --> 01:30:41,010 Bet tas vienkārši nav nepieciešams. 2032 01:30:41,010 --> 01:30:43,540 Es to varētu manuāli pievienot virknes beigās. 2033 01:30:43,540 --> 01:30:46,955 Bet atkal es gribētu apgalvot, ka aizņemties ir vienkāršāk, tas ir, 2034 01:30:46,955 --> 01:30:50,370 kopēt, to, kas jau ir s, jo tas ir viens un tas pats galu galā. 2035 01:30:50,370 --> 01:30:51,130 Labs jautājums. 2036 01:30:51,130 --> 01:30:53,960 Vai ir kādi jautājumi par pareizu kopēšanu tagad? 2037 01:30:57,040 --> 01:30:57,540 Labi. 2038 01:30:57,540 --> 01:31:00,070 Vai šeit ir kādi uzlabojumi? 2039 01:31:00,070 --> 01:31:02,310 Ļaujiet man piedāvāt nelielu optimizāciju. 2040 01:31:02,310 --> 01:31:04,860 Šī ir sava veida atgriešanās pirmajā nedēļā. 2041 01:31:04,860 --> 01:31:08,310 Izrādās, ka mana 13. rindiņa šeit, kurā man ir šī cilpa, tagad, kad 2042 01:31:08,310 --> 01:31:11,760 es atkal un atkal daru lietas cilpās un izmantoju tādu funkciju kā 2043 01:31:11,760 --> 01:31:15,210 strlen, tā ir pareiza. 2044 01:31:15,210 --> 01:31:21,510 Tas iterēs no nulles visā i garumā, s garums plus 1. 2045 01:31:21,510 --> 01:31:26,910 Bet tas ir stulbi no manas puses, rakstīt šo for loop šādā veidā. 2046 01:31:26,910 --> 01:31:27,438 Kāpēc? 2047 01:31:27,438 --> 01:31:29,230 Nu, šeit ir mana inicializācija kreisajā pusē. 2048 01:31:29,230 --> 01:31:30,930 Šeit ir mans nosacījums pa vidu. 2049 01:31:30,930 --> 01:31:34,665 Un kopumā funkcijas izsaukšana jūsu nosacījuma ietvaros, iespējams, 2050 01:31:34,665 --> 01:31:38,400 nav pārāk labs dizains. 2051 01:31:38,400 --> 01:31:39,000 Kāpēc? 2052 01:31:39,000 --> 01:31:41,805 Kāpēc ir slikti izsaukt tādu funkciju kā strlen šādā nosacījumā manas 2053 01:31:41,805 --> 01:31:44,610 for cilpas vidū? 2054 01:31:44,610 --> 01:31:45,150 Jā. 2055 01:31:45,150 --> 01:31:48,430 Auditorija: [NESAKLAUSĀMS] 2056 01:31:48,430 --> 01:31:50,040 DEIVIDS Dž. Meilans: Jā, jūs vienkārši izsaucat atkal un atkal bez 2057 01:31:50,040 --> 01:31:51,650 iemesla. 2058 01:31:51,650 --> 01:31:53,040 S garums nekad nemainās. 2059 01:31:53,040 --> 01:31:55,810 Tātad, kāpēc jūs tērējat ikviena laiku, izsaucot strlen no s vēlreiz, 2060 01:31:55,810 --> 01:31:58,580 atkal, atkal, vēlreiz, lai pārbaudītu šo nevienādību, vai i ir mazāks 2061 01:31:58,580 --> 01:32:01,350 par šo vērtību? 2062 01:32:01,350 --> 01:32:04,156 Tātad izrādās, ka, ja jūs to vēl neesat atklājis, mēs varam veikt 2063 01:32:04,156 --> 01:32:06,963 nelielu optimizāciju, kurai nav nekāda sakara ar virknēm vai norādēm, 2064 01:32:06,963 --> 01:32:09,770 tikai ar labāku dizainu. 2065 01:32:09,770 --> 01:32:12,260 Es faktiski varu definēt divus mainīgos vienlaikus. 2066 01:32:12,260 --> 01:32:13,350 Es varētuizdarīt šādi. 2067 01:32:13,350 --> 01:32:15,230 Ļaujiet man noņemt visu šo nosacījumu. 2068 01:32:15,230 --> 01:32:19,910 Un ļaujiet man pievienot komatu pēc tam, kad i ir vienāds ar 0, 2069 01:32:19,910 --> 01:32:24,590 iestatiet n vai jebkuru mainīgo, kas vienāds ar strlen no s plus 1. 2070 01:32:24,590 --> 01:32:30,020 Un pēc semikola vienkārši uzdodiet jautājumu, kamēr i ir mazāks par n. 2071 01:32:30,020 --> 01:32:31,620 Tātad tas ir gandrīz tas pats. 2072 01:32:31,620 --> 01:32:34,675 Bet ievērojiet, ka mans nosacījums šīs cilpas pašā vidū ir vismaz 2073 01:32:34,675 --> 01:32:37,730 divu statisko vērtību salīdzināšana. 2074 01:32:37,730 --> 01:32:38,700 n nekad nemainās. 2075 01:32:38,700 --> 01:32:39,200 Atvainojiet. 2076 01:32:39,200 --> 01:32:41,390 Viena statiska vērtība. 2077 01:32:39,200 --> 01:32:42,500 n nekad nemainās. Viss, kas mainās, ir i. 2078 01:32:42,500 --> 01:32:45,810 Bet es neprātīgi saucu strlen, strlen, strlen atkal un atkal. 2079 01:32:45,810 --> 01:32:46,310 Kāpēc? 2080 01:32:46,310 --> 01:32:47,600 Nu, kā strlen darbojas? 2081 01:32:47,600 --> 01:32:50,930 Pēc būtības līdzīgs printf, strlen, ņemot vērā virknes nosaukumu, 2082 01:32:50,930 --> 01:32:54,260 aplūko pirmo rakstzīmi un pēc tam sāk meklēt visu virkni, meklējot 2083 01:32:54,260 --> 01:32:57,590 NUL rakstzīmi. 2084 01:32:57,590 --> 01:33:01,320 Un mēs to redzējām otrajā nedēļā, saskaitot, cik rakstzīmju ir. 2085 01:33:01,320 --> 01:33:03,820 Tāpēc tā ir tikai laika izšķiešana atkal un atkal. 2086 01:33:03,820 --> 01:33:09,330 Auditorija: [NESAKLAUSĀMS] pilnībā 2087 01:33:09,330 --> 01:33:10,330 DEIVIDS Dž. Meilans: Pilnīgi. 2088 01:33:10,330 --> 01:33:12,810 Ja vēlaties izmantot n vairākas reizes, varat to pilnībā izņemt no 2089 01:33:12,810 --> 01:33:15,290 for cilpas, ievietot to uzreiz pēc s definēšanas un atkārtoti 2090 01:33:15,290 --> 01:33:17,770 izmantot n un atkal un atkal. 2091 01:33:17,770 --> 01:33:18,430 Pilnīgi noteikti. 2092 01:33:18,430 --> 01:33:19,990 Bet kopumā apsveriet šo. 2093 01:33:19,990 --> 01:33:23,247 Izstrādājot cilpas, lai gan mūsdienu kompilatori, piemēram, Clang, 2094 01:33:23,247 --> 01:33:26,505 faktiski var novērst šo problēmu, šo neefektivitāti jūsu vietā, laba 2095 01:33:26,505 --> 01:33:29,762 prakse būtu bez vajadzības neizsaukt funkcijas, it īpaši, ja atbilde 2096 01:33:29,762 --> 01:33:33,020 vienmēr būs viena un tā pati. 2097 01:33:33,020 --> 01:33:33,520 Labi. 2098 01:33:33,520 --> 01:33:37,100 Tātad, kas vēl man šeit būtu jāprecizē? 2099 01:33:37,100 --> 01:33:39,995 Nu, kā būtu, ja es izdarītu pēdējo lietu un vienkārši komentētu, kas 2100 01:33:39,995 --> 01:33:42,890 tieši šeit varētu noiet greizi. 2101 01:33:42,890 --> 01:33:44,320 Nu, pāris lietas. 2102 01:33:44,320 --> 01:33:46,480 Nu, patiesībā arī tas ir vienkārši muļķīgi. 2103 01:33:46,480 --> 01:33:50,290 Protams, kādam pirms manis pasaulē ir nācies kopēt virkni. 2104 01:33:50,290 --> 01:33:52,645 Protams, ir tāda funkcija kā strcpy, iespējams, piemēram, strcompare, 2105 01:33:52,645 --> 01:33:55,000 piemēram, strlen. 2106 01:33:55,000 --> 01:33:55,900 Un tiešām ir. 2107 01:33:55,900 --> 01:33:58,560 Ļaujiet man ierosināt, lai mēs faktiski atbrīvotos no šīs visas for 2108 01:33:58,560 --> 01:34:01,220 cilpas, un mēs faktiski vienkārši izsaucam funkciju, ko sauc par 2109 01:34:01,220 --> 01:34:03,880 strcpy, nevis O, tikai strcpy. 2110 01:34:03,880 --> 01:34:07,090 Un ievadiet galamērķi, kas vispirms ir t, un pēc tam avotu, kuru 2111 01:34:07,090 --> 01:34:10,300 vēlaties kopēt galamērķī. 2112 01:34:10,300 --> 01:34:13,810 Un tas pilnībā aizvieto visu šo cilpu. 2113 01:34:13,810 --> 01:34:15,475 Tāpēc es vispirms nodemonstrēju cilpu, tikai lai es būtu ļoti 2114 01:34:15,475 --> 01:34:17,140 pedantisks. 2115 01:34:17,140 --> 01:34:18,320 Bet tā ir laika tērēšana. 2116 01:34:18,320 --> 01:34:20,820 Jūs tērējat laiku, rakstot koda rindas, kas jums nav vajadzīgas. 2117 01:34:20,820 --> 01:34:24,020 Šeit varat izmantot strcpy. 2118 01:34:24,020 --> 01:34:25,720 Un šis ir pastāvējis vienmēr. 2119 01:34:25,720 --> 01:34:26,930 Un ko vēl es varu darīt? 2120 01:34:26,930 --> 01:34:30,857 Visbeidzot, izrādās, ka šajā kodā patiešām ir lietas, kas var noiet 2121 01:34:30,857 --> 01:34:34,785 greizi, pat atskaitot ja virkne ir pārāk īsa. 2122 01:34:34,785 --> 01:34:37,514 Ja cilvēks vienkārši nospiež Enter un nav nevienas rakstzīmes, es 2123 01:34:37,514 --> 01:34:40,243 nevēlos akli rakstīt ar lielo burtu pirmo rakstzīmi, kas neeksistē. 2124 01:34:40,243 --> 01:34:41,950 Tāpēc es pievienoju if nosacījumu. 2125 01:34:41,950 --> 01:34:43,840 Bet ir arī citas lietas, kas var noiet greizi. 2126 01:34:43,840 --> 01:34:45,520 Un mēs jūs šodien iepazīstinām ar tām. 2127 01:34:45,520 --> 01:34:49,855 Izrādās, ka tādas funkcijas kā get string un tādas funkcijas kā 2128 01:34:49,855 --> 01:34:54,190 malloc, iespējams, atgriež īpašu vērtību. 2129 01:34:54,190 --> 01:34:58,320 Un brīnišķīgi mulsinoši, to sauc arī par NULL, bet ar diviem L. 2130 01:34:58,320 --> 01:34:58,820 Labi? 2131 01:34:58,820 --> 01:35:01,780 Tātad kreisā un labā roka nesapratās tik labi pirms gadu desmitiem. 2132 01:35:01,780 --> 01:35:04,480 NUL ir reversā slīpsvītra, nulle. 2133 01:35:04,480 --> 01:35:08,950 Tā ir viena rakstzīme, kā tas vienmēr ir bijis jau pāris nedēļas. 2134 01:35:08,950 --> 01:35:12,070 NULL tehniski ir norāde. 2135 01:35:12,070 --> 01:35:14,650 Tā ir adrese, bet tā ir nulles adrese. 2136 01:35:14,650 --> 01:35:18,070 Ja vēlaties, tas ir kā datora atmiņas augšējais kreisais stūris, kurā 2137 01:35:18,070 --> 01:35:21,490 pēc vienošanās nekad nav paredzēts iekļūt. 2138 01:35:21,490 --> 01:35:24,790 Tātad NULL ir nulles sinonīms. 2139 01:35:24,790 --> 01:35:26,260 Bet tā ir konkrēti adrese. 2140 01:35:26,260 --> 01:35:27,500 Tagad kāpēc tas ir noderīgi? 2141 01:35:27,500 --> 01:35:30,622 Pieņemsim, ka manā kodā ar get string kaut kas noiet greizi. 2142 01:35:30,622 --> 01:35:33,830 Pieņemsim, ka esat mazliet traks un ierakstāt pārāk garu virkni. 2143 01:35:33,830 --> 01:35:36,223 Tas nav tikai hi, bet arī kā vesela teksta eseja. 2144 01:35:36,223 --> 01:35:38,140 Un datorā nepietiek atmiņas. 2145 01:35:38,140 --> 01:35:41,215 Kā programmētājam get string signālizē, ak, tā ir pārāk liela virkne, 2146 01:35:41,215 --> 01:35:44,290 es to nevaru ievietot atmiņā? 2147 01:35:44,290 --> 01:35:45,860 Nu, mēs jums to nekad nestāstījām. 2148 01:35:45,860 --> 01:35:49,730 Bet visu šo laiku izrādās, ka get string atgriezīs šo īpašo vērtību, 2149 01:35:49,730 --> 01:35:53,600 ko sauc par NULL, ja kaut kas noiet greizi. 2150 01:35:53,600 --> 01:35:55,340 Tāpēc, lai tagad būtu ļoti uzmanīgi, jums vajadzētu darīt kaut ko 2151 01:35:55,340 --> 01:35:57,080 līdzīgu šim. 2152 01:35:57,080 --> 01:36:00,186 Ja s ir vienāds ar, vienāds ar burtiski NULL, tad labāk pilnībā iziet 2153 01:36:00,186 --> 01:36:03,293 no programmas un atgrieziet viens, divi vai trīs, lai norādītu, ka 2154 01:36:03,293 --> 01:36:06,400 kaut kas nogāja greizi. 2155 01:36:06,400 --> 01:36:08,320 Neejiet tālāk. 2156 01:36:08,320 --> 01:36:10,936 Līdzīgi kā ar malloc, ir iespējams, ja prasāt pārāk daudz atmiņas, 2157 01:36:10,936 --> 01:36:13,552 tas var neizdoties, it īpaši, ja tagad prasāt dubultu atmiņu pēc tam, 2158 01:36:13,552 --> 01:36:16,168 kad cilvēks kaut ko ierakstījis. 2159 01:36:16,168 --> 01:36:18,760 Tātad, ja t ir vienāds ar, vienāds ar NULL, tad jūs zināt, ko? 2160 01:36:18,760 --> 01:36:21,990 Atgriezīsim arī 1vai kādu citu vērtību, lai izkļūtu ārā, pirms kaut 2161 01:36:21,990 --> 01:36:25,220 kas avarē vai sasalst arī lietotājam. 2162 01:36:25,220 --> 01:36:27,465 Godīgi sakot, es mēdzu to nedarīt vienmēr nodarbībā, jo kods 2163 01:36:27,465 --> 01:36:29,710 vienkārši kļūst tik uzpūsts un sarežģīts. 2164 01:36:29,710 --> 01:36:32,780 Bet jums tas noteikti jāsāk praksē. 2165 01:36:32,780 --> 01:36:35,336 Pretējā gadījumā jūs būsiet atbildīgs par iesaldēšanu, avārijām un 2166 01:36:35,336 --> 01:36:37,893 atsāknēšanu, ar kurām lietotāji reālajā pasaulē varētu saskarties 2167 01:36:37,893 --> 01:36:40,450 pretējā gadījumā. 2168 01:36:40,450 --> 01:36:43,720 Protams, ja mēs tagad nonāksim līdz šīs programmas būtībai, man, 2169 01:36:43,720 --> 01:36:46,990 iespējams, tieši vai netieši jāatgriež nulle, lai tikai norādītu, ka 2170 01:36:46,990 --> 01:36:50,260 viss ir veiksmīgi. 2171 01:36:50,260 --> 01:36:52,660 Bet ir vēl viena lieta, ko es neesmu izdarījis. 2172 01:36:52,660 --> 01:36:53,890 Mēs ieviesām malloc. 2173 01:36:53,890 --> 01:36:55,725 Bet ko es apgalvoju, ka arī pastāv? 2174 01:36:55,725 --> 01:36:56,350 Auditorija: Free. 2175 01:36:56,350 --> 01:36:57,220 DEIVIDS Dž. Meilans: Tik brīvs. 2176 01:36:57,220 --> 01:36:58,762 Es arī tagad esmu nedaudz neapdomīgs. 2177 01:36:58,762 --> 01:37:00,850 Šeit es nepraktizēju to, ko sludinu. 2178 01:37:00,850 --> 01:37:04,530 Es prasu datoram atmiņu, izmantojot get string, es lūdzu datoram 2179 01:37:04,530 --> 01:37:08,210 papildu atmiņu, izmantojot malloc, un es to nekad tehniski neatdodu. 2180 01:37:08,210 --> 01:37:12,165 Tātad tas, ko man vajadzētu darīt arī savas programmas pašā apakšā, 2181 01:37:12,165 --> 01:37:16,120 ir atbrīvot atmiņu, ko esmu lūdzis. 2182 01:37:16,120 --> 01:37:19,970 Tātad turpmāk tas ir noteikums, likums, ja vēlaties C, kad jūs 2183 01:37:19,970 --> 01:37:23,820 piešķirat atmiņu ar malloc vai arī dažām citām funkcijām, jums, 2184 01:37:23,820 --> 01:37:27,670 programmētājam, tā ir jāatbrīvo, kad esat ar to pabeidzis. 2185 01:37:27,670 --> 01:37:30,235 Tagad tas ir nedaudz pārspīlēti teikts, jo tehniski, kad programmas 2186 01:37:30,235 --> 01:37:32,800 tiks aizvērtas, tās automātiski atbrīvos atmiņu. 2187 01:37:32,800 --> 01:37:35,980 Tātad jūs nesalauzīsit kāda Mac vai PC, jo jums ir šī kļūda. 2188 01:37:35,980 --> 01:37:38,537 Taču programmām, kas darbojas visu laiku, piemēram, kāds tur 2189 01:37:38,537 --> 01:37:41,095 Chromepārlūkprogrammuatvērtu, Microsoft Word vai tamlīdzīgi, notiks 2190 01:37:41,095 --> 01:37:43,652 sliktas lietas, ja laika gaitā jūs nekad, nekad, nekad neizsauksit 2191 01:37:43,652 --> 01:37:46,210 free un programma turpinās darboties. 2192 01:37:46,210 --> 01:37:48,250 Tāpēc vienmēr ieviesiet šo ieradumu šeit. 2193 01:37:48,250 --> 01:37:51,465 Jums nav nepieciešama brīvā atmiņa, kas rodas no get string, jo CS50 2194 01:37:51,465 --> 01:37:54,680 bibliotēka to automātiski atbrīvo jūsu vietā. 2195 01:37:54,680 --> 01:37:57,836 Bet jums, ikreiz, kad turpmāk lietojat malloc, kā jūs to darījāt vai 2196 01:37:57,836 --> 01:38:00,993 es darīju šeit, jums tā ir jāatbrīvo, vienkārši ieejot tajā pašā 2197 01:38:00,993 --> 01:38:04,150 adresē, kuru saņēmāt atpakaļ. 2198 01:38:04,150 --> 01:38:09,740 Vai tagad ir jautājumi par malloc un free? 2199 01:38:09,740 --> 01:38:11,000 Jautājumi? 2200 01:38:11,000 --> 01:38:11,890 Jā. 2201 01:38:11,890 --> 01:38:17,878 Auditorija: [NESAKLAUSĀMS] 2202 01:38:17,878 --> 01:38:19,420 DEIVIDS Dž. Meilans: Tiešām labs jautājums. 2203 01:38:19,420 --> 01:38:22,260 Tikai free, ko dara free? 2204 01:38:22,260 --> 01:38:25,200 Tātad free tikai ļauj datoram zināt, ka esat pabeidzis ar šo atmiņas 2205 01:38:25,200 --> 01:38:28,140 daļu strādāt, kas nozīmē, ka, ja citur ir cita koda rindiņa, šī 2206 01:38:28,140 --> 01:38:31,080 atmiņa var tikt izmantota atkārtoti un to var izmantot atkal un 2207 01:38:31,080 --> 01:38:34,020 atkal. 2208 01:38:34,020 --> 01:38:36,280 Un tas noteikti būs nepieciešams jebkurai ilgstošai programmai. 2209 01:38:36,280 --> 01:38:37,827 Jūs nevarat pastāvīgi lūgt atmiņu. 2210 01:38:37,827 --> 01:38:38,910 Visbeidzot jums tā izbeigsies. 2211 01:38:38,910 --> 01:38:40,368 Tātad jums tā ir jāatbrīvo šādā veidā. 2212 01:38:40,368 --> 01:38:41,555 Citas valodas pie malas. 2213 01:38:41,555 --> 01:38:44,722 Python, vēl viena motivācija pēc pāris nedēļām, jo tas būs Python un 2214 01:38:44,722 --> 01:38:47,890 dažas citas valodas pārvalda visas šīs galvassāpes jūsu vietā. 2215 01:38:47,890 --> 01:38:52,600 Bet C versijā mērķis ir patiešām izmantot šīs iespējas pašiem. 2216 01:38:52,600 --> 01:38:53,100 Labi. 2217 01:38:53,100 --> 01:38:55,430 Tātad izrādās, ka gandrīz visi, kas atrodas telpā, visi telpā esošie, 2218 01:38:55,430 --> 01:38:57,760 arī es, jūs kaut ko sabojāsiet, kad runa ir par kaut ko, kas saistīts 2219 01:38:57,760 --> 01:39:00,090 ar atmiņu, ja vēl neesat to izdarījis. 2220 01:39:00,090 --> 01:39:01,630 Seg kļūmes ir jūsu nākotnē. 2221 01:39:01,630 --> 01:39:04,336 Bet cerams, ka ir rīki, ar kuru palīdzību jūs varat noteikt šīs 2222 01:39:04,336 --> 01:39:07,043 lietas un proaktīvi tās labot, nevis tikai izmantot printf, debug50 2223 01:39:07,043 --> 01:39:09,750 vai gumijas pīli. 2224 01:39:09,750 --> 01:39:11,865 Mums faktiski ir vēl viens rīks, ar kuru mēs varam jūs tagad aprīkot 2225 01:39:11,865 --> 01:39:13,980 un kas palīdzēs jums atrast dažas kļūdas. 2226 01:39:13,980 --> 01:39:14,920 Tāpēc ļaujiet man izdarīt šādi. 2227 01:39:14,920 --> 01:39:16,800 Ļaujiet man aizvērt copy.c. 2228 01:39:16,800 --> 01:39:19,460 Ļaujiet man atvērt programmu, kuru es uzrakstīju iepriekš, ar 2229 01:39:19,460 --> 01:39:22,120 nosaukumu memory.c, kas nedara neko interesantu. 2230 01:39:22,120 --> 01:39:24,070 Bet tajā būs divas kļūdas. 2231 01:39:24,070 --> 01:39:27,090 Ievērojiet, ka esmu iekļāvis standardio.h kā vienmēr. 2232 01:39:27,090 --> 01:39:30,390 Esmu iekļāvis arī standardlib.h, kas tagad ir nepieciešams visam, kas 2233 01:39:30,390 --> 01:39:33,690 saistīts ar malloc un/vai free un tamlīdzīgām. 2234 01:39:33,690 --> 01:39:34,890 Sestā rinda. 2235 01:39:34,890 --> 01:39:36,730 Tas ir mazliet dīvaini, ko es šeit esmu izdarījis. 2236 01:39:36,730 --> 01:39:39,515 Bet tas ir manuāls veids, kā pieprasīt pietiekami daudz atmiņas 2237 01:39:39,515 --> 01:39:42,300 masīvam. 2238 01:39:42,300 --> 01:39:45,690 Kā otrajā nedēļā pieprasījām atmiņu masīvam? 2239 01:39:45,690 --> 01:39:49,470 Jūs ļoti vienkārši sakāt, int x3. 2240 01:39:49,470 --> 01:39:52,140 Un tas dod jums masīvu, ko sauc par x ar izmēru trīs. 2241 01:39:52,140 --> 01:39:54,960 Bet, ja jūs to darāt manuāli tagad, izmantojot malloc, jums ir 2242 01:39:54,960 --> 01:39:57,780 jāizmanto šāda sintakse. 2243 01:39:57,780 --> 01:39:59,976 Jūs izsaucat malloc, jūs prasāt trīs lietas, reizināts ar to cik 2244 01:39:59,976 --> 01:40:02,173 liels ir int. 2245 01:40:02,173 --> 01:40:03,090 Tagad mēs zinām, ka ir četri. 2246 01:40:03,090 --> 01:40:04,650 Tātad jūs varētu burtiski šeit ierakstīt 12. 2247 01:40:04,650 --> 01:40:06,250 Bet tas ir vispārīgāki. 2248 01:40:06,250 --> 01:40:09,930 Tātad trīs reizes lielāks par veselu skaitli dinamiski dos 12. 2249 01:40:09,930 --> 01:40:11,280 Un ko malloc atgriež? 2250 01:40:11,280 --> 01:40:14,400 Pirmā saņemtā baita adresi. 2251 01:40:14,400 --> 01:40:15,940 Kur es gribu to likt? 2252 01:40:15,940 --> 01:40:17,560 Nu, es gribu to ievietot mainīgajā. 2253 01:40:17,560 --> 01:40:20,620 Tagad mainīgais nevar būt tikai int x, jo tas ir skaitlis. 2254 01:40:20,620 --> 01:40:22,260 Tā nav adrese pati par sevi. 2255 01:40:22,260 --> 01:40:24,375 Ja es vēlos saglabāt šo adresi mainīgajā, es to varētu saukt par x, 2256 01:40:24,375 --> 01:40:26,490 es to varētu saukt par p. 2257 01:40:26,490 --> 01:40:29,880 Bet int zvaigznīte x nozīmē tikai to, ka x tagad ir atmiņas gabala 2258 01:40:29,880 --> 01:40:33,270 adrese, jo īpaši atmiņas gabals, kas ir pietiekami liels nevis 2259 01:40:33,270 --> 01:40:36,660 vienam, bet kopumā trim int. 2260 01:40:36,660 --> 01:40:40,800 Labi, tagad es vienkārši naivi ielieku atmiņā mūsu veco draugu 72, 73 2261 01:40:40,800 --> 01:40:44,940 un 33 pirmajā, otrajā un trešajā vietā. 2262 01:40:44,940 --> 01:40:47,235 Bet, iespējams, pamatojoties uz otro vai ceturto nedēļu, es šeit 2263 01:40:47,235 --> 01:40:49,530 nepārprotami kļūdos vairākos veidos. 2264 01:40:49,530 --> 01:40:52,200 Kāds vēlas identificēt vismaz vienu kļūdu? 2265 01:40:52,200 --> 01:40:53,193 Ko es izdarīju nepareizi? 2266 01:40:53,193 --> 01:40:55,110 Auditorija: Jums jāsāk no nulles, nevis ar viens. 2267 01:40:55,110 --> 01:40:58,410 DEIVIDS Dž. Meilans: Jā, tas tagad ir amatieru lietas. 2268 01:40:58,410 --> 01:41:00,790 Man vajadzētu būt nulles indeksācijai, nevis viens indeksācijai. 2269 01:41:00,790 --> 01:41:03,210 Tātad tam galu galā ir jābūt nulle, viens, divi. 2270 01:41:03,210 --> 01:41:05,775 Un citas kļūdas, kas varbūt ir vairāk specifiskas ceturtajai nedēļai? 2271 01:41:08,340 --> 01:41:09,180 Citas kļūdas. 2272 01:41:09,180 --> 01:41:09,930 Tās ir nianses. 2273 01:41:09,930 --> 01:41:10,430 Jā. 2274 01:41:10,430 --> 01:41:11,310 Auditorija: [NESAKLAUSĀMS] 2275 01:41:11,310 --> 01:41:12,390 DEIVIDS Dž. Meilans: Es neatbrīvoju atmiņu, vai ne? 2276 01:41:12,390 --> 01:41:14,970 Tāpēc es nepraktizēju to, ko sludinu, atbrīvojot šo atmiņu. 2277 01:41:14,970 --> 01:41:16,470 Tagad pieņemsim, ka tās nav acīmredzamas. 2278 01:41:16,470 --> 01:41:18,270 Un, godīgi sakot, pēc stundas vai divām tām vēl nevajadzētu būt 2279 01:41:18,270 --> 01:41:20,070 acīmredzamām. 2280 01:41:20,070 --> 01:41:21,420 Tās būs ar laiku. 2281 01:41:21,420 --> 01:41:24,975 Kā es varu atrast šīs programmatūras kļūdas, nevis vienkārši 2282 01:41:24,975 --> 01:41:28,530 skatīties uz šo lietu vai lūgt kādam palīdzību? 2283 01:41:28,530 --> 01:41:29,980 Nu, ļaujiet man ierosināt šo. 2284 01:41:29,980 --> 01:41:31,955 Ļaujiet man vispirms iet uz priekšu un palaist make memory, lai 2285 01:41:31,955 --> 01:41:33,930 kompilētu programmu. 2286 01:41:33,930 --> 01:41:35,970 Un šķiet, ka tas darbojas — izskatās labi. 2287 01:41:35,970 --> 01:41:37,800 Vismaz sintakses kļūdu nav. 2288 01:41:37,800 --> 01:41:40,838 Punktu slīpsvītras atmiņa, ievērojiet, arī šķiet, ka darbojas labi. 2289 01:41:40,838 --> 01:41:42,880 Tagad šī programma neko interesantu nedara. 2290 01:41:42,880 --> 01:41:44,610 Nav printf vai kaut kas tamlīdzīgs. 2291 01:41:44,610 --> 01:41:45,760 Bet tā neavarēja. 2292 01:41:45,760 --> 01:41:48,000 Nav segmentācijas kļūmes. 2293 01:41:45,760 --> 01:41:51,060 Bet tas nenozīmē, ka programmatūrā nav slēptu kļūdu. 2294 01:41:51,060 --> 01:41:54,090 Un tas diemžēl attiecas uz visu mūsdienu programmatūru. 2295 01:41:54,090 --> 01:41:56,420 Pārlūkā Chrome, Microsoft Word un citās programmās noteikti ir ar 2296 01:41:56,420 --> 01:41:58,750 atmiņu saistītas kļūdas, kuras Google un Microsoft darbinieki vēl nav 2297 01:41:58,750 --> 01:42:01,080 atraduši. 2298 01:42:01,080 --> 01:42:04,410 Bet ir rīki, lai atrastu visredzamākās no šīm kļūdām. 2299 01:42:04,410 --> 01:42:07,620 Un mēs tagad jūs iepazīstināsim ar programmu Valgrind. 2300 01:42:07,620 --> 01:42:09,900 Tātad, Valgrind, tā ir diezgan smalka programma. 2301 01:42:09,900 --> 01:42:11,700 Bet mēs to izmantosim ļoti vienkāršiem nolūkiem. 2302 01:42:11,700 --> 01:42:14,880 Mēs izskatīsim jūsu kodu un atradīsim atmiņas kļūdas tās izpildes 2303 01:42:14,880 --> 01:42:18,060 laikā un mēģināsim jums palīdzēt saprast, kur tās atrodas. 2304 01:42:18,060 --> 01:42:20,190 Tāpēc ļaujiet man atgriezties pie VS Code šeit. 2305 01:42:20,190 --> 01:42:21,515 Šķiet, ka ar atmiņu viss ir kārtībā. 2306 01:42:21,515 --> 01:42:23,640 Man šķiet, labi, es iesniegšu šo mājasdarbu. 2307 01:42:23,640 --> 01:42:24,180 Viss ir labi. 2308 01:42:24,180 --> 01:42:25,170 Nav kļūdu ziņojumu. 2309 01:42:25,170 --> 01:42:26,620 Tā vairs nav. 2310 01:42:26,620 --> 01:42:28,720 Tagad jums ir nedaudz vairāk jāiedziļinās savā kodā, lai redzētu, vai 2311 01:42:28,720 --> 01:42:30,820 tur joprojām ir kāda kļūda. 2312 01:42:30,820 --> 01:42:35,560 Tāpēc ļaujiet manizdarīt šādi. 2313 01:42:30,820 --> 01:42:35,560 Valgrind un pēc tam space, dot, slash, memory. 2314 01:42:35,560 --> 01:42:38,700 Tāpat kā debug50, jūs to palaižat jau kompilētā programmā. 2315 01:42:38,700 --> 01:42:41,550 Valgrind, es to palaidīšu programmā, kuru jau esmu kompilējis. 2316 01:42:41,550 --> 01:42:43,155 Ļaujiet man tuvināt savu termināļa logu, lai mēs varētu redzēt vairāk 2317 01:42:43,155 --> 01:42:44,760 vienlaikus. 2318 01:42:44,760 --> 01:42:46,110 Un Enter. 2319 01:42:46,110 --> 01:42:49,273 Labi, izvade ir traki šifrēta bez pamatota iemesla. 2320 01:42:49,273 --> 01:42:50,940 Ir daudz skaitļu un vienādības zīmju. 2321 01:42:50,940 --> 01:42:52,200 Tas ir liels juceklis. 2322 01:42:52,200 --> 01:42:54,250 Bet te ir kāda sūlīga informācija. 2323 01:42:54,250 --> 01:42:55,950 Un ļaujiet man sākt no augšas uz leju. 2324 01:42:55,950 --> 01:42:58,470 Nederīgs ieraksts, izmērs četri. 2325 01:42:58,470 --> 01:43:02,400 Tātad rakstīt nozīmē mainīt vērtību, lasīt nozīmē piekļūt vērtībai. 2326 01:43:02,400 --> 01:43:06,000 Un tas atkal ir ezotēriski, tāpat kā daudzi mūsu kļūdu ziņojumi. 2327 01:43:06,000 --> 01:43:09,600 Bet izskatās, ka pēc 12. izmēra bloka ir piešķirts, un tad ir šīs 2328 01:43:09,600 --> 01:43:13,200 dīvainās heksadecimālās notācijas. 2329 01:43:13,200 --> 01:43:14,580 Ir dažviet pieminēts malloc. 2330 01:43:14,580 --> 01:43:18,120 Bet godīgi sakot, sulīgā daļa šeit ir memory.c, sestā rinda. 2331 01:43:18,120 --> 01:43:21,610 Tā laikam ir mana vaina. 2332 01:43:18,120 --> 01:43:21,610 Apskatīsim sesto rindiņu šai izvadei. 2333 01:43:21,610 --> 01:43:24,300 Ļaujiet man samazināt termināļa logu, apskatīt sesto rindu. 2334 01:43:24,300 --> 01:43:26,160 Labi, 12 tagad ir būtiska. 2335 01:43:26,160 --> 01:43:28,665 Ja jūs veicat matemātiku galvā, kuras lielums ir n reizināts ar 3, 2336 01:43:28,665 --> 01:43:31,170 šeit ir kaut kā iesaistīts 12. 2337 01:43:31,170 --> 01:43:36,090 Bet sestā rinda tagad notiek šeit nākamā. 2338 01:43:36,090 --> 01:43:37,650 No turienes radās atmiņa. 2339 01:43:37,650 --> 01:43:38,500 Kas tas ir? 2340 01:43:38,500 --> 01:43:39,480 Ļaujiet man pietuvināt atpakaļ. 2341 01:43:39,480 --> 01:43:45,150 Kur ir nederīgs ieraksts, izmērs četri ? 2342 01:43:45,150 --> 01:43:47,820 Kas šeit varbūt notiek nepareizi? 2343 01:43:47,820 --> 01:43:49,830 Nederīgs ieraksts, izmērs četri. 2344 01:43:49,830 --> 01:43:50,880 Ko tas nozīmē? 2345 01:43:50,880 --> 01:43:53,850 Tas ir ļoti tehnisks izskaidrošanas veids. 2346 01:43:53,850 --> 01:43:55,560 Kļūda faktiski ir vienu rindiņu vēlāk, septītajā rindā, kā mēs jau 2347 01:43:55,560 --> 01:43:57,270 identificējām. 2348 01:43:57,270 --> 01:43:57,945 Jā. 2349 01:43:57,945 --> 01:43:58,820 Auditorija: [NESAKLAUSĀMS] 2350 01:43:58,820 --> 01:43:59,300 DEIVIDS Dž. Meilans: Patiešām. 2351 01:43:59,300 --> 01:44:00,467 Un pirms brīža es nepareizi runāju. 2352 01:44:00,467 --> 01:44:02,420 Kļūda faktiski rodas šeit ar devīto rindu. 2353 01:44:02,420 --> 01:44:06,575 Tātad pēc atmiņas piešķiršanas es kaut kā nepareizi uzrakstu 4 baitus. 2354 01:44:06,575 --> 01:44:08,997 Un diemžēl jums ir pienākums deduktīvi pārdomāt, ko tas varētu 2355 01:44:08,997 --> 01:44:11,420 nozīmēt. 2356 01:44:11,420 --> 01:44:13,608 Taču šajās dažās koda rindās es nepārprotami pieskaros 4 baitu 2357 01:44:13,608 --> 01:44:15,797 atmiņai, kam man nevajadzētu. 2358 01:44:15,797 --> 01:44:17,973 Un cerams, kā jau iepriekš sapratām, ak, es neesmu indeksējis no 2359 01:44:17,973 --> 01:44:20,150 nulles . 2360 01:44:20,150 --> 01:44:22,660 Labi, tas nozīmē, ka x, kvadrātiekava, trīs, kā jūs zināt, ir pārāk 2361 01:44:22,660 --> 01:44:25,170 tālu garām atmiņas daļai. 2362 01:44:25,170 --> 01:44:28,670 Tāpēc es nepareizi rakstu 4 baitos, ko man nevajadzētu darīt. 2363 01:44:28,670 --> 01:44:30,200 Tātad atkal, tas nav īpaši acīmredzams. 2364 01:44:30,200 --> 01:44:31,920 Tas nav īpaši lietotājam draudzīgi. 2365 01:44:31,920 --> 01:44:35,120 Bet tas vismaz sniedz nojausmu par to, kur šī kļūda atrodas. 2366 01:44:35,120 --> 01:44:38,570 Tāpēc risinājums būs vienkārši mainīt viens uz nulli, divi mainīt uz 2367 01:44:38,570 --> 01:44:42,020 viens un trīs mainīt uz divi. 2368 01:44:42,020 --> 01:44:42,775 Tas to izlabos. 2369 01:44:42,775 --> 01:44:44,150 Bet joprojām ir otra kļūda. 2370 01:44:44,150 --> 01:44:46,250 Un ļaujiet man vēlreiz apskatīt šifrēto rezultātu. 2371 01:44:46,250 --> 01:44:50,180 Kaudzes kopsavilkums, dažas lietas, labi, šeit tas neizklausās labi. 2372 01:44:50,180 --> 01:44:52,460 12 baiti vienā blokā noteikti tiek zaudēti zaudējumu atzīmē viens no 2373 01:44:52,460 --> 01:44:54,740 viens. 2374 01:44:54,740 --> 01:44:56,510 Ļoti noslēpumaina izvade divi. 2375 01:44:56,510 --> 01:44:59,970 Bet atkal skaidri saistīts ar sesto rindu, mūsu atmiņas sadalījumu. 2376 01:44:59,970 --> 01:45:02,300 Arī šeit nav skaidrs, kāds ir risinājums. 2377 01:45:02,300 --> 01:45:04,010 Bet atmiņa ir zaudēta. 2378 01:45:04,010 --> 01:45:05,900 AKA, šī ir atmiņas noplūde. 2379 01:45:05,900 --> 01:45:08,910 Un tagad dedukcija ir atkarīgs no jums. 2380 01:45:08,910 --> 01:45:09,720 Kas ir noplūde? 2381 01:45:09,720 --> 01:45:10,220 Ak, pagaidiet. 2382 01:45:10,220 --> 01:45:11,480 Es neizsaucu free. 2383 01:45:11,480 --> 01:45:13,861 Un tāpēc otrs risinājums šeit, iespējams, ir atbrīvot x pašās 2384 01:45:13,861 --> 01:45:16,242 programmas beigās. 2385 01:45:16,242 --> 01:45:18,594 Un, ja jūs patiešām vēlaties būt pedantisks, jums vajadzētu 2386 01:45:18,594 --> 01:45:20,946 pārbaudīt, kā es ierosināju iepriekš, vai x ir NULL, vienkārši 2387 01:45:20,946 --> 01:45:23,298 izejiet tagad, kamēr vēl varat, un pat nepieskarieties šīm pārējām 2388 01:45:23,298 --> 01:45:25,650 koda rindām. 2389 01:45:25,650 --> 01:45:27,410 Bet, ja nokļūstat apakšā, atgrieziet nulli. 2390 01:45:27,410 --> 01:45:30,470 Bet patiesībā es izlaboju masīva nulles indeksāciju, lai izvairītos 2391 01:45:30,470 --> 01:45:33,530 no “nederīgs ieraksts, izmērs četri”. 2392 01:45:33,530 --> 01:45:36,390 Un tagad es atbrīvoju atmiņu, ko es lūdzu. 2393 01:45:36,390 --> 01:45:37,927 Tāpēc noplūdei nevajadzētu pazust. 2394 01:45:37,927 --> 01:45:39,260 Labi, mēģināsim vēlreiz. 2395 01:45:39,260 --> 01:45:41,900 Make memory, dot, slash, memory. 2396 01:45:41,900 --> 01:45:43,370 Vēl nav redzamu kļūdu. 2397 01:45:43,370 --> 01:45:46,779 Bet ļaujiet man tagad atkal palielināt savu termināļa logu, ievadīt 2398 01:45:46,779 --> 01:45:50,188 punkts, slīpsvītra, memory, sakrustojot pirkstus, un tagad visi 2399 01:45:50,188 --> 01:45:53,598 kaudzes bloki tika atbrīvoti, noplūdes nav iespējamas. 2400 01:45:53,598 --> 01:45:54,890 Es neredzu nevienu nederīgu ierakstu. 2401 01:45:54,890 --> 01:45:56,150 Joprojām ir traki daudz izvades. 2402 01:45:56,150 --> 01:45:57,350 Bet nekas no tās nav kļūdains. 2403 01:45:57,350 --> 01:45:58,310 Tā nav slikta. 2404 01:45:58,310 --> 01:46:00,020 Tagad es izlaboju savas atmiņas kļūdas. 2405 01:46:00,020 --> 01:46:03,005 Un tā tagad mans PA, mans pasniedzēja aisistents, viņi arī tos 2406 01:46:03,005 --> 01:46:05,990 neatradīs, jo vismaz Valgrind ir proaktīvi to izdarījis manā vietā. 2407 01:46:05,990 --> 01:46:08,717 Jautājumi tad par Valgrindu? 2408 01:46:08,717 --> 01:46:11,300 Parasti tās ir divu veidu kļūdas, aiz kurām jūs varat paklupt. 2409 01:46:11,300 --> 01:46:14,720 Noslēpumainā izvadē nav pārāk daudz cita. 2410 01:46:14,720 --> 01:46:17,550 Vai tad ir jautājumi par šo? 2411 01:46:17,550 --> 01:46:18,050 Nē? 2412 01:46:18,050 --> 01:46:20,640 Labi, kas vēl varētu notikt? 2413 01:46:20,640 --> 01:46:22,530 Tātad kāds iepriekš uz to norādīja. 2414 01:46:22,530 --> 01:46:26,166 Kas notiek, ja, piemēram, aizmirstat NULL terminatoru vai vispār 2415 01:46:26,166 --> 01:46:29,803 sākat bakstīties atmiņā, ko pats nejautājāt, vai aplūkot vērtības, 2416 01:46:29,803 --> 01:46:33,440 kuras tur neievietojāt? 2417 01:46:33,440 --> 01:46:34,940 Nu, ļaujiet man iet uz priekšu un atvērt šo. 2418 01:46:34,940 --> 01:46:39,140 Garbage.c kods, par godu īgnajam Oskaram. 2419 01:46:39,140 --> 01:46:41,765 Un šeit ir vienkārša programma, ja es paslēpju savu termināļa logu, 2420 01:46:41,765 --> 01:46:44,390 kas vienkārši dara kaut ko patvaļīgu. 2421 01:46:44,390 --> 01:46:47,870 Vispirms es deklarēju masīvu, ko sauc par scores (rezultāti). 2422 01:46:47,870 --> 01:46:50,630 Bet es to izveidoju traki lielu, piemēram, 1024. 2423 01:46:50,630 --> 01:46:52,520 Tas ir daudz veselu skaitļu. 2424 01:46:52,520 --> 01:46:53,430 Bet lai tā būtu. 2425 01:46:53,430 --> 01:46:55,520 Un tad es integrēju šos veselos skaitļus. 2426 01:46:55,520 --> 01:46:57,350 Un es izdrukāju katru no šiem rādītājiem. 2427 01:46:57,350 --> 01:46:59,570 Tāpēc es šeit izmantoju otrās nedēļas sintaksi. 2428 01:46:59,570 --> 01:47:01,985 Bet, pamatojoties uz šo programmu, ko es skaidri neesmu izdarījis, ko 2429 01:47:01,985 --> 01:47:04,400 es izdarīju otrajā nedēļā? 2430 01:47:04,400 --> 01:47:09,600 Auditorija: [NESAKLAUSĀMS] 2431 01:47:09,600 --> 01:47:11,100 DEIVIDS Dž. Meilans: Jā, es neesmu inicializējis nevienu vērtību šim 2432 01:47:11,100 --> 01:47:12,600 masīvam. 2433 01:47:12,600 --> 01:47:14,160 Otrajā nedēļā mēs neņēmām 1024. 2434 01:47:14,160 --> 01:47:14,910 Mums bija trīs. 2435 01:47:14,910 --> 01:47:17,310 Un es ierakstīju trīs pārbaudes rezultātus vai kaut ko tamlīdzīgu. 2436 01:47:17,310 --> 01:47:19,810 Šeit es piešķiru atmiņu vēl vairāk tikai tāpēc, ka es patiešām vēlos 2437 01:47:19,810 --> 01:47:22,310 būt dramatisks ar to, ko es demonstrēju. 2438 01:47:22,310 --> 01:47:24,760 Bet es šīs vērtības neinicializēju. 2439 01:47:24,760 --> 01:47:28,568 Un tā šeit, izrādās, C valodā, parasti, ja jūs neinicializējat 2440 01:47:28,568 --> 01:47:32,376 mainīgo vai neinicializējat masīvu ar skaidrām vērtībām, tur būs, tā 2441 01:47:32,376 --> 01:47:36,184 sakot, atkritumi, šīs atmiņas paliekas. Iespējams, to izmantoja kāda 2442 01:47:36,184 --> 01:47:39,992 cita jūsu funkcija, kāda bibliotēkas funkcija vai kas cits, kamēr 2443 01:47:39,992 --> 01:47:43,800 programma darbojas. 2444 01:47:43,800 --> 01:47:46,480 Nav liela strādāšana ar tādu īpaši mazu programmu kā šī. 2445 01:47:46,480 --> 01:47:48,506 Bet jebkurai lielai vērtībai atmiņa tiks izmantota un neizmantota, un 2446 01:47:48,506 --> 01:47:50,533 izmantota, un neizmantota, kas atkal un atkal tiek apstrādāta ar 2447 01:47:50,533 --> 01:47:52,560 malloc un atbrīvota. 2448 01:47:52,560 --> 01:47:59,460 Pēc noklusējuma datora atmiņā būs daudz atkritumu vērtību. 2449 01:47:55,650 --> 01:47:58,510 Tātad, ja es atveru savu termināļa logu šeit, ļaujiet man izpildīt 2450 01:47:58,510 --> 01:48:01,370 make garbage, ļaujiet man tuvināt savu termināli, lai mēs varētu 2451 01:48:01,370 --> 01:48:04,230 redzēt izvadi. 2452 01:48:04,230 --> 01:48:07,837 Palaižot dot, slash, garbage, teorētiski man vajadzētu redzēt 1024 2453 01:48:07,837 --> 01:48:11,445 veselus skaitļus, taču neviens no tiem nav inicializēts. 2454 01:48:11,445 --> 01:48:13,320 Tagad man paveiksies ar dažiem no tiem. 2455 01:48:13,320 --> 01:48:16,470 Un izskatās, ka, labi, daudzi no tiem ir piešķirtas nulles. 2456 01:48:16,470 --> 01:48:19,620 Un C dažos kontekstos inicializē atmiņu ar nulli, vismaz sākumā, bet 2457 01:48:19,620 --> 01:48:22,770 parasti ne atkal un atkal. 2458 01:48:22,770 --> 01:48:26,775 Bet, ja es sāku ritināt atpakaļ laikā šajā masīvā ar izmēru 1024, no 2459 01:48:26,775 --> 01:48:30,780 kurienes radās šīs vērtības? 2460 01:48:30,780 --> 01:48:32,850 Tātad tikai nejauši pozitīvi un negatīvi skaitļi, kas mijas starp 2461 01:48:32,850 --> 01:48:34,920 nullēm? 2462 01:48:34,920 --> 01:48:37,530 Tas ir tāpēc, ka es burtiski ķēros pie nejaušajiem 1024 baitiem 2463 01:48:37,530 --> 01:48:40,140 datora atmiņā. 2464 01:48:40,140 --> 01:48:41,440 Kas zina, kas tur ir? 2465 01:48:41,440 --> 01:48:44,675 Tātad mācība šeit ir tāda, ka atkritumu vērtības patiešām ir šis R 2466 01:48:44,675 --> 01:48:47,910 termins. 2467 01:48:43,960 --> 01:48:46,970 Tas nozīmē, ka mainīgais, kuru jūs, iespējams, esat definējis, ko jūs 2468 01:48:46,970 --> 01:48:49,980 varētu būt deklarējis. 2469 01:48:49,980 --> 01:48:53,690 Ja jūs tam nepiešķirat skaidru vērtību, kas zina, kas tur būs? 2470 01:48:53,690 --> 01:48:55,440 Un mācība šeit ir tāda, ka tā vienkārši nedariet. 2471 01:48:55,440 --> 01:48:58,695 Vienmēr inicializējiet mainīgos ar kaut ko, vai nu pats, vai mudinot 2472 01:48:58,695 --> 01:49:01,950 cilvēku to darīt . 2473 01:49:01,950 --> 01:49:05,650 Jautājumi par atkritumu vērtībām. 2474 01:49:05,650 --> 01:49:08,620 Dažreiz jūs tās redzēsit, ja drukājat lietas, kuras nevajadzētu, vai 2475 01:49:08,620 --> 01:49:11,590 pieskarsieties masīviem ārpus to robežām. 2476 01:49:11,590 --> 01:49:12,090 Labi. 2477 01:49:12,090 --> 01:49:14,475 Tāpēc, iespējams, lai padarītu šo arī nedaudz vizuālu, izrādās, ka 2478 01:49:14,475 --> 01:49:16,860 daudzas lietas var noiet greizi, izmantojot norādes. 2479 01:49:16,860 --> 01:49:17,910 Un mēs esam redzējuši dažus no tām. 2480 01:49:17,910 --> 01:49:20,118 Un šeit ir vēl viena programma, kas ir nedaudz nereāla. 2481 01:49:20,118 --> 01:49:20,860 Tā ir ļoti vienkārša. 2482 01:49:20,860 --> 01:49:23,618 Un runa ir tikai par manipulācijām ar vērtībām. 2483 01:49:23,618 --> 01:49:25,299 Tā pati par sevi nedod neko noderīgu, izņemot dažus šodienas 2484 01:49:25,299 --> 01:49:26,980 jēdzienus. 2485 01:49:26,980 --> 01:49:30,305 Tātad, galvenais, ļaujiet man ierosināt, ka mēs deklarējam norādi ar 2486 01:49:30,305 --> 01:49:33,630 nosaukumu x, kas acīmredzot galu galā glabās vesela skaitļa adresi. 2487 01:49:33,630 --> 01:49:35,310 Šeit ir vēl viena ar nosaukumu y, kas glabās arī vesela skaitļa 2488 01:49:35,310 --> 01:49:36,990 adresi. 2489 01:49:36,990 --> 01:49:38,992 Šeit tagad es piešķiru pietiekami daudz atmiņas, lai ietilptu viens 2490 01:49:38,992 --> 01:49:40,995 vesels skaitlis. 2491 01:49:40,995 --> 01:49:42,120 Tagad tehniski tas ir četri. 2492 01:49:42,120 --> 01:49:42,662 Mēs to zinām. 2493 01:49:42,662 --> 01:49:45,720 Bet int lielums man vienkārši sniedz šo atbildi dinamiski. 2494 01:49:45,720 --> 01:49:47,760 Tātad tas darbosies visās sistēmās. 2495 01:49:47,760 --> 01:49:52,230 Un es saglabāšu adresi, ko malloc man atrod x. 2496 01:49:52,230 --> 01:49:56,610 Tad es dodos uz x un ievietoju tur skaitli 42. 2497 01:49:56,610 --> 01:49:57,690 Labi, kāpēc? 2498 01:49:57,690 --> 01:50:01,355 Dzīves jēga, Visums un viss šeit, bet zvaigznīte x atkal nozīmē tikai 2499 01:50:01,355 --> 01:50:05,020 doties uz šo adresi un ievietot tur vērtību. 2500 01:50:05,020 --> 01:50:05,670 Tad kāpēc? 2501 01:50:05,670 --> 01:50:06,240 Es nezinu. 2502 01:50:06,240 --> 01:50:08,610 Bet tas ir tikai pareizi šajā brīdī. 2503 01:50:08,610 --> 01:50:10,170 Bet kā ir ar šo līniju? 2504 01:50:10,170 --> 01:50:12,900 Zvaigznīte y ir vienāda ar 13. 2505 01:50:12,900 --> 01:50:14,280 Diemžēl šajā gadījumā. 2506 01:50:14,280 --> 01:50:17,362 Kas šajā rindā ir slikts, zvaigznīte y? 2507 01:50:17,362 --> 01:50:20,070 Tā ir mūsdienu primitīvu un šī punkta kombinācija. 2508 01:50:20,070 --> 01:50:20,922 Jā. 2509 01:50:20,922 --> 01:50:21,822 Auditorija: [NESAKLAUSĀMS] 2510 01:50:21,822 --> 01:50:24,780 DEIVIDS Dž. Meilans: Jā, mēs nelūdzām datoram piešķirt vietu. 2511 01:50:24,780 --> 01:50:28,750 Tātad y nevienā vietā netika inicializēts ar vienādības zīmi. 2512 01:50:28,750 --> 01:50:31,410 Un kas tad tā teikt ir iekšā y? 2513 01:50:31,410 --> 01:50:32,077 Atkritumu vērtība. 2514 01:50:32,077 --> 01:50:33,577 Varbūt tā ir nulle, kas nav slikti, jo tas vismaz ir jauki un 2515 01:50:33,577 --> 01:50:35,077 vienkārši. 2516 01:50:35,077 --> 01:50:36,863 Bet varbūt tas ir kāds traki liels pozitīvs skaitlis vai kāds traki 2517 01:50:36,863 --> 01:50:38,650 liels negatīvs skaitlis. 2518 01:50:38,650 --> 01:50:41,606 Jebkurā gadījumā, ja es došos uz šo adresi vai nejauši šo adresi ar 2519 01:50:41,606 --> 01:50:44,562 zvaigznīti y, notiks sliktas lietas. 2520 01:50:44,562 --> 01:50:46,020 Un tāpēc ļaujiet man iet uz priekšu un ierosināt. 2521 01:50:46,020 --> 01:50:47,200 Nu nedarīsim tā. 2522 01:50:47,200 --> 01:50:50,655 Tā vietā darīsim šādi, piešķirot y vienāds ar x. 2523 01:50:50,655 --> 01:50:51,780 Un mēs to esam darījuši iepriekš. 2524 01:50:51,780 --> 01:50:56,580 Un tad es tagad varu doties uz y un mainīt to, kas bija 42, uz 13. 2525 01:50:56,580 --> 01:50:57,120 Atkal, kāpēc? 2526 01:50:57,120 --> 01:50:58,840 Tas ir tikai izglītības nolūkos. 2527 01:50:58,840 --> 01:51:02,195 Taču pagaidām tas neavarē, jo es noņēmu referenci y ar zvaigznīti y 2528 01:51:02,195 --> 01:51:05,550 tikai pēc tam, kad faktiski piešķīru tai vērtību. 2529 01:51:05,550 --> 01:51:07,560 Lai gan tā ir dublikāta vērtība, kas ir līdzīga mūsu iepriekšējam 2530 01:51:07,560 --> 01:51:09,570 kopēšanas piemēram. 2531 01:51:09,570 --> 01:51:12,333 Tātad mūsu draugi Stenfordā ir izveidojuši brīnišķīgu vizuālizāciju. 2532 01:51:12,333 --> 01:51:13,500 Tā ir apmēram divas minūtes gara. 2533 01:51:13,500 --> 01:51:15,850 Ļaujiet man dramatiski aptumšot apgaismojumu, ja mēs varam, un 2534 01:51:15,850 --> 01:51:18,200 paspēlēties ar to, kas notiek ar atmiņu, kad darāt šādas sliktas 2535 01:51:18,200 --> 01:51:20,550 lietas. 2536 01:51:20,550 --> 01:51:21,334 [ATSKAŅO VIDEO] 2537 01:51:21,334 --> 01:51:23,923 [SKAN MŪZIKA ] 2538 01:51:23,923 --> 01:51:24,840 1. RUNĀTĀJS: Sveiki, Binkij. 2539 01:51:24,840 --> 01:51:25,620 Mosties. 2540 01:51:25,620 --> 01:51:28,230 Ir pienācis laiks izklaidēties ar norādēm. 2541 01:51:28,230 --> 01:51:29,310 BINKY: Kas tas ir? 2542 01:51:29,310 --> 01:51:30,960 Vai uzzināt vairāk par norādēm? 2543 01:51:30,960 --> 01:51:32,253 Ak, labprāt. 2544 01:51:32,253 --> 01:51:35,760 1. RUNĀTĀJS: Lai sāktu, man šķiet, mums būs vajadzīgas pāris norādes. 2545 01:51:35,760 --> 01:51:38,065 BINKY: Labi, šis kods piešķir divas norādes, kas var norādīt uz 2546 01:51:38,065 --> 01:51:40,370 veseliem skaitļiem. 2547 01:51:40,370 --> 01:51:42,352 1. RUNĀTĀJS: Labi, es redzu divas norādes. 2548 01:51:42,352 --> 01:51:44,310 Bet šķiet, ka tās ne uz ko nenorāda. 2549 01:51:44,310 --> 01:51:45,143 BINKY: Tieši tā. 2550 01:51:45,143 --> 01:51:47,220 Sākotnēji norādes ne uz ko nenorāda. 2551 01:51:47,220 --> 01:51:49,500 Lietas, uz kurām tās norāda, sauc par norādāmajiem. 2552 01:51:49,500 --> 01:51:51,243 Un to iestatīšana ir atsevišķs solis. 2553 01:51:51,243 --> 01:51:52,410 1. RUNĀTĀJS: Ak, pareizi, pareizi. 2554 01:51:52,410 --> 01:51:53,130 Es to zināju. 2555 01:51:53,130 --> 01:51:54,990 Norādāmie ir atsevišķi. 2556 01:51:54,990 --> 01:51:57,390 Tātad, kā jūs piešķirat norādāmo? 2557 01:51:57,390 --> 01:52:00,716 BINKY: Labi, šis kods piešķir jaunu veselu skaitli kā norādāmo, un šī 2558 01:52:00,716 --> 01:52:04,043 daļa iestata x, lai tas norādītu uz to. 2559 01:52:04,043 --> 01:52:05,460 1. RUNĀTĀJS: Hei, tas izskatās labāk. 2560 01:52:05,460 --> 01:52:07,040 Tāpēc liec tai kaut ko darīt. 2561 01:52:07,040 --> 01:52:09,830 BINKY: Labi, es noņemšu referenci uz norādi x, lai saglabātu skaitli 2562 01:52:09,830 --> 01:52:12,620 42 tā norādāmajā. 2563 01:52:12,620 --> 01:52:14,435 Šim trikam man būs nepieciešama mana burvju nūjiņa referenčuču 2564 01:52:14,435 --> 01:52:16,250 noņemšanai. 2565 01:52:16,250 --> 01:52:19,940 1. RUNĀTĀJS: Jūsu burvju nūjiņa referenčuču noņemšanai? 2566 01:52:19,940 --> 01:52:21,520 Tas ir lieliski. 2567 01:52:21,520 --> 01:52:23,200 BINKY: Šādi izskatās kods. 2568 01:52:23,200 --> 01:52:26,900 Es vienkārši iestatīšu numuru un... 1. RUNĀTĀJS: Hei, paskaties. 2569 01:52:26,900 --> 01:52:28,190 Tur tas iet. 2570 01:52:28,190 --> 01:52:31,715 Tātad, veicot references atcelšanu uz x, tiek sekots bultiņa, lai 2571 01:52:31,715 --> 01:52:35,240 piekļūtu tā norādāmajam, šajā gadījumā — lai saglabātu 42 tur. 2572 01:52:35,240 --> 01:52:37,505 Klau, mēģiniet to izmantot, lai saglabātu skaitli 13, izmantojot otru 2573 01:52:37,505 --> 01:52:39,770 norādi y. 2574 01:52:39,770 --> 01:52:41,180 BINKI: Labi. 2575 01:52:41,180 --> 01:52:50,948 [ATSKAN SIGNĀLS] Ak! 2576 01:52:50,948 --> 01:52:51,740 1. RUNĀTĀJS: Ak vai! 2577 01:52:51,740 --> 01:52:53,120 Tas nenostrādāja. 2578 01:52:53,120 --> 01:52:56,665 Sakiet, Binkij, es nedomāju, ka y referenču noņemšana ir laba ideja, 2579 01:52:56,665 --> 01:53:00,210 jo norādāmā iestatīšana ir atsevišķs solis. 2580 01:53:00,210 --> 01:53:02,600 Un es nedomāju, ka mēs to kādreiz izdarījām. 2581 01:53:02,600 --> 01:53:03,650 BINKY: Labs arguments. 2582 01:53:03,650 --> 01:53:06,485 1. RUNĀTĀJS: Jā, mēs piešķīrām norādi y, bet mēs nekad to 2583 01:53:06,485 --> 01:53:09,320 neiestatījām, lai tā norādītu uz norādāmo. 2584 01:53:09,320 --> 01:53:10,458 BINKY: Ļoti vērīgs. 2585 01:53:10,458 --> 01:53:12,500 1. RUNĀTĀJS: Ei, tu izskaties labi tur, Binkij. 2586 01:53:12,500 --> 01:53:15,440 Vai varat to izlabot tā, lai y norādītu uz to pašu punktu kā x? 2587 01:53:15,440 --> 01:53:16,160 BINKY: Protams. 2588 01:53:16,160 --> 01:53:18,782 Es izmantošu savu burvju nūjiņu norādes uzdevumam. 2589 01:53:18,782 --> 01:53:20,990 1. RUNĀTĀJS: Vai tā būs tāda problēma kā iepriekš? 2590 01:53:20,990 --> 01:53:22,910 BINKIJS: Nē, tas neskar norādāmos. 2591 01:53:22,910 --> 01:53:26,540 Tā tikai maina vienu norādi, lai norādītu uz to pašu, uz ko cita. 2592 01:53:26,540 --> 01:53:27,590 1. RUNĀTĀJS: Ak, es saprotu. 2593 01:53:27,590 --> 01:53:30,575 Tagad y norāda uz to pašu vietu, kur x. 2594 01:53:30,575 --> 01:53:32,150 Pagaidiet, tagad y ir salabots. 2595 01:53:32,150 --> 01:53:33,230 Tam ir norādāmais. 2596 01:53:33,230 --> 01:53:37,790 Tātad jūs varat vēlreiz mēģināt noņemt references, lai nosūtītu 13. 2597 01:53:37,790 --> 01:53:40,182 BINKY: Labi, lūk. 2598 01:53:40,182 --> 01:53:41,390 1. RUNĀTĀJS: Hei, paskaties uz to. 2599 01:53:41,390 --> 01:53:43,190 Tagad atsauču noņemšana darbojas uz y. 2600 01:53:43,190 --> 01:53:47,210 Un, tā kā norādēm ir kopīgs viens norādāmais, tās abas redz 13. 2601 01:53:47,210 --> 01:53:48,380 BINKY: Jā, dalīšanās. 2602 01:53:48,380 --> 01:53:48,920 Kaut kā tā. 2603 01:53:48,920 --> 01:53:50,917 Tātad mēs tagad mainīsimies vietām? 2604 01:53:50,917 --> 01:53:51,750 1. RUNĀTĀJS: Ak, paskaties. 2605 01:53:51,750 --> 01:53:52,575 Mums beidzās laiks. 2606 01:53:52,575 --> 01:53:53,270 [BEIDZ ATSKAŅOŠANU] 2607 01:53:53,270 --> 01:53:55,240 DEIVIDS Dž. Meilans: Mēs pateicamies profesoram Nikam Parlantam no 2608 01:53:55,240 --> 01:53:57,210 Stenfordas par to, ka viņš tam veltīja milzīgu laiku, veidojot 2609 01:53:57,210 --> 01:53:59,180 “stop-motion” animāciju. 2610 01:53:59,180 --> 01:54:01,896 Bet, cerams, tagad jūs apjaušat, kas var noiet greizi, ja šādi 2611 01:54:01,896 --> 01:54:04,612 nepareizi izmantojat atmiņu. 2612 01:54:04,612 --> 01:54:07,851 Bet galu galā mums šodien patiešām ir tikai šie četri jaunie bloki, 2613 01:54:07,851 --> 01:54:11,090 tas ir, zvaigznītes operators, & operators, malloc un free. 2614 01:54:11,090 --> 01:54:13,960 Patiešām, ņemot vērā to, kā arī izpratni par to, ko jūsu dators dara 2615 01:54:13,960 --> 01:54:16,830 zem pārsega, tagad mums ir šāds veids, kā patiešām manipulēt ar 2616 01:54:16,830 --> 01:54:19,700 atmiņu, lai kāds arī būtu iznākums. 2617 01:54:19,700 --> 01:54:21,960 Un galu galā mēs redzēsim, kā mēs varam lietas veidot. 2618 01:54:21,960 --> 01:54:24,350 Taču tagad mēs varam arī izmantot mūsdienu primitīvus, lai labāk 2619 01:54:24,350 --> 01:54:26,740 izskaidrotu dažas lietas, kuras pēdējo nedēļu laikā esam lūguši 2620 01:54:26,740 --> 01:54:29,130 uzskatīt par pašsaprotamām. 2621 01:54:29,130 --> 01:54:32,155 Tā, piemēram, ļaujiet man ierosināt, lai mēs darītu-- vienu 2622 01:54:32,155 --> 01:54:35,180 brīvprātīgo šeit, ja mēs varētu. 2623 01:54:35,180 --> 01:54:38,600 Vai mēs varētu dabūt vienu brīvprātīgo, kurš-- jūs vēlētos uznākt ? 2624 01:54:38,600 --> 01:54:39,810 Jā, tieši pa vidu. 2625 01:54:39,810 --> 01:54:40,070 Nāciet. 2626 01:54:40,070 --> 01:54:41,903 Tur būs jāpagriežas pa kreisi vai pa labi. 2627 01:54:47,760 --> 01:54:48,360 Labi. 2628 01:54:48,360 --> 01:54:52,380 Tātad mums šeit ir divas tukšas glāzes un divu krāsu šķidrums. 2629 01:54:52,380 --> 01:54:54,765 Un mums ir, ļaujiet man jums iedot mikrofonu, ja vēlaties 2630 01:54:54,765 --> 01:54:57,150 pasveicinātt grupu. 2631 01:54:57,150 --> 01:54:57,840 MOINE: Sveiki. 2632 01:54:57,840 --> 01:54:58,950 Es esmu Moine. 2633 01:54:58,950 --> 01:55:00,780 Es mācos [nesaklausāms] un pirmo gadu. 2634 01:55:00,780 --> 01:55:01,170 DEIVIDS Dž. Meilans: Labi. 2635 01:55:01,170 --> 01:55:01,670 Laipni lūdzam. 2636 01:55:01,670 --> 01:55:02,520 Nu, laipni lūdzam šeit. 2637 01:55:02,520 --> 01:55:05,400 Es turpināšu un piepildīšu šīs divas glāzes ar šo krāsaino šķidrumu, 2638 01:55:05,400 --> 01:55:08,280 kas ir violets un atrodas manā labajā pusē. 2639 01:55:08,280 --> 01:55:11,430 Piepildīsim glāzi šeit. 2640 01:55:11,430 --> 01:55:12,690 MOINE: Tas ir draudīgs. 2641 01:55:12,690 --> 01:55:14,460 DEIVIDS Dž. Malāns: Jā, nedzer to. 2642 01:55:14,460 --> 01:55:18,250 Un tagad mēs šeit ieliksim apelsīnu. 2643 01:55:18,250 --> 01:55:20,916 Un tas, ko mēs vēlētos, lai jūs nodemonstrētu auditorijai, ja jūs 2644 01:55:20,916 --> 01:55:23,583 neiebilstat, ir apmainītu abas vērtības. 2645 01:55:23,583 --> 01:55:25,500 Jums ir violeta un oranža vērtība. 2646 01:55:25,500 --> 01:55:27,577 Un es vēlētos, lai šajā glāzē būtu violets šķidrums un tajā glāzē 2647 01:55:27,577 --> 01:55:29,655 būtu oranžs šķidrums. 2648 01:55:32,652 --> 01:55:34,010 MOINE: Vai es varu palūgt vēl vienu glāzi? 2649 01:55:34,010 --> 01:55:34,550 DEIVIDS Dž. Malāns: Ak, labi. 2650 01:55:34,550 --> 01:55:35,390 Laba intuīcija. 2651 01:55:35,390 --> 01:55:38,600 Bet mikrofonam... MOINE: Vai es varu dabūt vēl vienu glāzi? 2652 01:55:38,600 --> 01:55:39,440 DAVID J. Malan: Tātad jūs varat. 2653 01:55:39,440 --> 01:55:41,552 Un patiesībā es jums vienu atnesu. 2654 01:55:41,552 --> 01:55:43,010 Kāpēc jūs to prasāt? 2655 01:55:43,010 --> 01:55:45,620 MOINE: Jo, ja es to vienkārši ieleju, tie tiks sajaukti. 2656 01:55:45,620 --> 01:55:46,537 DEIVIDS Dž. Meilans: Pareizi. 2657 01:55:46,537 --> 01:55:49,410 Tātad acīmredzot mums ir vajadzīgs pagaidu mainīgais, tā teikt. 2658 01:55:49,410 --> 01:55:52,765 Tātad, šeit ir jūsu pagaidu mainīgais. 2659 01:55:52,765 --> 01:55:54,330 MOINE: Un jūs vēlaties... Labi. 2660 01:55:54,330 --> 01:55:55,205 DEIVIDS Dž. Malāns: Jā. 2661 01:55:55,205 --> 01:55:56,640 Tur ir... jā. 2662 01:55:56,640 --> 01:56:00,015 Labi, tā teikt, ielejiet oranžās glāzes vērtību šajā pagaidu 2663 01:56:00,015 --> 01:56:03,390 mainīgajā. 2664 01:56:03,390 --> 01:56:04,080 Labi. 2665 01:56:04,080 --> 01:56:09,240 Un tagad ielejot violetās glāzes vērtību iepriekšējā oranžajā glāzē. 2666 01:56:09,240 --> 01:56:12,740 Un tagad... MOINE: Un tagad tas atgriežas. 2667 01:56:15,570 --> 01:56:17,767 DEIVIDS Dž. Meilans: Pagaidu vērtība tiek atgriezta oriģinālajā 2668 01:56:17,767 --> 01:56:19,965 violetajā glāzē. 2669 01:56:19,965 --> 01:56:21,548 Un tagad es domāju, ka mēs jums aplaudēsim par to, ka esat to 2670 01:56:21,548 --> 01:56:23,132 paveicis ļoti labi. 2671 01:56:23,132 --> 01:56:25,970 [NESAKLAUSĀMS] 2672 01:56:25,970 --> 01:56:27,120 MOINE: Paldies. 2673 01:56:27,120 --> 01:56:28,280 DEIVIDS Dž. Meilans: Labi. 2674 01:56:28,280 --> 01:56:31,680 Tāpēc ir pašsaprotami, ka reālajā pasaulē jūs to darāt tieši tā. 2675 01:56:31,680 --> 01:56:35,260 Un patiesībā kodā tas ir gandrīz tā, kā jums tas jādara, lai gan 2676 01:56:35,260 --> 01:56:38,840 kādreiz pajautājiet mums, kā to izdarīt smalki, bez pagaidu mainīgā. 2677 01:56:38,840 --> 01:56:41,090 Izrādās, ka tas ir iespējams, izmantojot bitus. 2678 01:56:41,090 --> 01:56:44,870 Bet šobrīd pieņemsim, ka tas patiešām parāda, kāda ir koda realitāte. 2679 01:56:44,870 --> 01:56:46,930 Ja vēlaties apmainīt divas vērtības, jums ir nepieciešams kaut kas 2680 01:56:46,930 --> 01:56:48,990 līdzīgs pagaidu mainīgajam. 2681 01:56:48,990 --> 01:56:52,416 Piemēram, ekrānā ir a-- sākums funkcijai, ko sauc par swap, kuras 2682 01:56:52,416 --> 01:56:55,843 mērķis dzīvē ir, kā jūs tikko darījāt, apmainīt divas vērtības, 2683 01:56:55,843 --> 01:56:59,270 nosauksim tās par A un B. 2684 01:56:56,420 --> 01:56:59,075 Tātad attiecīgi oranžā un violetākrāsa tagad ir tikai A un B un 2685 01:56:59,075 --> 01:57:01,730 veseli skaitļi, lai lietas būtu vienkāršas. 2686 01:57:01,730 --> 01:57:03,515 Tātad, šeit ir atbilstošais kods tam, ko jūs tikko ieviesāt kā 2687 01:57:03,515 --> 01:57:05,300 cilvēks. 2688 01:57:05,300 --> 01:57:07,970 Jūs norādījāt pagaidu mainīgo, šajā gadījumā pagaidu izsaukumu, kas 2689 01:57:07,970 --> 01:57:10,640 līdzinājās tam, ka es jums pasniedzu tukšo glāzi. 2690 01:57:10,640 --> 01:57:13,920 Un jūs tajā uzglabājāt oranžo šķidrumu, tā saukot A, pēc tam mainījāt 2691 01:57:13,920 --> 01:57:17,200 agrāk oranžās glāzesvērtību, lai tā būtu vienāda ar violeto, ielejot 2692 01:57:17,200 --> 01:57:20,480 vienu otrā. 2693 01:57:20,480 --> 01:57:22,040 Un tad jūs tur darījāt pretējo. 2694 01:57:22,040 --> 01:57:25,500 Beigās jums joprojām ir pagaidu mainīgais, kas tagad ir tukšs. 2695 01:57:25,500 --> 01:57:27,260 Tātad tas ir pagaiduburtiskā nozīmē. 2696 01:57:27,260 --> 01:57:28,552 Jums tas vienkārši vairs nav vajadzīgs. 2697 01:57:28,552 --> 01:57:30,570 Bet tas bija vajadzīgs procesā. 2698 01:57:30,570 --> 01:57:33,770 Tāpēc es uzdrošinos teikt, ka šis kods ir loģiski pareizs. 2699 01:57:33,770 --> 01:57:39,440 Izmantojot šo pagaidu mainīgo, tas apmainīs divas vērtības A un B. 2700 01:57:39,440 --> 01:57:42,600 Diemžēl, ja es to daru praksē, ļaujiet man pāriet uz VS Code šeit un 2701 01:57:42,600 --> 01:57:45,760 atvērt programmu, kuru es uzrakstīju iepriekš, ko sauc par swap.c, 2702 01:57:45,760 --> 01:57:48,920 kas to dara šādi. 2703 01:57:48,920 --> 01:57:52,790 Šeit ievērojiet, ka mans prototips swapfunkcijai ir pašā augšpusē. 2704 01:57:52,790 --> 01:57:54,590 Un ļaujiet man ritināt līdz pašai apakšai. 2705 01:57:54,590 --> 01:57:56,210 Šeit ir tieši tāds pats kods. 2706 01:57:56,210 --> 01:57:59,231 Tātad es esmu-- viens un tas pats kods divu vērtību A un B apmaiņai, 2707 01:57:59,231 --> 01:58:02,253 kas, manuprāt, ir pareizs. 2708 01:58:02,253 --> 01:58:04,670 Tagad, ja es atgriezīšos šeit, ko tas galvenokārt darīs mūsu labā? 2709 01:58:04,670 --> 01:58:08,220 Mainpatiesībā ir tikai jūsu algoritma pareizības demonstrācija. 2710 01:58:08,220 --> 01:58:11,440 Tātad šeit es paziņoju rindā septiņi un astoņi divi mainīgie, x un y, 2711 01:58:11,440 --> 01:58:14,660 kas ir attiecīgi viens un divi. 2712 01:58:14,660 --> 01:58:17,435 Pēc tam 10. rindā es vienkārši izdrukāju, kāda ir x vērtība un y, lai 2713 01:58:17,435 --> 01:58:20,210 es to varētu redzēt ekrānā. 2714 01:58:20,210 --> 01:58:23,495 Pēc tam es izsaucu swapfunkciju 11. rindā un burtiski vēlreiz 2715 01:58:23,495 --> 01:58:26,780 izdrukāju to pašu, izdrukāju x un y. 2716 01:58:26,780 --> 01:58:29,190 Cerams, ka tie acīmredzami būs otrādi. 2717 01:58:29,190 --> 01:58:31,640 Tāpēc es domāju loģiski, ka swappatiešām ir pareiza. 2718 01:58:31,640 --> 01:58:34,520 Ļaujiet man veikt make swapun pēc tam apmainīt ar slīpsvītru. 2719 01:58:34,520 --> 01:58:37,310 Un man vajadzētu redzēt, ka x ir 1, y ir 2, un tad, cerams, x ir 2, y 2720 01:58:37,310 --> 01:58:40,100 ir 1. 2721 01:58:40,100 --> 01:58:41,630 Enter. 2722 01:58:41,630 --> 01:58:42,980 Bet es neredzu. 2723 01:58:42,980 --> 01:58:46,800 Un tas darbojās tādā nozīmē, ka kods tika kompilēts, kods darbojās. 2724 01:58:46,800 --> 01:58:49,010 Tātad šajā ziņā tā nav kā kļūda. 2725 01:58:49,010 --> 01:58:52,450 Bet, tā kā es nesaprotu, kas notiek zem pārsega, vismaz šobrīd vai 2726 01:58:52,450 --> 01:58:55,890 iepriekšējās nedēļās, šis kods šeit patiešām ir kaut kādā veidā 2727 01:58:55,890 --> 01:58:59,330 kļūdains. 2728 01:58:59,330 --> 01:59:02,776 Bet vai kādam ir nojausma, iespējams, balstoties uz šodienas 2729 01:59:02,776 --> 01:59:06,223 diskusiju, kāpēc šis kods, lai arī loģiski pareizs, skaidri darbojas 2730 01:59:06,223 --> 01:59:09,670 realitātē, acīmredzami nedarbojas C valodā? 2731 01:59:09,670 --> 01:59:10,780 Kāda nojausma? 2732 01:59:10,780 --> 01:59:11,320 Jā. 2733 01:59:11,320 --> 01:59:13,980 Auditorija: [NESAKLAUSĀMS] 2734 01:59:13,980 --> 01:59:14,980 DEIVIDS Dž. Meilans: Perfekti. 2735 01:59:14,980 --> 01:59:17,147 Rezumējot, es apsolu profesionālo noslēpumu. 2736 01:59:17,147 --> 01:59:20,133 Izsaucot funkciju un nododot divus argumentus, piemēram, a un b, jūs 2737 01:59:20,133 --> 01:59:23,120 nododat šos argumentus pēc vērtības. 2738 01:59:23,120 --> 01:59:25,850 Tātad efektīvas šo vērtību kopijas. 2739 01:59:25,850 --> 01:59:29,110 Un tātad, kad šeit faktiski tiek izsaukta swap, atvainojiet. 2740 01:59:29,110 --> 01:59:31,682 Kad jūs nododat x un y, mēs tos saucam par a un b. 2741 01:59:31,682 --> 01:59:32,890 Bet tā ir tikai konvencija. 2742 01:59:32,890 --> 01:59:35,410 Mēs varētu saukt parametrus kā vien vēlamies. 2743 01:59:35,410 --> 01:59:38,610 Kas ir a un b, patiešām ir attiecīgi x un y vērtības, bet vērtību 2744 01:59:38,610 --> 01:59:41,810 kopijas. 2745 01:59:41,810 --> 01:59:44,460 Tātad šis kods šeit ir ļoti veiksmīgi, arī VS Code, apmaina a un b 2746 01:59:44,460 --> 01:59:47,110 vērtības. 2747 01:59:47,110 --> 01:59:50,686 Bet, kā jūs ievērojāt, tā kā es tos nododu pēc vērtības, burtiski 2748 01:59:50,686 --> 01:59:54,262 viens, burtiski divi, nevis pēc cita profesionālā termina, pēc 2749 01:59:54,262 --> 01:59:57,838 references, tas ir, pēc to adresēm, swap C valodā nav iespējas doties 2750 01:59:57,838 --> 02:00:01,414 uz šīm vietām, apmainīt faktiskās atrašanās vietas, tāpat kā mēs to 2751 02:00:01,414 --> 02:00:04,990 veiksmīgi darījām realitātē. 2752 02:00:04,990 --> 02:00:07,840 Bet es domāju, ka mums jau ir sintakse, lai to atrisinātu, ja mēs 2753 02:00:07,840 --> 02:00:10,690 uzskatām, ka tas tiešām ir tikai darbības apgabalajautājums. 2754 02:00:10,690 --> 02:00:13,420 Un mēs esam mazliet runājuši par darbības apgabalu pagātnē, kur 2755 02:00:13,420 --> 02:00:16,150 apgabalsattiecas uz kontekstu, kurā mainīgais dzīvo. 2756 02:00:16,150 --> 02:00:18,220 Un vispār es esmu apgalvojis, ka starp pēdējām figūriekavām pastāv 2757 02:00:18,220 --> 02:00:20,290 mainīgais. 2758 02:00:20,290 --> 02:00:23,980 Un tas gandrīz attiecas uz swap funkciju, jo a un b, es tagad vēlreiz 2759 02:00:23,980 --> 02:00:27,670 apgalvoju, pastāv tikai šajās figūriekavās. 2760 02:00:27,670 --> 02:00:29,859 Tiem nav nekādas ietekmes uz main augšdaļā, kurai ir citimainīgie x 2761 02:00:29,859 --> 02:00:32,048 un y. 2762 02:00:32,048 --> 02:00:34,840 Bet tagad mēs varam apsvērt, kas patiesībā notiek zem pārsega. 2763 02:00:34,840 --> 02:00:37,360 Un šeit ir tas pats atmiņas attēls, ko mēs esam redzējuši pagātnē. 2764 02:00:37,360 --> 02:00:39,280 Ja mēs pietuvinām un redzam šīs mazās melnās mikroshēmas, tas ir 2765 02:00:39,280 --> 02:00:41,200 atmiņas baitu kopums. 2766 02:00:41,200 --> 02:00:44,800 Ja es no tā izveidoju režģi, lai tikai izceltu, ka mēs varam piekļūt 2767 02:00:44,800 --> 02:00:48,400 katram no šiem baitiem, izmest plastmasas shēmas plati un 2768 02:00:48,400 --> 02:00:52,000 koncentrēties tikai uz šiem baitiem, kas notiek zem pārsega, kad 2769 02:00:52,000 --> 02:00:55,600 funkcijas tiek izsauktas C valodā, kuras jūs izpildāt jau nedēļas? 2770 02:00:55,600 --> 02:00:59,800 Šis atmiņas taisnstūris, ja mēs tālāk abstrahējamies, parasti ir 2771 02:00:59,800 --> 02:01:04,000 sadalīts dažādos reģionos vai segmentos, kā es tos nosaucu iepriekš. 2772 02:01:04,000 --> 02:01:07,760 Un dažādas lietas tiek ievietotas dažādās datora atmiņas daļās. 2773 02:01:07,760 --> 02:01:09,805 Un, pārāk neiedziļinoties niansēs, veicot dubultklikšķi uz programmas 2774 02:01:09,805 --> 02:01:11,850 savā Mac vai personālajā datorā vai izpildot dot slash , kaut kas 2775 02:01:11,850 --> 02:01:13,895 operētājsistēmā Linux, datora atmiņā tiek ielādēts mašīnas kods no 2776 02:01:13,895 --> 02:01:15,940 datora cietā diska. 2777 02:01:21,410 --> 02:01:24,690 Tātad visas nulles un vieninieki, kas veido Microsoft Word vai Chrome 2778 02:01:24,690 --> 02:01:27,970 vai jebko citu, tiek ielādēti datora atmiņā vai operatīvajā atmiņā. 2779 02:01:27,970 --> 02:01:29,665 Un saskaņā ar konvenciju tas ir novietots augšpusē tā sauktajā 2780 02:01:29,665 --> 02:01:31,360 mašīnkoda zonā. 2781 02:01:31,360 --> 02:01:34,660 Un tādā veidā centrālais procesors tiem ātri piekļūst. 2782 02:01:34,660 --> 02:01:37,450 Zemāk ir norādīts, kas būs mūsu globālie. 2783 02:01:37,450 --> 02:01:38,905 Tātad globālie mainīgie, kurus mēs neesam ļoti daudz izmantojuši 2784 02:01:38,905 --> 02:01:40,360 valodā C. 2785 02:01:40,360 --> 02:01:44,080 Bet jūs varat tos deklarēt ārpus main, pašā failu augšdaļā. 2786 02:01:44,080 --> 02:01:47,320 Ja jums ir globālie, tie arī nonāk tur, tikai jūsu informācijai. 2787 02:01:47,320 --> 02:01:49,900 Un tad ir šis lielais atmiņu gabals, ko mēs netieši agrāk redzējām 2788 02:01:49,900 --> 02:01:52,480 Valgrind pieminot, ko sauca par kaudzi. 2789 02:01:52,480 --> 02:01:54,340 Un tas burtiski atgādina kaudzi. 2790 02:01:54,340 --> 02:01:57,550 Tā ir atmiņas kaudze, kuru varat izmantot pēc saviem ieskatiem. 2791 02:01:57,550 --> 02:02:01,030 Un kaudze ir vieta, no kuras Malloc gūst atmiņu. 2792 02:02:01,030 --> 02:02:02,920 Tātad sākotnēji nekas nav tajā. 2793 02:02:02,920 --> 02:02:04,480 Tā ir tikai liela brīvas vietas daļa. 2794 02:02:04,480 --> 02:02:07,135 Ikreiz, kad izsaucat malloc, malloc no kaudzes apgabala izdala arvien 2795 02:02:07,135 --> 02:02:09,790 vairāk baitu. 2796 02:02:09,790 --> 02:02:13,480 Un malloc būtībā seko līdzi tam, kuri baiti jau ir piešķirti. 2797 02:02:13,480 --> 02:02:14,890 Tāpēc sākotnēji tas izskatās tukšs. 2798 02:02:14,890 --> 02:02:17,040 Taču dažādi baiti, kvadrāti, tā teikt, joprojām un atkal tiek 2799 02:02:17,040 --> 02:02:19,190 pieprasīti, jo programma darbojas, pateicoties tādām funkcijām kā 2800 02:02:19,190 --> 02:02:21,340 malloc. 2801 02:02:21,340 --> 02:02:23,900 Un tas aug, tā teikt, konceptuāli uz leju. 2802 02:02:23,900 --> 02:02:25,536 Tātad, jo vairāk un vairāk atmiņas pieprasāt no malloc, tas sāk 2803 02:02:25,536 --> 02:02:27,173 darboties šeit. 2804 02:02:27,173 --> 02:02:29,590 Bet tad nākamais gabals, ko jūs saņemat, ir šeit, lejā, konceptuāli. 2805 02:02:29,590 --> 02:02:31,250 Nākamais gabals ir šeit, lejā. 2806 02:02:31,250 --> 02:02:35,170 Tādējādi tas aizpilda pieejamo vietu datora kopējā atmiņā. 2807 02:02:35,170 --> 02:02:38,740 Bet ir vēl viena atmiņas daļa, ko sauc par steku. 2808 02:02:38,740 --> 02:02:42,040 Un tāpat kā paplāšu grēda Annenbergā vai kafejnīcā aug uz augšu, 2809 02:02:42,040 --> 02:02:45,340 tāpat aug stekatmiņa. 2810 02:02:45,340 --> 02:02:49,435 Un izrādās, ka steks ir vieta, kur funkcijām ir mainīgie, un tajās ir 2811 02:02:49,435 --> 02:02:53,530 īslaicīgi saglabāti argumenti. 2812 02:02:53,530 --> 02:02:56,890 Tātad ikreiz, kad izsaucat funkciju un tajā ir mainīgie vai tajā ir 2813 02:02:56,890 --> 02:03:00,250 arī argumenti, šī ir atmiņas daļa un datora kopējais atmiņas bloks, 2814 02:03:00,250 --> 02:03:03,610 kas tiek izmantots funkcijām. 2815 02:03:03,610 --> 02:03:06,425 Bet ikreiz, kad izsaucat malloc, tā ir atmiņa šeit augšā. 2816 02:03:06,425 --> 02:03:08,800 Galu galā viņiem vienkārši bija jāizvēlas virziens. 2817 02:03:08,800 --> 02:03:10,660 Augšā, apakšā un tehniski tas ir mākslinieka izpildījums. 2818 02:03:10,660 --> 02:03:13,310 Jūs varat riņķot ap šo lietu jebkurā vēlamajā virzienā. 2819 02:03:13,310 --> 02:03:14,925 Bet jūs izmantojat tikai ierobežotu atmiņas apjomu šajā parastajā 2820 02:03:14,925 --> 02:03:16,540 veidā. 2821 02:03:16,540 --> 02:03:19,360 Malloc sākas šeit, funkcijas sākas šeit. 2822 02:03:19,360 --> 02:03:22,415 Tagad jūs varat redzēt, kur var notikt sliktas lietas. 2823 02:03:22,415 --> 02:03:24,940 Un patiešām, viens no citiem iemesliem, kāpēc programmas, datori var 2824 02:03:24,940 --> 02:03:27,466 avarēt, ir tas, ja jūs prasāt pārāk daudz atmiņas no kaudzes, 2825 02:03:27,466 --> 02:03:29,992 izsaucot malloc daudzas, daudzas, daudzas reizes, vai ja izsaucat 2826 02:03:29,992 --> 02:03:32,518 pārāk daudz funkciju, vai nejauši pēdējā nedēļā, jūs atkārtojat 2827 02:03:32,518 --> 02:03:35,044 bezgalīgi daudzas reizes, iespējams, jums var būt segmentācijas 2828 02:03:35,044 --> 02:03:37,570 kļūme. 2829 02:03:37,570 --> 02:03:40,100 Un tas ir tāpēc, ka izmantojat pārāk daudz steka atmiņas. 2830 02:03:40,100 --> 02:03:42,460 Tāpēc galu galā tā noteikti būs problēma. 2831 02:03:42,460 --> 02:03:45,287 Un programmētāja pienākums ir tikai samazināt iespējamību to darīt un 2832 02:03:45,287 --> 02:03:48,115 patiešām izvairīties no iespējas to darīt, vienkārši pārbaudot 2833 02:03:48,115 --> 02:03:50,942 atgriešanas vērtības, pārbaudot, vai malloc vai get string atgriež 2834 02:03:50,942 --> 02:03:53,770 NULL. 2835 02:03:53,770 --> 02:03:56,533 Tā kā jūs varat aktīvi izmantot nosacījumus, lai nodrošinātu, ka šīs 2836 02:03:56,533 --> 02:03:59,296 divas lietas nesaskaras, vienkārši pārliecinoties, ka tiek atgrieztas 2837 02:03:59,296 --> 02:04:02,060 vērtības, kas nav NULL. 2838 02:04:02,060 --> 02:04:04,230 Tātad, aplūkosim steku swap kontekstā un to, kas šeit patiesībā 2839 02:04:04,230 --> 02:04:06,400 notiek. 2840 02:04:06,400 --> 02:04:10,094 Un Kārter, ja jūs neiebilstat man palīdzēt animēt ekrānu, kad es 2841 02:04:10,094 --> 02:04:13,788 izsaucu jebkuras programmas galveno funkciju, tai tiek piešķirta 2842 02:04:13,788 --> 02:04:17,483 atmiņas daļa, ko sauc par rāmi šīs kaudzes apakšā. 2843 02:04:17,483 --> 02:04:20,495 Tātad, ja Kārters vēlalas virzīties uz priekšu, šeit ir pirmā atmiņas 2844 02:04:20,495 --> 02:04:23,507 daļa, ko vienmēr izmantos main neatkarīgi no tā, vai tai ir 2845 02:04:23,507 --> 02:04:26,520 komandrindas argumenti vai vietējie mainīgie. 2846 02:04:26,520 --> 02:04:28,260 Tas vienkārši nonāk šeit atmiņā. 2847 02:04:28,260 --> 02:04:30,620 Pieņemsim, ka tagad saskaņā ar mūsu swap.c programmu, ka main izsauc 2848 02:04:30,620 --> 02:04:32,980 swap. 2849 02:04:32,980 --> 02:04:35,190 Nu, kur paliek swap atmiņa? 2850 02:04:35,190 --> 02:04:35,950 Tepat augšā. 2851 02:04:35,950 --> 02:04:39,390 Tātad swap bija divi mainīgie - divi argumenti - a un b. 2852 02:04:39,390 --> 02:04:41,140 Un tam bija arī pagaidu mainīgais. 2853 02:04:41,140 --> 02:04:42,993 Tātad tie visi nonāk šeit atmiņā. 2854 02:04:42,993 --> 02:04:45,889 Un, ja vēlaties turpināt un atkal virzīties uz priekšu, Kārter, kad 2855 02:04:45,889 --> 02:04:48,785 swap ir pabeidzis, neatkarīgi no tā, vai tā vienkārši atgriežas, jo 2856 02:04:48,785 --> 02:04:51,681 vairs nav koda rindiņu, vai arī jūs skaidri atgriežaties, šī atmiņa 2857 02:04:51,681 --> 02:04:54,577 vienkārši tiek atbrīvota automātiski. 2858 02:04:54,577 --> 02:04:55,410 Jūs neizsaucat free. 2859 02:04:55,410 --> 02:04:56,610 Jūs neatsaucat malloc. 2860 02:04:56,610 --> 02:04:58,110 Tas viss notiek automātiski. 2861 02:04:58,110 --> 02:04:59,880 Tas tā ir kopš pirmās nedēļas. 2862 02:04:59,880 --> 02:05:02,040 Tagad tehniski tas joprojām ir tur, lai gan esam to noņēmuši no 2863 02:05:02,040 --> 02:05:04,200 attēla. 2864 02:05:04,200 --> 02:05:06,870 Un šeit ir jūsu pirmais mājiens par atkritumu vērtībām. 2865 02:05:06,870 --> 02:05:08,340 Tur joprojām ir nulles un vieninieki. 2866 02:05:08,340 --> 02:05:11,340 Un tie ir atstāti oriģinālajā — iepriekšējā konfigurācijā. 2867 02:05:11,340 --> 02:05:14,535 Iemesls, kāpēc atmiņā tiek iegūtas nejaušas vērtības, ir tāpēc, ka, 2868 02:05:14,535 --> 02:05:17,730 lai gan mēs šeit neesam veikuši swap, pirms brīža tur bija lietas. 2869 02:05:17,730 --> 02:05:20,400 Tās būs tur, kad nākamreiz izmantosiet to pašu atmiņu. 2870 02:05:20,400 --> 02:05:23,250 Tagad dosimies uz priekšu un veiksim to nedaudz metodiskāk. 2871 02:05:23,250 --> 02:05:27,210 Main ir divi mainīgie, ko sauc par x un y - viens un divi. 2872 02:05:27,210 --> 02:05:29,580 Tātad virzīsimies uz priekšu un attēlosim x kā viens, y kā divi, kas 2873 02:05:29,580 --> 02:05:31,950 aizņem šos divus atmiņas gabalus. 2874 02:05:31,950 --> 02:05:36,375 Kad mēs tagad izsaucam swap, swap iegūst jaunu atmiņas daļu, kas pēc 2875 02:05:36,375 --> 02:05:40,800 tam dod mums trīs mainīgos, a un b, tehniski argumentus un temp. 2876 02:05:40,800 --> 02:05:41,820 Tātad, kas notiek? 2877 02:05:41,820 --> 02:05:45,625 Tā kā funkcijas automātiski nodod vērtību pēc vērtības vai drīzāk 2878 02:05:45,625 --> 02:05:49,430 nodod argumentus pēc vērtības, x tiek kopēts a, y tiek kopēts b, un 2879 02:05:49,430 --> 02:05:53,235 tad, kad mēs sākam izpildīt algoritmu, a la ūdens glāzes, nu, kas 2880 02:05:53,235 --> 02:05:57,040 notiek šeit? 2881 02:05:57,040 --> 02:05:59,375 Tātad, ja es izpildu pirmo koda rindiņu, temp ir vienāds ar a, temp 2882 02:05:59,375 --> 02:06:01,710 iegūst a kopiju. 2883 02:06:01,710 --> 02:06:03,645 Kas notiks tālāk? 2884 02:06:01,710 --> 02:06:05,880 a ir vienāds ar b.Tātad a iegūst b kopiju. 2885 02:06:05,880 --> 02:06:09,030 Un tagad mēs veicam galīgo maiņu glāzē, vai b ir vienāds ar temp. 2886 02:06:09,030 --> 02:06:10,890 b iegūst temp. 2887 02:06:10,890 --> 02:06:13,110 Tagad mums nav jāmaina temp, jo tā būtībā ir tukša, lai gan tur ir 2888 02:06:13,110 --> 02:06:15,330 atkritumu vērtība. 2889 02:06:15,330 --> 02:06:18,390 Viens vienmēr būs tur, līdz mēs atkārtoti izmantosim šo atmiņu. 2890 02:06:18,390 --> 02:06:21,240 Tomēr svarīgi ir tas, ka a un b ir apmainīti. 2891 02:06:21,240 --> 02:06:24,450 Bet, kas acīmredzami nav apmainīts, kā tas ir redzams, kad swap 2892 02:06:24,450 --> 02:06:27,660 atgriežas, x un y ir neskarti. 2893 02:06:27,660 --> 02:06:29,830 Jo tika nodotas to kopijas. 2894 02:06:29,830 --> 02:06:31,690 Tāpēc mums ir nepieciešams risinājums šai problēmai. 2895 02:06:31,690 --> 02:06:33,042 Un, ja mēs virzīsimies uz priekšu vēl vienu reizi, ja jūs 2896 02:06:33,042 --> 02:06:34,395 neiebilstat, ļaujiet man pāriet šeit, bet pēc tam pasaukt jūs pēc 2897 02:06:34,395 --> 02:06:35,748 sekundes. 2898 02:06:35,748 --> 02:06:38,310 Šis kods šeit ir loģiski pareizs. 2899 02:06:38,310 --> 02:06:39,540 Tas ir tas, ko jūs izdarījāt. 2900 02:06:39,540 --> 02:06:41,460 Bet šī tagad ir C iezīme. 2901 02:06:41,460 --> 02:06:43,860 Jūs nevarat vienkārši apmainīt lietas pēc vērtības, jo jūs to maināt 2902 02:06:43,860 --> 02:06:46,260 tikai swap funkcijas ietvaros. 2903 02:06:46,260 --> 02:06:49,380 Bet es domāju, ka, mainot to uz šo un pievienojot kādu kaitinošu 2904 02:06:49,380 --> 02:06:52,500 sintaksi, mēs varam atrisināt problēmu. 2905 02:06:52,500 --> 02:06:55,120 Tāpat kā jūs varat deklarēt mainīgos kā glabāšanas adreses, jūs varat 2906 02:06:55,120 --> 02:06:57,740 deklarēt argumentus funkcijām, tas ir, parametrus, kā pieņemšanas 2907 02:06:57,740 --> 02:07:00,360 adreses. 2908 02:07:00,360 --> 02:07:04,950 Šī jaunā swap versija nozīmē, ka a ir vesela skaitļa adrese. 2909 02:07:04,950 --> 02:07:07,050 b ir vesela skaitļa adrese. 2910 02:07:07,050 --> 02:07:09,150 Un tagad šeit tas kļūst mazliet šifrēti. 2911 02:07:09,150 --> 02:07:10,710 Temp ir tāda pati, jo tas ir tikai vesels skaitlis, kā tas bija 2912 02:07:10,710 --> 02:07:12,270 pirmajā nedēļā. 2913 02:07:12,270 --> 02:07:14,040 Nekas īpašs ar temp. 2914 02:07:14,040 --> 02:07:18,135 Bet, ja vēlaties iegūt a vērtību, izpildiet zvaigznīte a. 2915 02:07:18,135 --> 02:07:21,150 Un tas iet uz adresi, paņem skaitli viens, iespējams. 2916 02:07:21,150 --> 02:07:23,870 Ja vēlaties mainīt a vērtību, dodieties uz šo adresi, sekojiet 2917 02:07:23,870 --> 02:07:26,590 dārgumu kartei uz otru pastkasti un iestatiet to vienādu ar to, kas 2918 02:07:26,590 --> 02:07:29,310 ir b vērtībā. 2919 02:07:29,310 --> 02:07:30,900 Tu arī ej uz b. 2920 02:07:30,900 --> 02:07:33,945 Pēdējā rindiņā tagad dodieties uz b un mainiet to, lai tas būtu kāds 2921 02:07:33,945 --> 02:07:36,990 bija pagaidu mainīgais, kas bija tāds pats kā a. 2922 02:07:36,990 --> 02:07:39,300 Šeit tiek apmainīta galīgā vērtība. 2923 02:07:39,300 --> 02:07:41,850 Bet šeit ir daudz vairāk, metaforiski izsakoties, krustojumu visā 2924 02:07:41,850 --> 02:07:44,400 posmā, kurā jūs dodaties uz visām šīm dažādajām adresēm swapfunkcijā, 2925 02:07:44,400 --> 02:07:46,950 lai veiktu šīs izmaiņas. 2926 02:07:46,950 --> 02:07:49,215 Tātad, ja mēs tagad pārejam pie šīs vizuālās versijas, šeit ir tas 2927 02:07:49,215 --> 02:07:51,480 pats stāsts, kā iepriekš ar main. 2928 02:07:51,480 --> 02:07:53,700 Un x un y ir attiecīgi viens un divi. 2929 02:07:53,700 --> 02:07:57,690 Kad tagad tiek izsaukts swap, ievērojiet, un es to darīšu ar bultiņām 2930 02:07:57,690 --> 02:08:01,680 šeit, a faktiski norāda uz x, b faktiski norāda uz y. 2931 02:08:01,680 --> 02:08:04,290 Ja mēs patiešām iedziļināmies sīkumos, tad patiesībā tās ir adreses. 2932 02:08:04,290 --> 02:08:05,910 Bet kam rūp nianses? 2933 02:08:05,910 --> 02:08:07,540 Šeit patiesībā ir tikai koncepts. 2934 02:08:07,540 --> 02:08:08,700 Tātad, kas tagad notiek? 2935 02:08:08,700 --> 02:08:10,500 Int temp iegūst zvaigznīti a. 2936 02:08:10,500 --> 02:08:12,840 Zvaigznīte a nozīmē sāciet ar a un dodieties uz turieni. 2937 02:08:12,840 --> 02:08:14,160 Sekojiet bultiņai, tā teikt. 2938 02:08:14,160 --> 02:08:15,570 Sava veida galda spēle Cirks. 2939 02:08:15,570 --> 02:08:16,620 Un tad tas ir viens. 2940 02:08:16,620 --> 02:08:18,010 Tāpēc mēs ievietojām vienu temp. 2941 02:08:18,010 --> 02:08:18,510 Labi. 2942 02:08:18,510 --> 02:08:20,123 Zvaigznīte a ir vienāds ar zvaigznīte b. 2943 02:08:20,123 --> 02:08:21,540 Tātad darīsim to no labās uz kreiso pusi. 2944 02:08:21,540 --> 02:08:23,220 Zvaigznīte b nozīmē sekot bultiņai. 2945 02:08:23,220 --> 02:08:24,050 Tas ir divi. 2946 02:08:24,050 --> 02:08:25,050 Un ko tad darīt? 2947 02:08:25,050 --> 02:08:26,040 Sekojiet bultiņai. 2948 02:08:26,040 --> 02:08:27,915 Tagad tie ir divi, jo jūs kopējat vienu uz otru no labās uz kreiso 2949 02:08:27,915 --> 02:08:29,790 pusi. 2950 02:08:29,790 --> 02:08:31,740 Visbeidzot, zvaigznīte b iegūst temp. 2951 02:08:31,740 --> 02:08:33,270 Tātad sāciet ar b, pārejiet uz b. 2952 02:08:33,270 --> 02:08:36,330 Un tagad saglabājiet visu vērtību temp. 2953 02:08:36,330 --> 02:08:39,037 Tātad, tikai izmantojot šo pamata jauno sintaksi, piemēram, & zīmi, 2954 02:08:39,037 --> 02:08:41,745 zvaigznītes un tā tālāk, mēs faktiski tagad varam doties uz vietām un 2955 02:08:41,745 --> 02:08:44,452 apiet to, kas citādi ir C iezīme, ka šie mainīgie tiek lokāli 2956 02:08:44,452 --> 02:08:47,160 aptverti. 2957 02:08:47,160 --> 02:08:50,265 Bet jūs joprojām varat piekļūt lietām arī citās funkcijās. 2958 02:08:50,265 --> 02:08:52,390 Tāpēc liels paldies, ka palīdzējāt atrisināt šo problēmu. 2959 02:08:52,390 --> 02:08:56,110 Tāpēc tagad mums ir šī lietojumprogramma, kas izskaidro, kāpēc tagad 2960 02:08:56,110 --> 02:08:59,830 šajā C koda versijā tas faktiski darbojas. 2961 02:08:59,830 --> 02:09:03,030 Tātad patiesībā ļaujiet man atgriezties pie mana swap koda šeit. 2962 02:09:03,030 --> 02:09:06,030 Un ļaujiet man tik nedaudz mainīt funkciju VS kodā. 2963 02:09:06,030 --> 02:09:08,800 Tāpēc ļaujiet man ritināt uz leju, atstājot main tādu pašu. 2964 02:09:08,800 --> 02:09:13,590 Un ļaujiet man mainīt swap prototipu uz adrešu ievadīšanu. 2965 02:09:13,590 --> 02:09:17,760 Ļaujiet man doties uz b, šeit. 2966 02:09:17,760 --> 02:09:19,590 Un ļaujiet man doties uz b arī šeit. 2967 02:09:19,590 --> 02:09:20,930 Bet nekas cits nemainās. 2968 02:09:20,930 --> 02:09:24,300 Jo īpaši šīs izmaiņas ir pietiekamas, lai saprastu, ka, izsaucot swap 2969 02:09:24,300 --> 02:09:27,670 un ievadot divas vērtības, es sagaidu adreses, nevis veselus 2970 02:09:27,670 --> 02:09:31,040 skaitļus. 2971 02:09:31,040 --> 02:09:34,265 Bet tagad, kad esmu veicis šīs izmaiņas, man ir jāpāriet uz main un 2972 02:09:34,265 --> 02:09:37,490 jāveic viena izmaiņa. 2973 02:09:37,490 --> 02:09:41,090 Vai kādam ir intuīcija par to, kas tagad ir jāmaina galvenokārt, lai 2974 02:09:41,090 --> 02:09:44,690 es ievadītu x un y pēc references, tas ir, pēc adreses, nevis pēc 2975 02:09:44,690 --> 02:09:48,290 vērtības vai kopijas? 2976 02:09:48,290 --> 02:09:49,652 Jā, aizmugurē. 2977 02:09:49,652 --> 02:09:52,198 Auditorija: [NESAKLAUSĀMS] 2978 02:09:52,198 --> 02:09:53,240 DEIVIDS Dž. Meilans: Tik tuvu. 2979 02:09:53,240 --> 02:09:57,170 Tātad swap līnijā tā nav zvaigznīte, ko es vēlos x un y priekšā. 2980 02:09:57,170 --> 02:10:00,720 Auditorija: [NESAKLAUSĀMS] 2981 02:10:00,720 --> 02:10:01,560 DEIVIDS Dž. Meilans: Kas ir otrs? 2982 02:10:01,560 --> 02:10:02,380 Auditorija: Konjunkcijas zīme. 2983 02:10:02,380 --> 02:10:03,235 DEIVIDS Dž. Meilans: Tā ir &. 2984 02:10:03,235 --> 02:10:03,735 Kāpēc? 2985 02:10:03,735 --> 02:10:06,563 Jo, ja es vēlos iespējot swap, lai kaut kur nonāktu, tāpat kā mēs ar 2986 02:10:06,563 --> 02:10:09,391 Kārteru spēlējām šo spēli ar pastkastēm, man ir jāinformē swap par x 2987 02:10:09,391 --> 02:10:12,220 adresi un y adresi. 2988 02:10:12,220 --> 02:10:14,470 Un atkal, šodienas nodarbības sākumā konjukcijas zīme ir sintakse, ar 2989 02:10:14,470 --> 02:10:16,720 kuras palīdzību mēs to darām. 2990 02:10:16,720 --> 02:10:18,790 Tāpēc es pievienoju konjukcijas zīmi šeit, lai iegūtu x adresi, un 2991 02:10:18,790 --> 02:10:20,860 konjukcijas zīmi šeit, lai iegūtu y adresi. 2992 02:10:20,860 --> 02:10:23,070 Un tagad šis kods sakrīt ar attēlu, kuram Kārters tikko palīdzēja 2993 02:10:23,070 --> 02:10:25,280 mums iziet cauri. 2994 02:10:25,280 --> 02:10:29,360 Un tāpēc, kad es palaižu make swap šeit, man ir kļūda. 2995 02:10:29,360 --> 02:10:30,670 Ak, ko es izdarīju nepareizi? 2996 02:10:30,670 --> 02:10:31,600 Neapzināti. 2997 02:10:31,600 --> 02:10:34,240 Bet es domāju, ka ir vērts atzīmēt. 2998 02:10:34,240 --> 02:10:35,230 Es te saputrojos. 2999 02:10:35,230 --> 02:10:39,235 Tam nepatīk & x, jo ir kaut kas trešajā rindā, kas ir pārāk agri koda 3000 02:10:39,235 --> 02:10:43,240 sākumā. 3001 02:10:43,240 --> 02:10:44,470 Ko es saputroju? 3002 02:10:44,470 --> 02:10:45,490 Jā, pa vidu. 3003 02:10:45,490 --> 02:10:47,757 Auditorija: [NESAKLAUSĀMS] 3004 02:10:47,757 --> 02:10:50,486 DEIVIDS Dž. Meilans: Jā, tāpēc mēs-- jums nevajadzētu kopēt ielīmēt, 3005 02:10:50,486 --> 02:10:53,215 lai gan tas ir nepieciešams, piemēram, funkciju prototipiem. 3006 02:10:53,215 --> 02:10:56,240 Ja es nomainīju swap apakšā, man ir jāmaina tā prototips. 3007 02:10:56,240 --> 02:10:58,510 Tāpēc ļaujiet man pievienot zvaigznīti tur, pievienot zvaigznīti vai 3008 02:10:58,510 --> 02:11:00,780 vienkārši atkārtoti kopēt un ielīmēt to faila augšdaļā. 3009 02:11:00,780 --> 02:11:02,490 Tagad ļaujiet man atkal veikt make swap. 3010 02:11:02,490 --> 02:11:03,980 Ļaujiet man tagad veikt dot slash swap. 3011 02:11:03,980 --> 02:11:06,530 Un tagad man vajadzētu redzēt, ka x ir 1, y ir 2. 3012 02:11:06,530 --> 02:11:10,760 Un, cerams, x ir 2, y ir 1, ko es tagad redzu. 3013 02:11:10,760 --> 02:11:12,017 Tātad loģika ir tāda pati. 3014 02:11:12,017 --> 02:11:13,100 Algoritms ir vienāds. 3015 02:11:13,100 --> 02:11:14,810 Visas nultās nedēļas lietas ir vienādas. 3016 02:11:14,810 --> 02:11:17,896 Izņemot tagad ceturtajā nedēļā, jums ir tikai nedaudz vairāk 3017 02:11:17,896 --> 02:11:20,983 izteiksmīguma, ar kura palīdzību jūs varat precīzi pateikt datoram, 3018 02:11:20,983 --> 02:11:24,070 ar ko un kā vēlaties manipulēt. 3019 02:11:24,070 --> 02:11:29,250 Vai jums ir jautājumi par šo tehniku? 3020 02:11:29,250 --> 02:11:29,750 Nē? 3021 02:11:29,750 --> 02:11:30,250 Labi. 3022 02:11:30,250 --> 02:11:33,072 Kad mēs to novērsīsim, joprojām būs problēmas. 3023 02:11:33,072 --> 02:11:35,514 Un tā, jūs esat šeit redzējuši dažus profesionālos terminus, tas ir 3024 02:11:35,514 --> 02:11:37,957 slikti, ja jums ir divas bultiņas, kas norāda viena uz otru, protams, 3025 02:11:37,957 --> 02:11:40,400 ja jūs varētu izmantot un atkārtoti izmantot arvien vairāk atmiņas. 3026 02:11:40,400 --> 02:11:42,672 Un izrādās, ka ir daži profesionālie termini, kuriem pēkšņi tagad var 3027 02:11:42,672 --> 02:11:44,945 parādīties jēga, it īpaši, ja esat programmējis iepriekš. 3028 02:11:44,945 --> 02:11:47,210 Ar šo dizainu var notikt sliktas lietas. 3029 02:11:47,210 --> 02:11:48,940 Bet patiesībā ir tikai šāda veida dizains, jo tas ir ierobežots 3030 02:11:48,940 --> 02:11:50,670 atmiņas apjoms. 3031 02:11:50,670 --> 02:11:52,370 Tāpēc kādā brīdī notiks sliktas lietas neatkarīgi no tā, kas notiks, 3032 02:11:52,370 --> 02:11:54,070 ja datoram pietrūks atmiņas. 3033 02:11:54,070 --> 02:11:55,820 Tāpēc nav tā, ka tas bija slikts lēmums. 3034 02:11:55,820 --> 02:11:57,650 Tā ir tikai sava veida nepieciešama, ņemot vērā ierobežotu atmiņas 3035 02:11:57,650 --> 02:11:59,480 apjomu datorā. 3036 02:11:59,480 --> 02:12:02,390 Bet, tā sakot, kaudzes pārplūde ir tad, kad jūs faktiski pārpildat 3037 02:12:02,390 --> 02:12:05,300 kaudzi un pieskaraties atmiņai, kurai jums nevajadzētu tur augšā. 3038 02:12:05,300 --> 02:12:07,665 Steka pārpildīšana ir tad, kad jūs kaut kā pārpildat steku un 3039 02:12:07,665 --> 02:12:10,030 pieskaraties atmiņai, kurai nevajadzētu. 3040 02:12:10,030 --> 02:12:12,780 Tā sakot, tās patiešām ir tikai problēmas, kas var rasties. 3041 02:12:12,780 --> 02:12:14,695 Un tie ir īpaši iemiesojumi tam, ko parasti sauc par bufera 3042 02:12:14,695 --> 02:12:16,610 pārpildīšanu. 3043 02:12:16,610 --> 02:12:19,820 Buferis, tāpat kā YouTube izpratnē, ir tikai atmiņas daļa, kas 3044 02:12:19,820 --> 02:12:23,030 YouTube gadījumā saglabā nākamās video sekundes vai minūtes. 3045 02:12:23,030 --> 02:12:25,830 Bet vispārīgi runājot, buferis ir tikai atmiņas daļa, ko dators 3046 02:12:25,830 --> 02:12:28,630 izmanto kādam nolūkam, vai tas būtu steks, vai tā būtu kaudze, vai 3047 02:12:28,630 --> 02:12:31,430 tas būtu masīvs datorā. 3048 02:12:31,430 --> 02:12:37,100 Tādējādi bufera pārpildes notiek, ja kodā ir tikai loģiskas kļūdas. 3049 02:12:37,100 --> 02:12:39,575 Bet, paturot prātā šos primitīvus, mēs vēlējāmies pabeigt ar pēdējo 3050 02:12:39,575 --> 02:12:42,050 atklāsmi. 3051 02:12:42,050 --> 02:12:44,940 Un tā darbojas dažas funkcijas, piemēram, šīs šeit esošās. 3052 02:12:44,940 --> 02:12:47,590 Otra lieta CS50 bibliotēkā, bez typedef pēdiņās “virkne”, protams, ir 3053 02:12:47,590 --> 02:12:50,240 visas šīs funkcijas. 3054 02:12:50,240 --> 02:12:51,573 Un mēs jums sniedzam šīs funkcijas. 3055 02:12:51,573 --> 02:12:55,001 Jo godīgi C valodā tas ir grūti, kaitinoši, sāpīgi, ir grūti pareizi 3056 02:12:55,001 --> 02:12:58,430 iegūt lietotāja ievadi. 3057 02:12:58,430 --> 02:13:01,355 Tas ir ļoti vienkārši, ja nezināt, cik daudz cilvēks rakstīs, lai 3058 02:13:01,355 --> 02:13:04,280 ierakstītu kļūdainu kodu. 3059 02:13:04,280 --> 02:13:07,105 Patiešām, ir patiešām grūti to pareizi uzglabāt bez nejaušas bufera 3060 02:13:07,105 --> 02:13:09,930 pārpildes. 3061 02:13:09,930 --> 02:13:12,150 Piemēram, es jums parādīšu programmu. 3062 02:13:12,150 --> 02:13:14,400 Es iešu uz priekšu un uzrakstīšu šo no nulles. 3063 02:13:14,400 --> 02:13:18,175 Tāpēc ļaujiet man atvērt failu ar nosaukumu get.c, kurā es atdarināšu 3064 02:13:18,175 --> 02:13:21,950 ideju par veselu skaitļu manuālu iegūšanu bez CS50 bibliotēkas. 3065 02:13:21,950 --> 02:13:25,610 Tāpēc es iekļaušu tikai standardio.h, definēšu main par komandrindas 3066 02:13:25,610 --> 02:13:29,270 argumentu neizmantošanu, un tad es darīšu kaut ko līdzīgu šim. 3067 02:13:29,270 --> 02:13:31,850 Dodiet man mainīgo x bez vērtības. 3068 02:13:31,850 --> 02:13:34,250 Un parasti es darītu kaut ko līdzīgu, piemēram, get int. 3069 02:13:34,250 --> 02:13:35,450 Bet ļaujiet man to noņemt. 3070 02:13:35,450 --> 02:13:37,490 Vairs nav arī palīgritenīšu get int 3071 02:13:37,490 --> 02:13:39,890 Tāpēc ļaujiet man definēt int x. 3072 02:13:39,890 --> 02:13:44,270 Pēc tam ļaujiet man izdrukāt kaut ko līdzīgu uzvednei. 3073 02:13:44,270 --> 02:13:46,300 Un es vienkārši ievadīšu x, kols, lai cilvēkam būtu skaidrs, ko mēs 3074 02:13:46,300 --> 02:13:48,330 gaidām. 3075 02:13:48,330 --> 02:13:50,065 Un tagad es izmantošu iebūvēto C funkciju, lai iegūtu lietotāja 3076 02:13:50,065 --> 02:13:51,800 ievadi. 3077 02:13:51,800 --> 02:13:54,200 Es izsaukšu funkciju ar nosaukumu scanf, kas skenē lietotāja 3078 02:13:54,200 --> 02:13:56,600 tastatūru, lai iegūtu ievadi. 3079 02:13:56,600 --> 02:13:58,400 Es skenēšu to, meklējot veselu skaitli. 3080 02:13:58,400 --> 02:14:01,850 Tāpat kā printf, es izmantošu i, jo es sagaidu int. 3081 02:14:01,850 --> 02:14:04,745 Un tad es gribu pateikt scanf, kur no tastatūras ievietot cilvēka 3082 02:14:04,745 --> 02:14:07,640 veselo skaitli. 3083 02:14:07,640 --> 02:14:09,950 Tomēr nav pareizi teikt x. 3084 02:14:09,950 --> 02:14:12,770 Jo, ja es saku x, es saskaros ar to pašu swap problēmu. 3085 02:14:12,770 --> 02:14:13,490 Scanf. 3086 02:14:13,490 --> 02:14:16,845 Neviena funkcija nevar mainīt x vērtību, ja vien es to nenododu nevis 3087 02:14:16,845 --> 02:14:20,200 pēc vērtības, bet ar referenci. 3088 02:14:20,200 --> 02:14:22,020 Tātad mēs esam atpakaļ pie mūsu & drauga. 3089 02:14:22,020 --> 02:14:25,009 Un tagad tai ir dārgumu karte līdz faktiskajai x atrašanās vietai, un 3090 02:14:25,009 --> 02:14:27,998 tāpēc to var mainīt. 3091 02:14:27,998 --> 02:14:31,142 Un tāpēc tagad šīs programmas pašās beigās ļaujiet man izdarīt kaut 3092 02:14:31,142 --> 02:14:34,286 ko vienkāršu, piemēram, ejam uz priekšu un izdrukāsim ar printf x 3093 02:14:34,286 --> 02:14:37,430 vērtību, izmantojot %i kā vienmēr pievienojot x, nevis konjukcijas 3094 02:14:37,430 --> 02:14:40,575 zīmi x. 3095 02:14:40,575 --> 02:14:41,700 Šīs tagad ir pirmās nedēļas lietas. 3096 02:14:41,700 --> 02:14:44,430 Es vēlos izdrukāt x faktisko veselā skaitļa vērtību. 3097 02:14:44,430 --> 02:14:46,800 Tātad vienīgās izmaiņas šeit ir tādas, ka tā vietā, lai izmantotu get 3098 02:14:46,800 --> 02:14:49,170 int, es tagad izmantoju šo jauno funkciju, kas līdz šim ir saukta par 3099 02:14:49,170 --> 02:14:51,540 scanf. 3100 02:14:51,540 --> 02:14:54,600 Tāpēc ļaujiet man iet uz priekšu un palaist get. 3101 02:14:54,600 --> 02:14:56,400 Make get, lai izveidotu šo programmu. 3102 02:14:56,400 --> 02:14:57,632 Dot slash get. 3103 02:14:57,632 --> 02:14:59,340 Dosimies uz priekšu un ierakstīsim x vērtību. 3104 02:14:59,340 --> 02:15:01,080 Enter. 3105 02:15:01,080 --> 02:15:02,160 Un tas vienkārši darbojas. 3106 02:15:02,160 --> 02:15:05,710 Tātad izrādās, ka get int īstenot ir diezgan vienkārši. 3107 02:15:05,710 --> 02:15:07,380 Tomēr ievērojiet, kas nedarbojas. 3108 02:15:07,380 --> 02:15:11,010 Ja es ierakstu, piemēram, kaķis, kaķis tiek pārvērsts par nulli. 3109 02:15:11,010 --> 02:15:14,610 Un tikmēr, get int, atcerieties, atkārtoti uzvedinās lietotāju. 3110 02:15:14,610 --> 02:15:16,485 Ja cilvēks neievada faktisku veselu skaitli, jūs automātiski saņemat 3111 02:15:16,485 --> 02:15:18,360 atkārtotu uzvedni. 3112 02:15:18,360 --> 02:15:20,660 Tā ir viena no funkcijām, ko mēs pievienojām CS50, lai tikai padarītu 3113 02:15:20,660 --> 02:15:22,960 jūsu programmas lietotājam draudzīgākas. 3114 02:15:22,960 --> 02:15:25,280 Bet citādi get int ir diezgan vienkārši atkārtoti ieviest, izmantojot 3115 02:15:25,280 --> 02:15:27,600 scanf. 3116 02:15:27,600 --> 02:15:30,210 Diemžēl tas neattiecas uz virknēm. 3117 02:15:30,210 --> 02:15:34,560 Jo kā, rakstot kodu, zināt, kādu vārdu cilvēks galu galā ierakstīs? 3118 02:15:34,560 --> 02:15:37,590 Cik ilgi viņi sveicinās, piemēram, sveiks? 3119 02:15:37,590 --> 02:15:40,130 Ja viņu vārds ir Deivids, Kārters vai jebkas cits, jūs vienkārši 3120 02:15:40,130 --> 02:15:42,670 iepriekš nenojaušat, cik daudz atmiņas jums ir nepieciešams. 3121 02:15:42,670 --> 02:15:45,360 Tātad, kā mēs to varētu izdarīt ar virknēm? 3122 02:15:45,360 --> 02:15:48,170 Nu, ļaujiet man iet uz priekšu un deklarēt virkni s. 3123 02:15:48,170 --> 02:15:49,170 Lai gan, ziniet ko? 3124 02:15:49,170 --> 02:15:50,400 Nav CS50 bibliotēkas. 3125 02:15:50,400 --> 02:15:53,230 Tā vietā mēs šodien lietosim rakstzīmi zvaigznīti. 3126 02:15:53,230 --> 02:15:56,450 Un tas man dod nevis virkni kā tādu, bet norādi, kas, iespējams, 3127 02:15:56,450 --> 02:15:59,670 norādīs uz virkni. 3128 02:15:59,670 --> 02:16:00,990 Ideālā gadījumā es izmantotu šo. 3129 02:16:00,990 --> 02:16:01,770 Get string. 3130 02:16:01,770 --> 02:16:04,030 Bet atkal mēs esam noņēmuši šo palīgritenīti. 3131 02:16:04,030 --> 02:16:06,560 Tagad, kad man ir rādītājs s, pieņemsim, ka es pamudinu cilvēku 3132 02:16:06,560 --> 02:16:09,090 ievadīt s vērtību, tāpat kā iepriekš. 3133 02:16:09,090 --> 02:16:13,620 Ļaujiet man tagad izmantot scanf un pateikt lietotājam, ka es gaidu 3134 02:16:13,620 --> 02:16:18,150 no tastatūras nolasīt virkni %s un saglabāt to s. 3135 02:16:18,150 --> 02:16:19,470 Tagad tās ir nianses. 3136 02:16:19,470 --> 02:16:21,855 Man šeit tehniski nav vajadzīga konjukcijas zīme, lai gan es to 3137 02:16:21,855 --> 02:16:24,240 darīju dēļ int. 3138 02:16:24,240 --> 02:16:26,130 Un es to darītu peldošajam, un dubultajam, un garajam, un loģiskajam, 3139 02:16:26,130 --> 02:16:28,020 un rakstzīmei. 3140 02:16:28,020 --> 02:16:31,140 Kāpēc šajā stāstā man nav nepieciešams simbols &, lai nodotu pēc 3141 02:16:31,140 --> 02:16:34,260 references? 3142 02:16:34,260 --> 02:16:36,129 Auditorija: jau [NESAKLAUSĀMS]. 3143 02:16:36,129 --> 02:16:37,299 DEIVIDS Dž. Meilans: Tā jau ir adrese. 3144 02:16:37,299 --> 02:16:38,830 Atkal, virknes ir tikai īpašas. 3145 02:16:38,830 --> 02:16:40,809 Virknes tātad vienmēr ir adreses. 3146 02:16:40,809 --> 02:16:43,809 Tātad šeit nav papildus jāpievieno simbols &. 3147 02:16:43,809 --> 02:16:45,575 Tā ir vienīgā smalkā atšķirība šeit. 3148 02:16:45,575 --> 02:16:48,786 Bet tagad, ja es turpinu un pašās beigās izdrukāju, kāda ir s vērtība 3149 02:16:48,786 --> 02:16:51,997 izmantojot %s kā iepriekš, šī programma izskatās gandrīz tāda pati kā 3150 02:16:51,997 --> 02:16:55,209 int versija. 3151 02:16:55,209 --> 02:16:57,190 Bet izpildīsim make get. 3152 02:16:57,190 --> 02:16:59,500 Un labi, tātad šis nav labi. 3153 02:16:59,500 --> 02:17:01,910 Labi, tātad tai nepatīk neinicializēta vērtība. 3154 02:17:01,910 --> 02:17:02,980 Tāpēc ļaujiet man to iepriecināt. 3155 02:17:02,980 --> 02:17:05,138 Es teicu iepriekš, lai vienmēr inicializējat savu mainīgo. 3156 02:17:05,138 --> 02:17:07,930 Tāpēc inicializēsim to ar NULL, lai vismaz kaut kas būtu. 3157 02:17:07,930 --> 02:17:09,910 Tā ir jūsu labā noklusējuma vērtība tagad. 3158 02:17:09,910 --> 02:17:12,400 Tagad, ja es izpildu dot slash get , viss irlabi. 3159 02:17:12,400 --> 02:17:15,969 Un ļaujiet man ierakstīt kaut ko līdzīgu cat. 3160 02:17:15,969 --> 02:17:17,870 Labi, cat nav x. 3161 02:17:17,870 --> 02:17:19,120 Nu, ļaujiet man izmēģināt citu vārdu. 3162 02:17:19,120 --> 02:17:20,379 Varbūt tikai cat ir nepareizi. 3163 02:17:20,379 --> 02:17:21,160 Dog. 3164 02:17:21,160 --> 02:17:22,910 Labi, ļaujiet man izmēģināt David. 3165 02:17:22,910 --> 02:17:24,430 Šķiet, ka tas vienkārši nedarbojas. 3166 02:17:24,430 --> 02:17:27,040 Turklāt tas tiek drukāts kā nulle. 3167 02:17:27,040 --> 02:17:30,719 Bet kas šeit loģiski ir kļūdains? 3168 02:17:30,719 --> 02:17:32,790 Scanf pirms brīža strādāja ar veseliem skaitļiem. 3169 02:17:32,790 --> 02:17:34,320 Bet tas nedarbojas ar virknēm. 3170 02:17:34,320 --> 02:17:37,170 Un šķiet, ka tas aizmirst C-A-T. 3171 02:17:34,320 --> 02:17:40,820 Tas aizmirst D-O-G. Tas aizmirst D-A-V-I-D. 3172 02:17:37,170 --> 02:17:44,090 Kāpēc? Kas šeit notiek? 3173 02:17:44,090 --> 02:17:47,920 Padomājiet par mūsu dzeltenajiem atmiņas attēliem. 3174 02:17:47,920 --> 02:17:49,090 Kad es... jā. 3175 02:17:49,090 --> 02:17:50,267 Auditorija: [NESAKLAUSĀMS] 3176 02:17:50,267 --> 02:17:52,528 DEIVIDS Dž. Meilans: Iespējams, tas nolasa tikai pašu NULL, jo s tiek 3177 02:17:52,528 --> 02:17:54,790 inicializēts ar NULL. 3178 02:17:54,790 --> 02:17:58,090 Un kādu soli es esmu aizmirsis, kuru minēju tikai pirms dažām minūtēm? 3179 02:17:58,090 --> 02:18:01,760 Ko es patiesībā nepieprasīju no datora? 3180 02:18:01,760 --> 02:18:06,290 Faktisko atmiņu CAT, DOG, DAVID glabāšanai. 3181 02:18:06,290 --> 02:18:10,010 Es nekur neesmu prasījis datoram kādu atmiņas apjomu. 3182 02:18:10,010 --> 02:18:14,600 Un tāpēc tehniski tas varētu nolasīt to kādā atkritumu vietā. 3183 02:18:14,600 --> 02:18:18,020 Un tā šeit patiešām ir problēma. 3184 02:18:14,600 --> 02:18:17,439 s tagad tiek inicializēts ar NULL, un tāpēc patiesībā tā drukā nulli 3185 02:18:17,439 --> 02:18:20,278 kā NULL. 3186 02:18:20,278 --> 02:18:23,653 Bet es neredzu nevienu citu burtu, jo nebija kur tos likt. 3187 02:18:23,653 --> 02:18:26,131 C-A-T, D-O-G, D-A-V-I-D, jo es neprasīju 3 baitus, 4 baitus, 5 3188 02:18:26,131 --> 02:18:28,610 baitus, 100 baitus. 3189 02:18:28,610 --> 02:18:29,840 Nav nekāda jēgas no malloc. 3190 02:18:29,840 --> 02:18:31,100 Nav jēgas no masīva. 3191 02:18:31,100 --> 02:18:35,370 Atmiņa nav atvēlēta nekam citam, izņemot pašu norādi. 3192 02:18:35,370 --> 02:18:38,209 Un šeit, godīgi sakot, dzīve kļūst grūta ar scanf. 3193 02:18:38,209 --> 02:18:40,709 Es varētu atrisināt šo problēmu vairākos veidos. 3194 02:18:40,709 --> 02:18:41,910 Ļaujiet man turpināt un darīt šādi. 3195 02:18:41,910 --> 02:18:45,189 Tā vietā, lai deklarētu s kā norādi, ļaujiet man deklarēt, ka s 3196 02:18:45,189 --> 02:18:48,469 faktiski ir četru rakstzīmju masīvs. 3197 02:18:48,469 --> 02:18:51,540 Un tagad ļaujiet man iet uz priekšu un pārkompilēt kodu. 3198 02:18:51,540 --> 02:18:55,380 Tātad, lai get dot slash get, un es tagad ierakstīšu cat. 3199 02:18:55,380 --> 02:18:56,780 Tas tagad darbojas. 3200 02:18:56,780 --> 02:18:57,590 Kāpēc? 3201 02:18:57,590 --> 02:19:00,760 Nu, es piešķiru skaidru masīvu ar izmēri četri, kas ir pietiekams 3202 02:19:00,760 --> 02:19:03,930 vienam, diviem, trīs burtiem un NULL rakstzīmei. 3203 02:19:03,930 --> 02:19:06,620 Lūk, kur uz kāda iepriekš uzdoto jautājumu, izrādās, ka dažos 3204 02:19:06,620 --> 02:19:09,310 kontekstos jūs varat uzskatīt masīvus tā, it kā tie paši būtu 3205 02:19:09,310 --> 02:19:12,000 norādes. 3206 02:19:12,000 --> 02:19:14,010 Tātad jūs veiksit konvertēšanu paši sev. 3207 02:19:14,010 --> 02:19:17,540 Bet pagaidām pieņemsim, ka s ir tikai izmēra četri masīvs. 3208 02:19:17,540 --> 02:19:21,463 Un, ja jūs to nododat programmā scanf, tā ir kā dārgumu karte, kas 3209 02:19:21,463 --> 02:19:25,386 ved uz šiem 4 baitiem, lai scanf tagad varētu to veiksmīgi aizpildīt 3210 02:19:25,386 --> 02:19:29,309 ar CAT, DOG. 3211 02:19:24,559 --> 02:19:29,309 Bet mēģināsim vēlreiz. 3212 02:19:29,309 --> 02:19:30,440 Ierakstīsim David. 3213 02:19:30,440 --> 02:19:32,940 Un lūk, labi, mums paveicās. 3214 02:19:32,940 --> 02:19:35,459 Bet es tehniski pieskāros atmiņai, kurai nevajadzētu. 3215 02:19:35,459 --> 02:19:37,916 Un patiesībā, ja es ierakstītu pietiekami garu virkni, un es 3216 02:19:37,916 --> 02:19:40,373 nedomāju, ka es to varētu viegli izdarīt, neierakstot šo tūkstošiem 3217 02:19:40,373 --> 02:19:42,830 vai simtiem reižu. 3218 02:19:42,830 --> 02:19:43,910 Joprojām labi. 3219 02:19:43,910 --> 02:19:47,298 Bet jūs pamanīsit, ka pārējais tagad ir aizmirsts. 3220 02:19:47,298 --> 02:19:49,590 Tātad kaut kur mēs devāmies ārpus masīva robežām. 3221 02:19:49,590 --> 02:19:52,230 Un mums vienkārši nav pietiekami daudz vietas šai lietai. 3222 02:19:52,230 --> 02:19:53,647 Tātad, ko jūs darāt savā programmā? 3223 02:19:53,647 --> 02:19:55,588 Ja nezināt, cik garš būs personas vārds vai dzīvnieka vārds, ko jūs 3224 02:19:55,588 --> 02:19:57,530 darāt? 3225 02:19:57,530 --> 02:20:00,785 Kādā brīdī ir jānovelk robeža. 3226 02:20:02,910 --> 02:20:06,980 Un tāpēc lietotāja ievades iegūšana ir tik kaitinoša tādā valodā kā C. 3227 02:20:06,980 --> 02:20:08,900 Un tāpēc pastāv virkne. 3228 02:20:08,900 --> 02:20:11,330 Ja jums ir interese, mēs skatāmies uz lietotāja ievadi un veicam 3229 02:20:11,330 --> 02:20:13,760 mazus soļus. 3230 02:20:13,760 --> 02:20:15,980 Mēs to skatāmies pa vienai rakstzīmei. 3231 02:20:15,980 --> 02:20:17,865 Un katru reizi, kad mēs redzam citu rakstzīmi, mēs faktiski atkal 3232 02:20:17,865 --> 02:20:19,750 izsaucam malloc un sakām: nē. 3233 02:20:19,750 --> 02:20:20,750 Man vajag vairāk par 1 baitu. 3234 02:20:20,750 --> 02:20:21,470 Man vajag 2. 3235 02:20:21,470 --> 02:20:23,012 Ak, pagaidiet, viņi ierakstīja trīs burtus. 3236 02:20:23,012 --> 02:20:23,930 Man vajag 3, nevis 2. 3237 02:20:23,930 --> 02:20:25,340 Ak, man vajag 4, nevis 2. 3238 02:20:25,340 --> 02:20:27,920 Un mums ir šī trakā cilpa, kas būtībā prasa vairāk un vairāk atmiņas, 3239 02:20:27,920 --> 02:20:30,500 bet tikai sper mazus solīšus. 3240 02:20:30,500 --> 02:20:33,380 Un godīgi, ja jums visiem tas būtu jādara pirmajā nedēļā, mans Dievs. 3241 02:20:33,380 --> 02:20:35,640 Mēs vairs pat nevarējām uzrakstīt, sveiki, pasaule. 3242 02:20:35,640 --> 02:20:38,450 Un tāpēc šie palīgritenīši pastāv, vismaz sākumā. 3243 02:20:38,450 --> 02:20:41,135 Un tāpēc augstākā līmeņa valodās, piemēram, Python, jums tas vispār 3244 02:20:41,135 --> 02:20:43,820 nav jādara. 3245 02:20:43,820 --> 02:20:45,960 Tas vienkārši darbojas, kā jūs sagaidītu. 3246 02:20:45,960 --> 02:20:47,640 Tātad, ko mēs vēl varam darīt? 3247 02:20:47,640 --> 02:20:51,076 Šonedēļ jūs redzēsit ceturto uzdevumu kopu. Ja es atvēršu šādu 3248 02:20:51,076 --> 02:20:54,513 piemēru, phonebook.c, jūs redzēsit, ka tagad varat manipulēt ar 3249 02:20:54,513 --> 02:20:57,950 failiem, ka jums ir norāžu vārdu krājums. 3250 02:20:57,950 --> 02:20:59,570 Tasbūs jaunums. 3251 02:20:59,570 --> 02:21:02,000 Bet šeit mums ir piemērs, kā. 3252 02:21:02,000 --> 02:21:04,490 Man ir programma, kas izmanto dažas pazīstamas bibliotēkas. 3253 02:21:04,490 --> 02:21:06,250 Bet, kā es apgalvoju savā komentārā, tas saglabā vārdus un numurus 3254 02:21:06,250 --> 02:21:08,010 CSV failā. 3255 02:21:08,010 --> 02:21:10,190 Visi mani līdzšinējie piemēri, es ierakstu dažus vārdus, es ierakstu 3256 02:21:10,190 --> 02:21:12,370 dažus vārdus un dažus tālruņu numurus, un tie pazūd, jo mēs tos 3257 02:21:12,370 --> 02:21:14,550 saglabājam tikai atmiņā. 3258 02:21:14,550 --> 02:21:16,890 Bet, ja vēlaties saglabāt datus, piemēram, CSV failā, 3259 02:21:16,890 --> 02:21:19,230 komatatdalītajās vērtībās, kas ir kā vienkārša izklājlapa, piemēram, 3260 02:21:19,230 --> 02:21:21,570 Excel, un Apple Numbers, un Google izklājlapas var atvērt, varat to 3261 02:21:21,570 --> 02:21:23,910 izdarīt paši. 3262 02:21:23,910 --> 02:21:27,950 Tāpēc es izmantoju jaunu datu veidu kā šīs nedēļas ieskatu. 3263 02:21:27,950 --> 02:21:28,820 Tā nav CS50 lieta. 3264 02:21:28,820 --> 02:21:30,575 Šī ir C lieta, ko sauc par failu. 3265 02:21:30,575 --> 02:21:32,412 Bet, ja vēlaties manipulēt ar failiem, jums ir jāizmanto adreses, tas 3266 02:21:32,412 --> 02:21:34,250 ir, norādes. 3267 02:21:34,250 --> 02:21:38,195 Šeit es izveidoju mainīgo, ko sauc par file, kas norāda uz faktisko 3268 02:21:38,195 --> 02:21:42,140 failu cietajā diskā, serverī vai jūsu Mac vai personālajā datorā. 3269 02:21:42,140 --> 02:21:45,560 fopen būs jauna funkcija, kuru izmantosit, lai atvērtu failu. 3270 02:21:45,560 --> 02:21:49,160 Un tā efektīvi atgriezīs tur esošo norādi atmiņā. 3271 02:21:49,160 --> 02:21:51,560 Faila nosaukums, kuru vēlos atvērt, ir phonebook.csv. 3272 02:21:51,560 --> 02:21:54,230 Un šajā piemērā tas būs pildspalvas režīms. 3273 02:21:54,230 --> 02:21:57,447 Tas ļaus man pievienot šim failam arvien vairāk vārdu un numuru. 3274 02:21:57,447 --> 02:21:59,453 Šeit ir daži veci get string sīkumi, jo es negrasos izgudrot get 3275 02:21:59,453 --> 02:22:01,460 stringar scanf. 3276 02:22:01,460 --> 02:22:03,930 Bet šeit ir nedaudz jauna funkcija. 3277 02:22:03,930 --> 02:22:05,260 Tā nav printf, bet gan fprintf. 3278 02:22:05,260 --> 02:22:07,530 Un izrādās, ka ir ļoti vienkārši izdrukāt lietas nevis uz ekrāna, bet 3279 02:22:07,530 --> 02:22:09,800 gan failā ar fprintf. 3280 02:22:09,800 --> 02:22:13,100 Un tas prasa papildu argumentu, tā vietā, lai sāktu ar pēdēto virkni, 3281 02:22:13,100 --> 02:22:16,400 jums būs jāpasaka, kurā failā vēlaties rakstīt. 3282 02:22:16,400 --> 02:22:19,960 Un fprintf izdomās, kā ievietot bitus šajā failā, ievadot tādus 3283 02:22:19,960 --> 02:22:23,520 vārdus kā nosaukums, komats, numurs. 3284 02:22:23,520 --> 02:22:26,940 Tātad, ja es to ātri palaižu šeit, ļaujiet man to izdarīt. 3285 02:22:26,940 --> 02:22:31,400 Ļaujiet man iepriekš izveidot failu phonebook.csv. 3286 02:22:31,400 --> 02:22:34,610 Un phonebook.csv es šeit izveidošu pagaidu rindu, vārds,komats, 3287 02:22:34,610 --> 02:22:37,820 numurs, lai šajā failā būtu kaut kas. 3288 02:22:37,820 --> 02:22:39,815 Un tagad ļaujiet man iet uz priekšu un darīt šādi un sadalīt ekrānu 3289 02:22:39,815 --> 02:22:41,810 šeit. 3290 02:22:41,810 --> 02:22:44,988 Ja man ir phonebook.csv labajā pusē un phonebook.c kreisajā pusē, 3291 02:22:44,988 --> 02:22:48,166 ļaujiet man sastādīt, izveidot tālruņu grāmatu, kas ir C versija, dot 3292 02:22:48,166 --> 02:22:51,345 slash phonebook. 3293 02:22:51,345 --> 02:22:53,220 Un tagad man tiek prasīts vārds un numurs. 3294 02:22:53,220 --> 02:22:58,580 Es ierakstīšu David un tad, piemēram, plus 1-949 — kāds tas ir? 3295 02:22:58,580 --> 02:23:01,190 Enter. 3296 02:23:02,390 --> 02:23:03,110 Ak, sasodīts. 3297 02:23:03,110 --> 02:23:03,995 Kļūda. 3298 02:23:03,995 --> 02:23:05,120 Izliecieties, ka tas nav noticis. 3299 02:23:05,120 --> 02:23:06,990 Es aizmirsu ieiet failā. 3300 02:23:06,990 --> 02:23:08,630 Tātad darīsim to vēlreiz. 3301 02:23:08,630 --> 02:23:14,800 Ja es palaistu programmu vēlreiz, David, un plus 1-949-4682750, 3302 02:23:14,800 --> 02:23:20,970 Enter, tā tagad ir saglabāta failā. 3303 02:23:20,970 --> 02:23:25,480 Un, ja es aizveru šo failu un atkārtoti atveru phonebook.csv kodu, 3304 02:23:25,480 --> 02:23:29,990 jūs redzēsit, ka fails saglabājas. 3305 02:23:29,990 --> 02:23:31,730 Un, ja es to lejupielādēju savā Mac vai datorā, es varētu veikt 3306 02:23:31,730 --> 02:23:33,470 dubultklikšķi uz CSV faila. 3307 02:23:33,470 --> 02:23:36,260 Un voila, atvērtos Excel vai Apple Numbers vai tamlīdzīgi. 3308 02:23:36,260 --> 02:23:38,527 Un es faktiski esmu izveidojis īstu CSV failu. 3309 02:23:38,527 --> 02:23:41,218 Ja jūs smaidāt, jo es nepārtraukti atkārtoju savu tālruņa numuru, es 3310 02:23:41,218 --> 02:23:43,910 ieteiktu jums kādreiz piezvanīt vai nosūtīt īsziņu uz šo numuru. 3311 02:23:43,910 --> 02:23:46,100 Tā ļoti labi varētu būt sava veida Lieldienu ola. 3312 02:23:46,100 --> 02:23:49,115 Bet, izmantojot šīs šeit esošās funkcijas, mums tagad ir iespēja 3313 02:23:49,115 --> 02:23:52,130 rakstīt ievades un izvades failus. 3314 02:23:52,130 --> 02:23:55,400 Un viens no šīs nedēļas mērķiem, kā mēs redzēsim, ir faktiski 3315 02:23:55,400 --> 02:23:58,670 spēlēties ar attēliem tādā garā kā Instagram filtri vai tamlīdzīgi. 3316 02:23:58,670 --> 02:24:01,627 Un mēs jūs iepazīstināsim, piemēram, ar faila formātu, ko sauc par 3317 02:24:01,627 --> 02:24:04,585 BNP, kas, noslēdzot nodarbības sākuma tēmu, ir tikai bitu kartes, bet 3318 02:24:04,585 --> 02:24:07,542 vairāk nekā tikai atsevišķi biti baltam un melnam, vairāk gan 3319 02:24:07,542 --> 02:24:10,500 krāsainiem rakstiem arī . 3320 02:24:10,500 --> 02:24:12,187 Un sniegs jums tādus attēlus kā šis ar Weeks Bridge šeit pāri upei 3321 02:24:12,187 --> 02:24:13,875 Hārvardā. 3322 02:24:13,875 --> 02:24:16,863 Pēc tam, kad esat uzrakstījis savu kodu C valodā un sapratis, kā dati 3323 02:24:16,863 --> 02:24:19,852 tiek glabāti datora atmiņā, jūs varēsit lietot savus Instagram 3324 02:24:19,852 --> 02:24:22,841 līdzīgus filtrus, lai pārveidot lietas pelēktoņos vai šajā gadījumā 3325 02:24:22,841 --> 02:24:25,830 sēpijas toņos. 3326 02:24:25,830 --> 02:24:28,820 Jūs pat varat apgriezt bitus otrādi, lai lieta būtu spoguļattēlā. 3327 02:24:28,820 --> 02:24:30,530 Varat aizmiglot lietas vēl vairāk. 3328 02:24:30,530 --> 02:24:34,025 Vai arī, ja jūs patiešām jūtaties ērtāk, varat pat ierakstīt kodu, 3329 02:24:34,025 --> 02:24:37,520 kas atrod attēla malas un izveido līdzīgus mākslas darbus. 3330 02:24:37,520 --> 02:24:39,740 Tātad tas viss un vēl vairāk ceturtajā problēmu kopā. 3331 02:24:42,650 --> 02:24:47,200 [SKAN MŪZIKA]