1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [4.pants - ērtāk] 2 00:00:02,520 --> 00:00:04,850 [Rob Bowden - Hārvarda] 3 00:00:04,850 --> 00:00:07,370 [Tas ir CS50. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 Mums ir viktorīna rīt, ja jūs puiši nav jāzina. 5 00:00:14,810 --> 00:00:20,970 Tā būtībā uz visu, jūs varētu būt redzējis klasē vai ir redzējuši klasē. 6 00:00:20,970 --> 00:00:26,360 Tas ietver norādes, lai gan viņi ir ļoti nesen tēmu. 7 00:00:26,360 --> 00:00:29,860 Jums vajadzētu vismaz saprast augstu viņiem. 8 00:00:29,860 --> 00:00:34,760 Jebkas, kas bija devusies vairāk nekā klasē, jums vajadzētu saprast, par viktorīnas. 9 00:00:34,760 --> 00:00:37,320 Tātad, ja jums ir jautājumi par tiem, jūs varat lūgt viņiem tagad. 10 00:00:37,320 --> 00:00:43,280 Bet tas būs ļoti students vadītā sesija, kur jūs puiši uzdot jautājumus, 11 00:00:43,280 --> 00:00:45,060 tāpēc cerams cilvēki ir jautājumi. 12 00:00:45,060 --> 00:00:48,020 Vai kāds ir jautājumi? 13 00:00:49,770 --> 00:00:52,090 Jā. >> [Students] Vai jums iet pa šautru atkal? 14 00:00:52,090 --> 00:00:54,350 Es iešu pa šautru. 15 00:00:54,350 --> 00:00:59,180 Visas jūsu mainīgo vienmēr dzīvo atmiņā, 16 00:00:59,180 --> 00:01:04,450 bet parasti jums nav jāuztraucas par to un jūs vienkārši pateikt x + 2 un y + 3 17 00:01:04,450 --> 00:01:07,080 un kompilators izdomāt, kur lietas dzīvo jums. 18 00:01:07,080 --> 00:01:12,990 Kad jums ir darīšana ar norādes, tagad tu esi precīzi, lietojot šos atmiņas adreses. 19 00:01:12,990 --> 00:01:19,800 Tātad viena mainīgā būs tikai kādreiz dzīvot vienā adresē jebkurā laikā. 20 00:01:19,800 --> 00:01:24,040 Ja mēs vēlamies atzīt rādītāju, kas ir veids gatavojas izskatās? 21 00:01:24,040 --> 00:01:26,210 >> Es gribu atzīt rādītāju p. Kāda veida izskatās? 22 00:01:26,210 --> 00:01:33,530 [Students] int * p. >> Jā. Tātad int * p. 23 00:01:33,530 --> 00:01:38,030 Un kā es varu darīt to norādīt uz X? >> [Students] & zīmi. 24 00:01:40,540 --> 00:01:45,300 [Bowden] Tātad zīme & ir burtiski sauc adresi operatora. 25 00:01:45,300 --> 00:01:50,460 Tātad, kad es saku & x tas kļūst atmiņas adresi mainīgā x. 26 00:01:50,460 --> 00:01:56,790 Tāpēc tagad man ir rādītāju p, un visur manā kods es varētu izmantot * p 27 00:01:56,790 --> 00:02:02,960 vai es varētu izmantot x un tas būs tieši tas pats. 28 00:02:02,960 --> 00:02:09,520 (* P). Kas ir šī dara? Ko tas zvaigzne nozīmē? 29 00:02:09,520 --> 00:02:13,120 [Students] Tas ir vērtība šajā punktā. >> Jā. 30 00:02:13,120 --> 00:02:17,590 Tātad, ja mēs skatāmies uz to, tas var būt ļoti noderīga, lai izvilkt diagrammas 31 00:02:17,590 --> 00:02:22,230 ja tas ir mazliet kaste atmiņā X, kas notiek, ir vērtība 4, 32 00:02:22,230 --> 00:02:25,980 tad mums ir maz kaste atmiņas par p, 33 00:02:25,980 --> 00:02:31,590 un tā p norāda uz X, tāpēc mēs izdarīt bultiņu no P līdz x. 34 00:02:31,590 --> 00:02:40,270 Tātad, kad mēs sakām * p mēs sakot iet uz lodziņu, kas ir p. 35 00:02:40,270 --> 00:02:46,480 Star ir sekot bultiņas un pēc tam darīt, ko vien vēlaties ar šo lodziņu tiesības tur. 36 00:02:46,480 --> 00:03:01,090 Tāpēc es varu teikt * p = 7, un kas dosies uz kastes, kas ir X un pārmaiņas, kas līdz 7. 37 00:03:01,090 --> 00:03:13,540 Vai es varētu teikt int z = * p * 2; Tas ir mulsinoši, jo tas ir zvaigzne, zvaigzne. 38 00:03:13,540 --> 00:03:19,230 Viena zvaigzne ir dereferencing p, otra zvaigzne reizinot ar 2. 39 00:03:19,230 --> 00:03:26,780 Paziņojums Es varētu būt tikpat labi aizstāja * P ar x. 40 00:03:26,780 --> 00:03:29,430 Jūs varat izmantot tos tādā pašā veidā. 41 00:03:29,430 --> 00:03:38,000 Un tad vēlāk es varētu būt p norāda uz pilnīgi jauna lieta. 42 00:03:38,000 --> 00:03:42,190 Es varu tikai teikt p = &z; 43 00:03:42,190 --> 00:03:44,940 Tāpēc tagad p vairs nav vietas uz X, tas norāda uz z. 44 00:03:44,940 --> 00:03:50,510 Un jebkurā laikā man * P tas pats, kas dara z. 45 00:03:50,510 --> 00:03:56,170 Tāpēc noderīga lieta par šo ir, kad mēs sāktu nokļūst funkcijām. 46 00:03:56,170 --> 00:03:59,790 >> Tas ir sava veida bezjēdzīgi atzīt rādītāju, kas norāda uz kaut ko 47 00:03:59,790 --> 00:04:03,140 un tad jūs vienkārši dereferencing to 48 00:04:03,140 --> 00:04:06,060 ja jūs varētu būt izmantoti sākotnējā mainīgo sākt ar. 49 00:04:06,060 --> 00:04:18,190 Bet, kad jūs nokļūt funkcijām - tāpēc pieņemsim, ka mums ir dažas funkcijas, int foo, 50 00:04:18,190 --> 00:04:32,810 kas ņem rādītāju un tikai dara * p = 6; 51 00:04:32,810 --> 00:04:39,990 Tāpat kā mēs redzējām pirms ar swap, jūs nevarat izdarīt efektīvu swap un atsevišķu funkciju 52 00:04:39,990 --> 00:04:45,180 , tikai iet integers, jo viss, kas C vienmēr iet pēc vērtības. 53 00:04:45,180 --> 00:04:48,360 Pat tad, kad jūs iet norādes jūs iet pēc vērtības. 54 00:04:48,360 --> 00:04:51,940 Tas tikai tā notiek, ka šīs vērtības ir atmiņas adreses. 55 00:04:51,940 --> 00:05:00,770 Tātad, kad es saku foo (p), es esmu iet rādītāju uz funkciju foo 56 00:05:00,770 --> 00:05:03,910 un tad foo dara * p = 6; 57 00:05:03,910 --> 00:05:08,600 Tātad iekšā šī funkcija, * p ir vēl līdzvērtīgs x, 58 00:05:08,600 --> 00:05:12,720 bet es nevaru izmantot X iekšā šī funkcija, jo tas nav scoped laikā šo funkciju. 59 00:05:12,720 --> 00:05:19,510 Tātad * p = 6 ir vienīgais veids, kā es varētu piekļūt vietējo mainīgais no citas funkcijas. 60 00:05:19,510 --> 00:05:23,600 Vai, labi, norādes ir vienīgais veids, kā es varētu piekļūt vietējo mainīgais no citas funkcijas. 61 00:05:23,600 --> 00:05:31,600 [Students] Teiksim, jūs gribēja atgriezties rādītāju. Kā tieši jūs darīt? 62 00:05:31,600 --> 00:05:44,270 [Bowden] Atgriešanās rādītāju kā kaut ko līdzīgu int y = 3; atgriešanās & y? >> [Students] Jā. 63 00:05:44,270 --> 00:05:48,480 [Bowden] Labi. Jums nekad nevajadzētu darīt. Tas ir slikti. 64 00:05:48,480 --> 00:05:59,480 Es domāju, ka es redzēju šo lekciju slaidos jūs sāku redzēt šo visu diagrammu atmiņas 65 00:05:59,480 --> 00:06:02,880 kur šeit jūs esat ieguvuši atmiņas adrese 0 66 00:06:02,880 --> 00:06:09,550 un uz leju šeit jums ir atmiņas adrese 4 gigs vai 2 32. 67 00:06:09,550 --> 00:06:15,120 Tātad, tad jūs esat ieguvuši dažas lietas un daži sīkumi, un tad jums ir kaudze 68 00:06:15,120 --> 00:06:21,780 un jūs esat ieguvuši savu kaudze, kuru jūs tikko sāku mācīties par, aug. 69 00:06:21,780 --> 00:06:24,390 [Students] nav kaudze virs kaudze? 70 00:06:24,390 --> 00:06:27,760 >> Yeah. Kaudze ir uz augšu, vai ne? >> [Students] Nu, viņš likts 0 uz augšu. 71 00:06:27,760 --> 00:06:30,320 [Students] Ak, viņš likts 0 uz augšu. >> [Students] Ak, labi. 72 00:06:30,320 --> 00:06:36,060 Atruna: Anywhere ar CS50 jūs dodas, lai redzētu to tā. >> [Students] Labi. 73 00:06:36,060 --> 00:06:40,290 Tas ir tikai, ka tad, kad jūs pirmo reizi redzēt skursteņi, 74 00:06:40,290 --> 00:06:45,000 piemēram, kad jūs domājat par kaudze jūs domājat par kraušanas lietas viens uz otru. 75 00:06:45,000 --> 00:06:50,810 Tāpēc mums ir tendence uzsist tas apmēram tā kaudze aug kā kaudze parasti, 76 00:06:50,810 --> 00:06:55,940 vietā kaudze karājas uz leju. >> [Students] nav kaudzes tehniski aug pārāk, lai gan? 77 00:06:55,940 --> 00:07:01,100 Tas atkarīgs no tā, ko tu domā ar aug. 78 00:07:01,100 --> 00:07:04,010 Kaudze un kaudze vienmēr augt pretējos virzienos. 79 00:07:04,010 --> 00:07:09,420 Kaudze vienmēr aug tādā ziņā, ka tas aug 80 00:07:09,420 --> 00:07:12,940 uz augstākas atmiņas adreses un kaudze aug uz leju 81 00:07:12,940 --> 00:07:17,260 jo tas aug uz zemāku atmiņas adreses. 82 00:07:17,260 --> 00:07:20,250 Tātad top ir 0 un apakšā ir augstas atmiņas adreses. 83 00:07:20,250 --> 00:07:26,390 Viņi abi aug, tikai pretējos virzienos. 84 00:07:26,390 --> 00:07:29,230 [Students] Es tikai nozīmē, ka tāpēc, ka jūs teicāt, ka likts kaudze uz grunts 85 00:07:29,230 --> 00:07:33,640 jo tas šķiet vairāk intuitīvi, jo, lai kaudze sākt augšpusē kaudzes, 86 00:07:33,640 --> 00:07:37,520 kaudze ir uz augšu sevi pārāk, tāpēc That - >> Jā. 87 00:07:37,520 --> 00:07:44,960 Jūs arī domāt par kaudzes kā aug un lielāks, bet kaudze vairāk. 88 00:07:44,960 --> 00:07:50,280 Tātad kaudze ir viens, ka mēs veida vēlamies parādīt aug. 89 00:07:50,280 --> 00:07:55,390 Bet visur izskatās citādi gatavojas parādīt adrese 0 augšā 90 00:07:55,390 --> 00:07:59,590 un augstākā atmiņas adrese apakšā, tāpēc tas ir jūsu parastā viedoklis par atmiņu. 91 00:07:59,590 --> 00:08:02,100 >> Vai jums ir jautājums? 92 00:08:02,100 --> 00:08:04,270 [Students] Vai varat pastāstīt mums vairāk par kaudzes? 93 00:08:04,270 --> 00:08:06,180 Yeah. Es nopirkšu ka sekundē. 94 00:08:06,180 --> 00:08:12,220 Pirmkārt, dodas atpakaļ uz to, kāpēc atgriešanās & Y ir slikti, 95 00:08:12,220 --> 00:08:18,470 uz skursteņa jums ir ķekars kaudze rāmji, kas pārstāv visas funkcijas 96 00:08:18,470 --> 00:08:20,460 kas ir saukta. 97 00:08:20,460 --> 00:08:27,990 Tāpēc ignorējot iepriekšējās lietas, jūsu kaudze augšas vienmēr būs galvenā funkcija 98 00:08:27,990 --> 00:08:33,090 jo tas ir pirmais funkcija, kas tiek saukta. 99 00:08:33,090 --> 00:08:37,130 Un tad, kad jūs izsauktu citu funkciju, kaudze gatavojas augt uz leju. 100 00:08:37,130 --> 00:08:41,640 Tātad, ja es aicinu kādu funkciju, foo, un tas izpaužas sava steka rāmi, 101 00:08:41,640 --> 00:08:47,280 tā var zvanīt kādu funkciju, bāru, tas izpaužas sava steka rāmi. 102 00:08:47,280 --> 00:08:49,840 Un josla varētu būt rekursīvs un tas varētu zvanīt pati, 103 00:08:49,840 --> 00:08:54,150 un tādējādi otrais aicinājums uz bāru gatavojas saņemt savu steka rāmi. 104 00:08:54,150 --> 00:08:58,880 Un tā, kas notiek šajās kaudze rāmji ir visas vietējās mainīgo 105 00:08:58,880 --> 00:09:03,450 un visi funkciju argumentiem, ka - 106 00:09:03,450 --> 00:09:08,730 Jebkuras lietas, kas ir lokāli scoped uz šo funkciju iet šajās kaudze rāmjos. 107 00:09:08,730 --> 00:09:21,520 Tātad tas nozīmē, kad es teicu kaut ko līdzīgu bārā ir funkcija, 108 00:09:21,520 --> 00:09:29,270 Es esmu tikai gatavojas pasludināt skaitlim un tad atgriezties rādītāju uz šo skaitlim. 109 00:09:29,270 --> 00:09:33,790 Tātad, ja tas y dzīvo? 110 00:09:33,790 --> 00:09:36,900 [Students] y dzīvo bārā. >> [Bowden] Jā. 111 00:09:36,900 --> 00:09:45,010 Kaut kur šajā maz laukumā atmiņa ir Littler kvadrātveida, kas ir y tajā. 112 00:09:45,010 --> 00:09:53,370 Kad es atgriežos & Y, es esmu atpakaļ rādītāju šim maz bloka atmiņu. 113 00:09:53,370 --> 00:09:58,400 Bet tad, kad funkcija atgriež, tā kaudze rāmis izpaužas popped off kaudze. 114 00:10:01,050 --> 00:10:03,530 Un tas ir iemesls, kāpēc to sauc kaudze. 115 00:10:03,530 --> 00:10:06,570 Tas ir tāpat kā kaudze datu struktūra, ja jūs zināt, kas tas ir. 116 00:10:06,570 --> 00:10:11,580 Vai pat kā kaudze paplātēm vienmēr ir piemērs, 117 00:10:11,580 --> 00:10:16,060 Galvenais ir gatavojas iet uz leju, tad pirmais uzdevums jums zvanīt, ir gatavojas iet uz augšu, ka, 118 00:10:16,060 --> 00:10:20,400 un jūs nevarat saņemt atpakaļ uz galveno kamēr esat atgriezies no visām funkcijām, kas ir saukta 119 00:10:20,400 --> 00:10:22,340 kas ir novietoti uz augšu no tā. 120 00:10:22,340 --> 00:10:28,650 >> [Students] Tātad, ja jūs darīt atgriezties & Y, ka vērtība var tikt mainīta bez iepriekšēja brīdinājuma. 121 00:10:28,650 --> 00:10:31,290 Jā, it's - >> [students] Tā varētu būt pārrakstīts. >> Jā. 122 00:10:31,290 --> 00:10:34,660 Tas ir pilnīgi - Ja jūs mēģināt un - 123 00:10:34,660 --> 00:10:38,040 Tas arī būtu int * bar, jo tas atgriežas rādītāju, 124 00:10:38,040 --> 00:10:41,310 tāpēc tās atgriešanās tips ir int *. 125 00:10:41,310 --> 00:10:46,500 Ja jūs mēģināt izmantot atgriešanās vērtību šo funkciju, tas ir nenoteikts uzvedība 126 00:10:46,500 --> 00:10:51,770 tāpēc, ka rādītājs norāda uz sliktu atmiņu. >> [Students] Labi. 127 00:10:51,770 --> 00:11:01,250 Tātad, ko tad, ja, piemēram, jums paziņoja int * y = malloc (sizeof (int))? 128 00:11:01,250 --> 00:11:03,740 Tas ir labāk. Jā. 129 00:11:03,740 --> 00:11:07,730 [Students] Mēs runājām par to, kā tad, kad mēs velciet lietas mūsu recycle bin 130 00:11:07,730 --> 00:11:11,750 viņi nav reāli izdzēsti, mēs vienkārši zaudēt savas norādes. 131 00:11:11,750 --> 00:11:15,550 Tātad šajā gadījumā mēs faktiski izdzēst vērtību vai tas joprojām tur atmiņā? 132 00:11:15,550 --> 00:11:19,130 Attiecībā uz lielāko daļu, tas būs vēl tur. 133 00:11:19,130 --> 00:11:24,220 Bet pieņemsim, ka mēs izsaucat kādu citu funkciju, baz. 134 00:11:24,220 --> 00:11:28,990 Baz gatavojas saņemt savu steku rāmi šeit. 135 00:11:28,990 --> 00:11:31,470 Tas būs pārrakstot visu šo stuff, 136 00:11:31,470 --> 00:11:34,180 un tad, ja jūs vēlāk mēģināt izmantot rādītāju ka jums pirms, 137 00:11:34,180 --> 00:11:35,570 tas nav būs pati vērtība. 138 00:11:35,570 --> 00:11:38,150 Tas notiek, ir mainījusies tikai tāpēc, ka jūs sauc funkciju BAZ. 139 00:11:38,150 --> 00:11:43,080 [Students] Bet, ja mēs ne, vai mēs joprojām iegūt 3? 140 00:11:43,080 --> 00:11:44,990 [Bowden] Visticamāk, jūs. 141 00:11:44,990 --> 00:11:49,670 Bet jūs nevarat paļauties uz to. C vienkārši saka nedefinētiem uzvedību. 142 00:11:49,670 --> 00:11:51,920 >> [Students] Ak, tā dara. Labi. 143 00:11:51,920 --> 00:11:58,190 Tātad, ja jūs vēlaties, lai atgrieztos rādītāju, tas ir, ja malloc nāk izmantošanu. 144 00:12:00,930 --> 00:12:15,960 Es esmu rakstot faktiski tikai atgriezties malloc (3 * sizeof (int)). 145 00:12:17,360 --> 00:12:24,050 Mēs iet pār malloc vairāk otrkārt, bet malloc ideja ir visas jūsu vietējās mainīgie 146 00:12:24,050 --> 00:12:26,760 vienmēr iet uz skursteņa. 147 00:12:26,760 --> 00:12:31,570 Jebkas, kas ir malloced iet uz kaudzes, un tas būs mūžīgi un vienmēr būs par kaudzes 148 00:12:31,570 --> 00:12:34,490 līdz skaidri atbrīvotu to. 149 00:12:34,490 --> 00:12:42,130 Tātad tas nozīmē, ka tad, kad jūs malloc kaut ko, tas notiek, lai izdzīvotu pēc funkciju atdevi. 150 00:12:42,130 --> 00:12:46,800 [Students] Vai tā izdzīvot pēc programma pārstāj darboties? >> Nr 151 00:12:46,800 --> 00:12:53,180 Labi, tā tas būs tur līdz programma ir visu ceļu darīts darbojas. >> Jā. 152 00:12:53,180 --> 00:12:57,510 Mēs varam iet pa ziņas par to, kas notiek, kad programma pārstāj darboties. 153 00:12:57,510 --> 00:13:02,150 Jums var būt nepieciešams, lai atgādinātu man, bet tas ir atsevišķs lieta pilnībā. 154 00:13:02,150 --> 00:13:04,190 [Students] Tātad malloc rada rādītāju? >> Jā. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [students] Es domāju malloc apzīmē bloku atmiņas ka rādītāju var izmantot. 156 00:13:15,400 --> 00:13:19,610 [Bowden] Es gribu, ka diagramma vēlreiz. >> [Students] Tātad šī funkcija darbojas, lai gan? 157 00:13:19,610 --> 00:13:26,430 [Students] Jā, malloc apzīmē bloku atmiņas, kas jūs varētu izmantot, 158 00:13:26,430 --> 00:13:30,470 un tad tas atgriež adresi pirmā bloka šīs atmiņas. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] Jā. Tātad, ja jūs malloc, jūs satveršanas kādu bloku atmiņas 160 00:13:36,750 --> 00:13:38,260 kas ir pašlaik kaudzē. 161 00:13:38,260 --> 00:13:43,040 Ja kaudze ir pārāk mazs, tad kaudze ir tikai gatavojas augt, un tas aug šajā virzienā. 162 00:13:43,040 --> 00:13:44,650 Tāpēc pieņemsim, ka kaudze ir pārāk mazs. 163 00:13:44,650 --> 00:13:49,960 Tad tas ir par augt mazliet un atgriezties rādītāju uz šo bloku ka tikai pieauga. 164 00:13:49,960 --> 00:13:55,130 Kad jūs bezmaksas stuff, jūs gūstat vairāk vietas kaudzes, 165 00:13:55,130 --> 00:14:00,030 tā tad vēlāk zvanīt malloc var atkārtoti ka atmiņas, kas jums bija agrāk atbrīvoja. 166 00:14:00,030 --> 00:14:09,950 Svarīga lieta par malloc un bezmaksas ir, ka tas dod jums pilnīgu kontroli 167 00:14:09,950 --> 00:14:12,700 dzīves laikā šo atmiņas bloku. 168 00:14:12,700 --> 00:14:15,420 Global mainīgie ir vienmēr dzīvs. 169 00:14:15,420 --> 00:14:18,500 Vietējās mainīgie ir dzīvs to darbības jomā. 170 00:14:18,500 --> 00:14:22,140 Tiklīdz jūs iet garām cirtaini lencēm, vietējās mainīgie ir miruši. 171 00:14:22,140 --> 00:14:28,890 Malloced atmiņa ir dzīvs, kad jūs vēlaties, lai to dzīvs 172 00:14:28,890 --> 00:14:33,480 un tad tiek atbrīvots, ja jums pateikt to atbrīvo. 173 00:14:33,480 --> 00:14:38,420 Tie ir faktiski tikai 3 veidu atmiņas, tiešām. 174 00:14:38,420 --> 00:14:41,840 Ir automātiska atmiņas pārvaldība, kas ir kaudze. 175 00:14:41,840 --> 00:14:43,840 Lietas notiek automātiski. 176 00:14:43,840 --> 00:14:46,910 Kad jūs sakāt int x, atmiņa ir piešķirti int x. 177 00:14:46,910 --> 00:14:51,630 Ja x iet no jomas, atmiņa ir reģenerēts uz X. 178 00:14:51,630 --> 00:14:54,790 Tad tur ir dinamiska atmiņas vadību, kas ir tas malloc ir, 179 00:14:54,790 --> 00:14:56,740 kas ir, kad jums ir kontrolēt. 180 00:14:56,740 --> 00:15:01,290 Jūs dinamiski izlemt, ja atmiņā vajadzētu un ko nevajadzētu piešķirt. 181 00:15:01,290 --> 00:15:05,050 Un tad tur ir statisks, kas nozīmē tikai to, ka tā dzīvo mūžīgi, 182 00:15:05,050 --> 00:15:06,610 kas ir tas, ko globālie mainīgie. 183 00:15:06,610 --> 00:15:10,240 Viņi vienkārši vienmēr atmiņā. 184 00:15:10,960 --> 00:15:12,760 >> Jautājumi? 185 00:15:14,490 --> 00:15:17,230 [Students] Vai jūs definētu bloku tikai izmantojot cirtaini bikšturi 186 00:15:17,230 --> 00:15:21,220 bet, kam nav, lai būtu, ja paziņojumā vai kamēr paziņojums vai kaut kas tamlīdzīgs? 187 00:15:21,220 --> 00:15:29,130 Jūs varat definēt bloku kā funkciju, bet tas ir cirtaini lencēm pārāk. 188 00:15:29,130 --> 00:15:32,100 [Students] Tātad jūs nevarat vienkārši ir kā izlases pāris cirtaini bikšturi savu kodu 189 00:15:32,100 --> 00:15:35,680 ka ir vietējo mainīgie? >> Jā, jūs varat. 190 00:15:35,680 --> 00:15:45,900 Iekšpusē int bar mēs varētu būt {int y = 3;}. 191 00:15:45,900 --> 00:15:48,440 Tai vajadzēja būt šeit. 192 00:15:48,440 --> 00:15:52,450 Bet tas pilnīgi nosaka tās piemērošanas jomu int y. 193 00:15:52,450 --> 00:15:57,320 Pēc šī otrā cirtaini lencēm, y nevar izmantot vairs. 194 00:15:57,910 --> 00:16:00,630 Jūs gandrīz nekad darīt, lai gan. 195 00:16:02,940 --> 00:16:07,370 Getting atpakaļ uz to, kas notiek, kad programma beidzas, 196 00:16:07,370 --> 00:16:18,760 tur ir sava veida nepareizs / pusi meliem, ka mēs piešķiram, lai tikai padarītu lietas vieglāk. 197 00:16:18,760 --> 00:16:24,410 Mēs jums pateikt, ka tad, kad jūs piešķirt atmiņu 198 00:16:24,410 --> 00:16:29,860 jūs piešķirot kādu gabalu no RAM šim mainīgajam. 199 00:16:29,860 --> 00:16:34,190 Bet jūs neesat īsti tieši pieskaras RAM kādreiz jūsu programmas. 200 00:16:34,190 --> 00:16:37,490 Ja jūs domājat par to, kā es vērsa - 201 00:16:37,490 --> 00:16:44,330 Un tiešām, ja jūs iet cauri gdb jūs redzēsiet to pašu. 202 00:16:51,120 --> 00:16:57,590 Neatkarīgi no tā, cik reizes jūs palaist savu programmu vai ko programma jūs strādājat, 203 00:16:57,590 --> 00:16:59,950 kaudze vienmēr gatavojas sākt - 204 00:16:59,950 --> 00:17:06,510 jūs vienmēr gatavojas redzēt mainīgos ap adrešu oxbffff kaut. 205 00:17:06,510 --> 00:17:09,470 Tas parasti kaut kur šajā reģionā. 206 00:17:09,470 --> 00:17:18,760 Bet kā var 2 programmas, iespējams, ir norādes uz to pašu atmiņu? 207 00:17:20,640 --> 00:17:27,650 [Students] Ir daži patvaļīgi apzīmējums kur oxbfff ir vajadzēja būt par RAM 208 00:17:27,650 --> 00:17:31,320 kas faktiski var būt dažādās vietās atkarībā no tā, kad funkcija tika saukta. 209 00:17:31,320 --> 00:17:35,920 Yeah. Termins ir virtuālā atmiņa. 210 00:17:35,920 --> 00:17:42,250 Ideja ir tāda, ka katrs process, katru programmu, kas darbojas jūsu datorā 211 00:17:42,250 --> 00:17:49,450 ir sava - pieņemsim 32 bitus - pilnīgi neatkarīga adrešu. 212 00:17:49,450 --> 00:17:51,590 Tas ir adrešu. 213 00:17:51,590 --> 00:17:56,220 Tai ir savi pilnīgi neatkarīgu 4 gigabaitus izmantot. 214 00:17:56,220 --> 00:18:02,220 >> Tātad, ja jūs darbināt 2 programmas vienlaicīgi, šī programma redz 4 gigabaitus uz sevi, 215 00:18:02,220 --> 00:18:04,870 Šī programma redz 4 gigabaitus uz sevi, 216 00:18:04,870 --> 00:18:07,720 un tas ir neiespējami, lai šīs programmas dereference rādītājs 217 00:18:07,720 --> 00:18:10,920 un galu galā ar atmiņu no šīs programmas. 218 00:18:10,920 --> 00:18:18,200 Un kāda virtuālā atmiņa ir ir kartēšanas no procesiem adrešu 219 00:18:18,200 --> 00:18:20,470 faktiskajiem lietas par RAM. 220 00:18:20,470 --> 00:18:22,940 Tāpēc tas ir līdz jūsu operētājsistēmu zināt, ka, 221 00:18:22,940 --> 00:18:28,080 hei, kad šis puisis dereferences rādītājs oxbfff, kas tiešām nozīmē 222 00:18:28,080 --> 00:18:31,040 ka viņš vēlas RAM baits 1000, 223 00:18:31,040 --> 00:18:38,150 tā kā, ja šī programma dereferences oxbfff, viņš tiešām grib RAM baitu 10000. 224 00:18:38,150 --> 00:18:41,590 Tie var būt patvaļīgi tālu viena no otras. 225 00:18:41,590 --> 00:18:48,730 Tas ir pat taisnība lietas vienā procesu adrešu. 226 00:18:48,730 --> 00:18:54,770 Tātad, piemēram, tas redz visus 4 gigabaitu uz sevi, bet, teiksim - 227 00:18:54,770 --> 00:18:57,290 [Students] Vai katru procesu - 228 00:18:57,290 --> 00:19:01,350 Pieņemsim, ka jums ir dators ar tikai 4 gigabaitu RAM. 229 00:19:01,350 --> 00:19:06,430 Vai katru procesu redzēt visu 4 gigabaitus? >> Jā. 230 00:19:06,430 --> 00:19:13,060 Bet 4 gigabaitiem tas redz ir meli. 231 00:19:13,060 --> 00:19:20,460 Tas ir tikai tā domā, ka ir visas šīs atmiņas, jo tas nezina citu process pastāv. 232 00:19:20,460 --> 00:19:28,140 Tas būs tikai izmantot tik daudz atmiņas, kā tas faktiski ir nepieciešama. 233 00:19:28,140 --> 00:19:32,340 Operētājsistēma nav gatavojas sniegt RAM šajā procesā 234 00:19:32,340 --> 00:19:35,750 ja tas nav, izmantojot jebkuru atmiņu šajā visā reģionā. 235 00:19:35,750 --> 00:19:39,300 Tas nav gatavojas sniegt tai atmiņas par šo reģionu. 236 00:19:39,300 --> 00:19:54,780 Bet ideja ir tāda, ka - es cenšos domāt par - es nevaru domāt par analoģijas. 237 00:19:54,780 --> 00:19:56,780 Analoģijas ir grūti. 238 00:19:57,740 --> 00:20:02,700 Viens no virtuālās atmiņas jautājumiem vai no lietām tas atrisināt vienu 239 00:20:02,700 --> 00:20:06,810 ir tāds, ka procesi būtu pilnīgi informēti par vienu citu. 240 00:20:06,810 --> 00:20:12,140 Un tā jūs varat rakstīt jebkuru programmu, kas tikko dereferences any rādītājs, 241 00:20:12,140 --> 00:20:19,340 patīk vienkārši uzrakstīt programmu, kas saka * (ox1234), 242 00:20:19,340 --> 00:20:22,890 un tas, dereferencing atmiņas adrese 1234. 243 00:20:22,890 --> 00:20:28,870 >> Bet tas ir atkarīgs no operētājsistēmas, lai pēc tam tulkot kādi 1234 līdzekļus. 244 00:20:28,870 --> 00:20:33,960 Tātad, ja 1234 notiek, ir derīga atmiņas adrese šim procesam, 245 00:20:33,960 --> 00:20:38,800 kā tas ir uz skursteņa vai kaut ko, tad tas atgriezīsies vērtību, kas atmiņas adresi 246 00:20:38,800 --> 00:20:41,960 ciktāl process zina. 247 00:20:41,960 --> 00:20:47,520 Bet, ja 1234 nav derīga adrese, līdzīgi kā tas notiek ar zemes 248 00:20:47,520 --> 00:20:52,910 kādā maz gabals no atmiņas šeit, ka ir aiz kaudze un aiz kaudzes 249 00:20:52,910 --> 00:20:57,200 un jums nav īsti lietot, ka tad tas ir tad, kad jūs iegūtu lietas, piemēram segmentācijas kļūdas 250 00:20:57,200 --> 00:21:00,260 jo jūs esat pieskaras atmiņu ka jums nevajadzētu būt aizkustinošs. 251 00:21:07,180 --> 00:21:09,340 Tas ir arī taisnība - 252 00:21:09,340 --> 00:21:15,440 32 bitu sistēma, 32 biti nozīmē jums ir 32 bitu, lai noteiktu atmiņas adresi. 253 00:21:15,440 --> 00:21:22,970 Tas ir iemesls, kāpēc norādes ir 8 baiti, jo 32 biti ir 8 baiti - vai 4 baiti. 254 00:21:22,970 --> 00:21:25,250 Norādes ir 4 baiti. 255 00:21:25,250 --> 00:21:33,680 Tātad, ja jūs redzat rādītāju, piemēram oxbfffff, tas ir - 256 00:21:33,680 --> 00:21:40,080 Ietilpst kādā programmu jūs varat vienkārši būvēt jebkāda patvaļīga rādītāju, 257 00:21:40,080 --> 00:21:46,330 jebkur no ox0 līdz vērsis 8 f's - ffffffff. 258 00:21:46,330 --> 00:21:49,180 [Students] Vai tu teikt, viņi 4 baiti? >> Jā. 259 00:21:49,180 --> 00:21:52,730 [Students] Tad katrs baits būs - >> [Bowden] Heksadecimāla. 260 00:21:52,730 --> 00:21:59,360 Heksadecimālajā - 5, 6, 7, 8. Tātad norādes jūs gatavojas vienmēr redzēt heksadecimālo. 261 00:21:59,360 --> 00:22:01,710 Tas ir tikai, kā mēs klasificēt norādes. 262 00:22:01,710 --> 00:22:05,240 Ik pēc 2 cipari heksadecimālā ir 1 baits. 263 00:22:05,240 --> 00:22:09,600 Tātad būs 8 heksadecimālcipariem par 4 baiti. 264 00:22:09,600 --> 00:22:14,190 Tāpēc katru rādītāju uz 32-bitu sistēmas būs 4 baiti, 265 00:22:14,190 --> 00:22:18,550 kas nozīmē, ka jūsu process var būvēt no patvaļīgu 4 baitus 266 00:22:18,550 --> 00:22:20,550 un veikt rādītāju no tā, 267 00:22:20,550 --> 00:22:32,730 kas nozīmē, ka, ciktāl tas ir zināms, tas var risināt visu no 2 līdz 32 baiti atmiņas. 268 00:22:32,730 --> 00:22:34,760 Pat ja tas nav īsti ir pieeja, ka, 269 00:22:34,760 --> 00:22:40,190 pat ja jūsu dators ir tikai 512 megabaiti, tas domā, ka ir tik daudz atmiņu. 270 00:22:40,190 --> 00:22:44,930 Un operētājsistēma ir pietiekami gudrs, ka tas būs tikai piešķirs kas jums tiešām ir nepieciešams. 271 00:22:44,930 --> 00:22:49,630 Tas nav tikai iet, ak, jaunu procesu: 4 gigs. 272 00:22:49,630 --> 00:22:51,930 >> Yeah. >> [Students] Ko vērsis nozīmē? Kāpēc jūs rakstīt? 273 00:22:51,930 --> 00:22:54,980 Tas ir tikai simbols heksadecimālo. 274 00:22:54,980 --> 00:22:59,590 Kad jūs redzat kādu cipara sākt ar vērsis, secīgie lietas ir heksadecimālais. 275 00:23:01,930 --> 00:23:05,760 [Students] Jūs izskaidrotu par to, kas notiek, kad programma beidzas. >> Jā. 276 00:23:05,760 --> 00:23:09,480 Kas notiek, kad programma beidzas ir operētājsistēma 277 00:23:09,480 --> 00:23:13,600 tikai izdzēš kartējumus, ka tas ir par šīm adresēm, un tas arī viss. 278 00:23:13,600 --> 00:23:17,770 Operētājsistēma tagad var vienkārši dot šo atmiņu uz citu programmu izmantot. 279 00:23:17,770 --> 00:23:19,490 [Students] Labi. 280 00:23:19,490 --> 00:23:24,800 Tātad, ja jūs piešķirt kaut uz kaudzes vai skursteņa vai globālo mainīgo vai kaut, 281 00:23:24,800 --> 00:23:27,010 viņi visi vienkārši pazūd, tiklīdz programma beidzas 282 00:23:27,010 --> 00:23:32,120 jo operētājsistēma ir tagad brīvi dot šo atmiņu uz kādu citu procesu. 283 00:23:32,120 --> 00:23:35,150 [Students] Pat ja ir iespējams, vēl vērtības rakstīts? >> Jā. 284 00:23:35,150 --> 00:23:37,740 Šīs vērtības ir iespējams joprojām. 285 00:23:37,740 --> 00:23:41,570 Tas ir tikai tas būs grūti nokļūt pie viņiem. 286 00:23:41,570 --> 00:23:45,230 Tas ir daudz grūtāk saņemt pie viņiem, nekā tas ir, lai saņemtu pie svītrots failu 287 00:23:45,230 --> 00:23:51,450 jo svītrots failu veida sēž tur uz ilgu laiku, un cietais disks ir daudz lielāks. 288 00:23:51,450 --> 00:23:54,120 Tātad tas notiek, lai pārrakstītu dažādas daļas atmiņas 289 00:23:54,120 --> 00:23:58,640 pirms tas notiek, lai pārrakstītu rieciens atmiņas ka fails, ko izmanto, lai būt. 290 00:23:58,640 --> 00:24:04,520 Bet galvenais atmiņas, RAM, jūs ciklu caur daudz ātrāk, 291 00:24:04,520 --> 00:24:08,040 tāpēc tas būs ļoti ātri tikt pāri. 292 00:24:10,300 --> 00:24:13,340 Jautājumi par šo vai kaut kas cits? 293 00:24:13,340 --> 00:24:16,130 [Students] man ir jautājumi par citu tēmu. >> Labi. 294 00:24:16,130 --> 00:24:19,060 Vai kāds ir jautājumi par šo? 295 00:24:20,170 --> 00:24:23,120 >> Labi. Atšķirīgs temats. >> [Students] Labi. 296 00:24:23,120 --> 00:24:26,550 Man bija iet caur kādu no praksē testus, 297 00:24:26,550 --> 00:24:30,480 un vienā no tām tika runā par sizeof 298 00:24:30,480 --> 00:24:35,630 un vērtība, kas tiek atgriezta vai dažādi mainīgi veida. >> Jā. 299 00:24:35,630 --> 00:24:45,060 Un tas teica, ka gan int un ilgi gan atgriešanos 4, lai viņi abi 4 baiti garš. 300 00:24:45,060 --> 00:24:48,070 Vai ir kāda atšķirība starp int un ilgu atšķirība, vai tas ir tas pats? 301 00:24:48,070 --> 00:24:50,380 Jā, tur ir atšķirība. 302 00:24:50,380 --> 00:24:52,960 C standarta - 303 00:24:52,960 --> 00:24:54,950 Es droši vien esmu gatavojas izjaukt. 304 00:24:54,950 --> 00:24:58,800 The C standarta ir tāpat kā to, ko C ir, tad oficiālo dokumentāciju C. 305 00:24:58,800 --> 00:25:00,340 Tas ir tas, ko tā saka. 306 00:25:00,340 --> 00:25:08,650 Tātad C standarta vienkārši saka, ka char būs mūžīgi un vienmēr būs 1 baits. 307 00:25:10,470 --> 00:25:19,040 Viss pēc tam - īsi vienmēr ir tikai noteikts kā lielāka vai vienāda ar char. 308 00:25:19,040 --> 00:25:23,010 Tas varētu būt stingri lielāks nekā, bet ne pozitīvi. 309 00:25:23,010 --> 00:25:31,940 Int tāpat definē kā lielāka vai vienāda ar īsu. 310 00:25:31,940 --> 00:25:36,210 Un ilgi ir tikai noteikts kā lielāka vai vienāda ar int. 311 00:25:36,210 --> 00:25:41,600 Un ilgi ilgi ir lielāks vai vienāds ar ilgi. 312 00:25:41,600 --> 00:25:46,610 Tātad vienīgā lieta C standarts nosaka ir relatīvs sakārtošana viss. 313 00:25:46,610 --> 00:25:54,880 Faktiskais atmiņas apjoms, kas lietas aizņem parasti ir līdz īstenošanai, 314 00:25:54,880 --> 00:25:57,640 bet tas ir diezgan labi definēta šajā brīdī. >> [Students] Labi. 315 00:25:57,640 --> 00:26:02,490 Tātad šorti ir gandrīz vienmēr būs 2 baiti. 316 00:26:04,920 --> 00:26:09,950 Ints ir gandrīz vienmēr būs 4 baiti. 317 00:26:12,070 --> 00:26:15,340 Long garie gandrīz vienmēr būs 8 baiti. 318 00:26:17,990 --> 00:26:23,160 Un ilgojas, tas atkarīgs no tā, vai jūs izmantojat 32 bitu vai 64 bitu sistēmu. 319 00:26:23,160 --> 00:26:27,450 Tik ilgi gatavojas atbilst tipa sistēmu. 320 00:26:27,450 --> 00:26:31,920 Ja jūs izmantojat 32 bitu sistēma, piemēram, iekārtu, tā būs 4 baiti. 321 00:26:34,530 --> 00:26:42,570 Ja jūs izmantojat 64 bitu, piemēram, daudz nesen datoru, tas būs 8 baiti. 322 00:26:42,570 --> 00:26:45,230 >> Ints gandrīz vienmēr ir 4 baiti šajā brīdī. 323 00:26:45,230 --> 00:26:47,140 Long garie gandrīz vienmēr ir 8 baiti. 324 00:26:47,140 --> 00:26:50,300 Agrāk, Ints izmanto, lai tikai 2 baiti. 325 00:26:50,300 --> 00:26:56,840 Bet paziņo, ka tas pilnībā atbilst visiem šiem lielāks un vienāds ar attiecībām. 326 00:26:56,840 --> 00:27:01,280 Tik ilgi ir pilnīgi atļauts būt tikpat lieli kā veselums, 327 00:27:01,280 --> 00:27:04,030 un tas ir arī atļauts būt tikpat lieli kā ilgi ilgi. 328 00:27:04,030 --> 00:27:11,070 Un tas tikai tā notiek, lai būt, ka 99,999% no sistēmas, tas būs vienāds ar 329 00:27:11,070 --> 00:27:15,800 nu int vai ilgi ilgi. Tas tikai atkarīgs 32-bitu vai 64 bitu. >> [Students] Labi. 330 00:27:15,800 --> 00:27:24,600 Jo pludiņiem, cik ir komata izraudzītā ziņā bitiem? 331 00:27:24,600 --> 00:27:27,160 Tāpat kā bināro? >> Jā. 332 00:27:27,160 --> 00:27:30,570 Jums nav nepieciešams zināt, ka par CS50. 333 00:27:30,570 --> 00:27:32,960 Jums pat nav uzzināt, ka 61. 334 00:27:32,960 --> 00:27:37,350 Jums nav uzzināt, ka īsti jebkurā laikā. 335 00:27:37,350 --> 00:27:42,740 Tas ir tikai pārstāvību. 336 00:27:42,740 --> 00:27:45,440 Es aizmirst precīzu bitu piešķīrumus. 337 00:27:45,440 --> 00:27:53,380 Peldošas punkta ideja ir, ka jūs piešķirt konkrētu skaitu bitu pārstāvēt - 338 00:27:53,380 --> 00:27:56,550 Būtībā, viss ir zinātniskajā pierakstā. 339 00:27:56,550 --> 00:28:05,600 Tātad jūs piešķirt konkrētu skaitu bitu pārstāvēt numuru pats, kā 1,2345. 340 00:28:05,600 --> 00:28:10,200 Es nekad nevar pārstāvēt vairākus ar vairāk cipariem nekā 5. 341 00:28:12,200 --> 00:28:26,300 Tad jūs arī piešķir īpašu bitu skaits, lai tas mēdz būt, piemēram, 342 00:28:26,300 --> 00:28:32,810 Jūs varat tikai līdz noteiktam skaitam, piemēram, ka ir lielākais rādītājs var būt, 343 00:28:32,810 --> 00:28:36,190 un jūs varat tikai iet uz leju, lai noteiktu eksponents, 344 00:28:36,190 --> 00:28:38,770 patīk, ka ir mazākā eksponents var būt. 345 00:28:38,770 --> 00:28:44,410 >> Es neatceros precīzu veidu biti tiek piešķirti visi no šīm vērtībām, 346 00:28:44,410 --> 00:28:47,940 bet noteiktu skaitu bitu ir veltīta 1,2345, 347 00:28:47,940 --> 00:28:50,930 cits zināms skaits bitu tiek veltīta eksponents, 348 00:28:50,930 --> 00:28:55,670 un tas ir iespējams tikai, lai pārstāvētu eksponents noteiktu lielumu. 349 00:28:55,670 --> 00:29:01,100 [Students] Un dubultā? Ir tā, ka, piemēram, papildus rīvdēli? >> Jā. 350 00:29:01,100 --> 00:29:07,940 Tas ir tas pats, kas peldēt izņemot tagad jūs izmantojat 8 baiti, nevis 4 baiti. 351 00:29:07,940 --> 00:29:11,960 Tagad jūs varēsiet izmantot 9 cipariem vai 10 cipariem, 352 00:29:11,960 --> 00:29:16,630 un šī būs iespēja doties līdz 300 nevis 100. >> [Students] Labi. 353 00:29:16,630 --> 00:29:21,550 Un pludiņi ir arī 4 baiti. >> Jā. 354 00:29:21,550 --> 00:29:27,520 Nu, atkal, tas, iespējams, ir atkarīgs kopumā par vispārējo īstenošanu, 355 00:29:27,520 --> 00:29:30,610 bet pludiņi ir 4 baiti, divvietīgi ir 8. 356 00:29:30,610 --> 00:29:33,440 Dubultspēlē sauc dubultā, jo tie ir dubultā lieluma pludiņi. 357 00:29:33,440 --> 00:29:38,380 [Students] Labi. Un vai ir dubultā dubultspēlē? >> Tur nav. 358 00:29:38,380 --> 00:29:43,660 Es domāju - >> [students] Tāpat garām garie? >> Jā. Es tā nedomāju. Jā. 359 00:29:43,660 --> 00:29:45,950 [Students] pagājušā gada tests bija par galveno funkciju jautājums 360 00:29:45,950 --> 00:29:49,490 kam jābūt daļa no jūsu programmas. 361 00:29:49,490 --> 00:29:52,310 Atbilde bija, ka tas nav jābūt daļa no jūsu programmas. 362 00:29:52,310 --> 00:29:55,100 Kādā situācijā? Tas, ko es redzēju. 363 00:29:55,100 --> 00:29:59,090 [Bowden] Šķiet - >> [students] Kas situācija? 364 00:29:59,090 --> 00:30:02,880 Vai jums ir problēma? >> [Students] Jā, es varu noteikti vilkt to uz augšu. 365 00:30:02,880 --> 00:30:07,910 Tai nav jābūt, tehniski, bet būtībā tas būs. 366 00:30:07,910 --> 00:30:10,030 [Students] Es redzēju vienu par atšķirīgu gadu. 367 00:30:10,030 --> 00:30:16,220 Tas bija kā True vai False: derīgs - >> Ak, c fails.? 368 00:30:16,220 --> 00:30:18,790 . [Students] Jebkura c fails jābūt - [abi runājot uzreiz - nesaprotams] 369 00:30:18,790 --> 00:30:21,120 Labi. Tā ka ir atsevišķi. 370 00:30:21,120 --> 00:30:26,800 >> . C failu tikai jāietver funkcijas. 371 00:30:26,800 --> 00:30:32,400 Jūs varat izveidot failu mašīnu kodu, binārā, neatkarīgi, 372 00:30:32,400 --> 00:30:36,620 ar to nav izpildāms vēl. 373 00:30:36,620 --> 00:30:39,420 Derīgs izpildāmā jābūt galveno funkciju. 374 00:30:39,420 --> 00:30:45,460 Jūs varat rakstīt 100 funkcijas 1 failu, bet nav galvenie 375 00:30:45,460 --> 00:30:48,800 un tad sastādīt ka ​​līdz bināro, 376 00:30:48,800 --> 00:30:54,460 tad jums rakstīt citu failu, kas ir tikai galvenais, bet tas prasa ķekars no šīm funkcijām 377 00:30:54,460 --> 00:30:56,720 Šajā binārā failā nekā šeit. 378 00:30:56,720 --> 00:31:01,240 Un tad, kad jūs gūstat izpildāmā, ka tas, ko Linker dara 379 00:31:01,240 --> 00:31:05,960 ir tā apvieno šos 2 bināros failus izpildāmā. 380 00:31:05,960 --> 00:31:11,400 Tā. C fails nav nepieciešams, lai būtu galvenā funkcija vispār. 381 00:31:11,400 --> 00:31:19,220 Un uz lieliem koda bāzes jūs redzēsiet tūkstošiem. C failus un 1 galveno failu. 382 00:31:23,960 --> 00:31:26,110 Vēl jautājumi? 383 00:31:29,310 --> 00:31:31,940 [Students] Tur bija cits jautājums. 384 00:31:31,940 --> 00:31:36,710 Tā teica darīt ir kompilators. Patiess vai aplams? 385 00:31:36,710 --> 00:31:42,030 Un atbilde ir nepatiesa, un es saprotu, kāpēc tas nav kā šķindēt. 386 00:31:42,030 --> 00:31:44,770 Bet ko mēs saucam darīt, ja tā nav? 387 00:31:44,770 --> 00:31:49,990 Padarīt ir būtībā tikai - es redzu tieši to, ko prasa to. 388 00:31:49,990 --> 00:31:52,410 Bet tas tikai sākas komandas. 389 00:31:53,650 --> 00:31:55,650 Padarīt. 390 00:31:58,240 --> 00:32:00,870 Es varu pull šo augšu. Yeah. 391 00:32:10,110 --> 00:32:13,180 Ak, jā. Veikt arī tas, ka. 392 00:32:13,180 --> 00:32:17,170 Šis saka marku lietderība mērķis ir noteikt automātiski 393 00:32:17,170 --> 00:32:19,610 daļām, kas lielā programmai jābūt recompiled 394 00:32:19,610 --> 00:32:22,350 un izdot komandas recompile tos. 395 00:32:22,350 --> 00:32:27,690 Jūs varat padarīt padarīt failus, kas ir absolūti milzīgs. 396 00:32:27,690 --> 00:32:33,210 Padarīt izskatās pēc laika zīmogu failu un, tāpat kā mēs teicām iepriekš, 397 00:32:33,210 --> 00:32:36,930 Jūs varat sastādīt atsevišķus failus leju, un tas nav līdz jums Linker 398 00:32:36,930 --> 00:32:39,270 ka viņi kopā izpildāmā. 399 00:32:39,270 --> 00:32:43,810 Tātad, ja jums ir 10 dažādas lietas, un jūs veikt izmaiņas no tiem 1, 400 00:32:43,810 --> 00:32:47,870 tad ko darīt gatavojas darīt, ir tikai recompile ka 1 fails 401 00:32:47,870 --> 00:32:50,640 un tad Relink viss kopā. 402 00:32:50,640 --> 00:32:53,020 Bet tas ir daudz stulbāki nekā. 403 00:32:53,020 --> 00:32:55,690 Tas ir atkarīgs no jums, lai pilnīgi noteikt, ka tas, ko tai būtu veicams. 404 00:32:55,690 --> 00:32:59,560 Tā pēc noklusējuma ir spēja atpazīt šo laika zīmogu sīkumi, 405 00:32:59,560 --> 00:33:03,220 bet jūs varat uzrakstīt Make fails darīt jebko. 406 00:33:03,220 --> 00:33:09,150 Jūs varat rakstīt padarīt failu tā, ka tad, kad jūs tipa padarīt to tikai CD uz citu direktoriju. 407 00:33:09,150 --> 00:33:15,560 Es biju kļūst neapmierinātas, jo es lavierēt viss iekšā manu Appliance 408 00:33:15,560 --> 00:33:21,740 un tad es apskatīt PDF no Mac. 409 00:33:21,740 --> 00:33:30,720 >> Tad es eju uz Finder un es varu iet, Connect to Server, 410 00:33:30,720 --> 00:33:36,950 un serveris es pieslēgties ir mana tehnika, un tad es atvērt PDF 411 00:33:36,950 --> 00:33:40,190 kas izpaužas apkopo LaTeX. 412 00:33:40,190 --> 00:33:49,320 Bet man bija kļūst neapmierināti, jo katru reizi, kad es nepieciešams, lai atsvaidzinātu PDF, 413 00:33:49,320 --> 00:33:53,900 Man bija kopēt to uz konkrētu direktoriju, ka tā varētu piekļūt 414 00:33:53,900 --> 00:33:57,710 un tas kļūst kaitinoši. 415 00:33:57,710 --> 00:34:02,650 Tā vietā es uzrakstīju Make fails, kurā jums ir noteikt, kā tas padara lietas. 416 00:34:02,650 --> 00:34:06,130 Kā jūs veicat šajā ir PDF LaTeX. 417 00:34:06,130 --> 00:34:10,090 Tāpat kā jebkuru citu marku failu - vai es domāju, jums nav redzējis lai failus, 418 00:34:10,090 --> 00:34:13,510 bet mums ir Ierīces globālu Make fails, kas vienkārši saka, 419 00:34:13,510 --> 00:34:16,679 ja jums ir sastādīšanas C failu, izmantojiet šķindēt. 420 00:34:16,679 --> 00:34:20,960 Un tāpēc šeit manā Make fails, ka es saku, 421 00:34:20,960 --> 00:34:25,020 Šis fails jūs gatavojas vēlaties, lai apkopotu ar PDF LaTeX. 422 00:34:25,020 --> 00:34:27,889 Un tāpēc tas ir PDF LaTeX ka dara sagatavošanu. 423 00:34:27,889 --> 00:34:31,880 Padarīt netiek apkopošanai. Tas ir tikai rādīt šīs komandas secībā es norādīto. 424 00:34:31,880 --> 00:34:36,110 Lai tas iet PDF latekss, tas kopē to direktoriju es gribu, lai to kopēt, 425 00:34:36,110 --> 00:34:38,270 tā CD uz direktoriju un dara citas lietas, 426 00:34:38,270 --> 00:34:42,380 bet visiem tas ir jāatzīst, kad failu izmaiņas, 427 00:34:42,380 --> 00:34:45,489 un ja tā maina, tad tas darbosies komandas, kas tas ir paredzēts, lai palaistu 428 00:34:45,489 --> 00:34:48,760 Kad fails mainās. >> [Students] Labi. 429 00:34:50,510 --> 00:34:54,420 Es nezinu, kur globālās marku faili ir man, lai pārbaudītu out. 430 00:34:57,210 --> 00:35:04,290 Citi jautājumi? Kaut kas no pagātnes viktorīnas? Any rādītājs lietas? 431 00:35:06,200 --> 00:35:08,730 Ir smalkas lietas ar šautru, piemēram - 432 00:35:08,730 --> 00:35:10,220 Es neesmu gatavojas, lai varētu atrast viktorīna jautājumu par to - 433 00:35:10,220 --> 00:35:16,250 bet tāpat kā šāda veida lieta. 434 00:35:19,680 --> 00:35:24,060 Pārliecinieties, ka jūs saprotat, ka tad, kad es saku int * x * y - 435 00:35:24,890 --> 00:35:28,130 Tas nav īsti kaut kas šeit, es domāju. 436 00:35:28,130 --> 00:35:32,140 Bet, tāpat kā * x * y, kas ir 2 mainīgie, kas ir par kaudze. 437 00:35:32,140 --> 00:35:37,220 Kad es saku x = malloc (sizeof (int)), x ir joprojām mainīga uz skursteņa, 438 00:35:37,220 --> 00:35:41,180 malloc ir daži bloks pār kaudzes, un mēs esam, kam x norāda uz kaudzes. 439 00:35:41,180 --> 00:35:43,900 >> Lai kaut uz skursteņa punktiem līdz kaudzes. 440 00:35:43,900 --> 00:35:48,100 Ikreiz, kad jūs malloc kaut ko, jūs neizbēgami uzglabājot to iekšpusē rādītājs. 441 00:35:48,100 --> 00:35:55,940 Lai rādītājs ir uz skursteņa, tad malloced bloks ir uz kaudzes. 442 00:35:55,940 --> 00:36:01,240 Daudzi cilvēki saņemt sajaukt un pateikt int * x = malloc, x ir uz kaudzes. 443 00:36:01,240 --> 00:36:04,100 Nē Kas x norāda uz ir uz kaudzes. 444 00:36:04,100 --> 00:36:08,540 x pati uz skursteņa, ja vien kāda iemesla dēļ jums ir x būt globālo mainīgo, 445 00:36:08,540 --> 00:36:11,960 tādā gadījumā tas notiek, ir citā reģionā atmiņu. 446 00:36:13,450 --> 00:36:20,820 Tātad sekotu, šie kaste un bultu diagrammas ir diezgan izplatīta, lai viktorīnas. 447 00:36:20,820 --> 00:36:25,740 Vai, ja tas nav 0 viktorīnu, tas būs uz 1 viktorīnā. 448 00:36:27,570 --> 00:36:31,940 Jums vajadzētu zināt visas šīs, pasākumus apkopojot 449 00:36:31,940 --> 00:36:35,740 jo jums bija jāatbild uz jautājumiem par tiem. Jā. 450 00:36:35,740 --> 00:36:38,940 [Students] Vai mēs iesim pa šiem soļiem - >> Protams. 451 00:36:48,340 --> 00:36:58,640 Pirms posmiem un apkopojot mums ir preprocessing, 452 00:36:58,640 --> 00:37:16,750 apkopojot, montāža, un savieno. 453 00:37:16,750 --> 00:37:21,480 Preprocessing. Ko tas dara? 454 00:37:29,720 --> 00:37:32,290 Tas ir vieglākais solis - labi, nepatīk - 455 00:37:32,290 --> 00:37:35,770 tas nenozīmē, ka tas būtu skaidrs, bet tas ir vieglākais solis. 456 00:37:35,770 --> 00:37:38,410 Jūs puiši varētu īstenot to paši. Yeah. 457 00:37:38,410 --> 00:37:43,410 [Students] Ņem to, kas jums ir jūsu ietver, piemēram, šo un to kopijas, un tad arī nosaka. 458 00:37:43,410 --> 00:37:49,250 Tas izskatās lietām, piemēram # ietvert un # define, 459 00:37:49,250 --> 00:37:53,800 un tas tikai kopijas un pastas, ko tie patiesībā nozīmē. 460 00:37:53,800 --> 00:37:59,240 Tātad, kad jūs sakāt # ietvert cs50.h, apstrādātāju ir kopēšanas un ielīmēšanas cs50.h 461 00:37:59,240 --> 00:38:01,030 uz šīs līnijas. 462 00:38:01,030 --> 00:38:06,640 Kad jūs sakāt # define x būt 4, apstrādātāju iet cauri visai programmai 463 00:38:06,640 --> 00:38:10,400 un aizvieto visus gadījumus x ar 4. 464 00:38:10,400 --> 00:38:17,530 Tāpēc apstrādātāju ņem derīgu C failu un izvada derīgu C failu 465 00:38:17,530 --> 00:38:20,300 ja lietas ir nokopēt un ielīmēt. 466 00:38:20,300 --> 00:38:24,230 Tāpēc tagad apkopojot. Ko tas dara? 467 00:38:25,940 --> 00:38:28,210 [Students] Pats no C uz bināro. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] Tas nav iet visu ceļu uz bināro. 469 00:38:30,970 --> 00:38:34,220 [Students] Lai mašīnu kodu tad? >> Tas nav mašīnu kodu. 470 00:38:34,220 --> 00:38:35,700 [Students] Asambleja? >> Asambleja. 471 00:38:35,700 --> 00:38:38,890 Tā iet uz Asamblejai pirms tā iet visu ceļu uz C kodu, 472 00:38:38,890 --> 00:38:45,010 un dzimtās valodas darīt kaut kas līdzīgs šim. 473 00:38:47,740 --> 00:38:50,590 Izvēlēties jebkuru augsta līmeņa valoda, un, ja jūs gatavojas apkopot to, 474 00:38:50,590 --> 00:38:52,390 tas ir iespējams apkopot pa soļiem. 475 00:38:52,390 --> 00:38:58,140 Pirmkārt, tas notiek, lai apkopotu Python uz C, tad tas notiek, lai apkopotu C līdz asambleja, 476 00:38:58,140 --> 00:39:01,600 un tad asambleja gatavojas saņemt jātulko uz bināro. 477 00:39:01,600 --> 00:39:07,800 Tātad apkopojot gatavojas celt to no C līdz asamblejai. 478 00:39:07,800 --> 00:39:12,130 Vārds sastādīšanas parasti nozīmē apvienojot to no augstākā līmenī 479 00:39:12,130 --> 00:39:14,340 uz zemāka līmeņa programmēšanas valodu. 480 00:39:14,340 --> 00:39:19,190 Tātad šis ir vienīgais solis apkopošanai, ja jūs sākat ar augsta līmeņa valoda 481 00:39:19,190 --> 00:39:23,270 un galu galā ar zema līmeņa valoda, un tas ir iemesls, kāpēc solis sauc apkopošanai. 482 00:39:25,280 --> 00:39:33,370 [Students] Laikā apkopojot, pieņemsim, ka jūs esat darījuši # ietvert cs50.h. 483 00:39:33,370 --> 00:39:42,190 Vai kompilators recompile cs50.h, tāpat funkcijām, kas ir tur, 484 00:39:42,190 --> 00:39:45,280 un pārveido to montāža kodu, kā arī, 485 00:39:45,280 --> 00:39:50,830 vai arī tas kopēt un ielīmēt kaut kas ir bijis iepriekš asambleja? 486 00:39:50,830 --> 00:39:56,910 cs50.h būs diezgan daudz nekad nonāk asamblejā. 487 00:39:59,740 --> 00:40:03,680 Sīkumi, piemēram, funkciju prototipus un lietas ir tikai, lai jūs varētu būt uzmanīgiem. 488 00:40:03,680 --> 00:40:09,270 Tas garantē, ka kompilators var pārbaudīt lietas, piemēram, jūs zvanāt funkcijas 489 00:40:09,270 --> 00:40:12,910 ar tiesībām atgriešanās veidu un tiesības argumentiem un stuff. 490 00:40:12,910 --> 00:40:18,350 >> Tāpēc cs50.h tiks preprocessed failā, un tad, kad tas ir apkopojot 491 00:40:18,350 --> 00:40:22,310 tas būtībā izmest pēc tam nodrošina, ka viss tiek saukta pareizi. 492 00:40:22,310 --> 00:40:29,410 Bet funkcijas definētie CS50 bibliotēkā, kas ir atsevišķi no cs50.h, 493 00:40:29,410 --> 00:40:33,610 tie netiks atsevišķi apkopoti. 494 00:40:33,610 --> 00:40:37,270 Tas patiešām nāk uz leju savieno solis, lai mēs nokļūt, ka otrais. 495 00:40:37,270 --> 00:40:40,100 Bet vispirms, kas ir montāžas? 496 00:40:41,850 --> 00:40:44,500 [Students] Asambleja uz bināro? >> Jā. 497 00:40:46,300 --> 00:40:48,190 Montāža. 498 00:40:48,190 --> 00:40:54,710 Mums nav to saucam apkopojot jo Asambleja ir diezgan daudz tīra tulkojumu bināro. 499 00:40:54,710 --> 00:41:00,230 Ir ļoti maz loģika iet no Asamblejas bināro. 500 00:41:00,230 --> 00:41:03,180 Tas ir tāpat kā skatoties uz augšu tabulā, ak, mums ir šī instrukcija; 501 00:41:03,180 --> 00:41:06,290 kas atbilst 01.110 bināro. 502 00:41:10,200 --> 00:41:15,230 Un tā faili, kas montāžas parasti rezultāti ir. O failus. 503 00:41:15,230 --> 00:41:19,020 Un. O faili ir tas, ko mēs teicām iepriekš, 504 00:41:19,020 --> 00:41:21,570 Kā fails nav nepieciešams, lai būtu galvenā funkcija. 505 00:41:21,570 --> 00:41:27,640 Jebkuru failu var apkopot leju, lai. O failu, kamēr tas ir derīgs C fails. 506 00:41:27,640 --> 00:41:30,300 To var sastādīt līdz. O. 507 00:41:30,300 --> 00:41:43,030 Tagad, saistot ir kādi patiesībā nes ķekars o failus un. Nes tos uz izpildāmā. 508 00:41:43,030 --> 00:41:51,110 Un tā, kādi saistot tas ir varat domāt par CS50 bibliotēkas kā. O failu. 509 00:41:51,110 --> 00:41:56,980 Tā ir jau apkopoti bināro failu. 510 00:41:56,980 --> 00:42:03,530 Un tad, kad jūs sastādīt savu failu, jūsu hello.c, kurā aicina GetString, 511 00:42:03,530 --> 00:42:06,360 hello.c izpaužas apkopoti līdz hello.o, 512 00:42:06,360 --> 00:42:08,910 hello.o tagad ir bināro. 513 00:42:08,910 --> 00:42:12,830 Tas izmanto GetString, tāpēc ir jāiet pār cs50.o, 514 00:42:12,830 --> 00:42:16,390 un Linker smooshes tos kopā un kopē GetString šajā failā 515 00:42:16,390 --> 00:42:20,640 un nāk ar izpildāmā, kas ir visas funkcijas tai vajadzīga. 516 00:42:20,640 --> 00:42:32,620 Tāpēc cs50.o nav reāli O fails, bet tas ir pietiekami tuvu, ka nav būtiskas atšķirības. 517 00:42:32,620 --> 00:42:36,880 Tik saistot tikai rada ķekars failus kopā 518 00:42:36,880 --> 00:42:41,390 ka atsevišķi satur visas funkcijas, man ir nepieciešams, lai izmantotu 519 00:42:41,390 --> 00:42:46,120 un rada izpildāmā, kas faktiski darbojas. 520 00:42:48,420 --> 00:42:50,780 >> Un tā tas ir arī tas, ko mēs teicām pirms 521 00:42:50,780 --> 00:42:55,970 kur var būt 1000. c failus, jūs sastādīt tos visus o failus. 522 00:42:55,970 --> 00:43:00,040 kas, iespējams pieņemt, bet, tad jums mainīt 1. c failu. 523 00:43:00,040 --> 00:43:05,480 Jums tikai nepieciešams recompile ka 1. C failu un tad Relink viss pārējais, 524 00:43:05,480 --> 00:43:07,690 saite visu atpakaļ kopā. 525 00:43:09,580 --> 00:43:11,430 [Students] Kad mēs saistot mēs rakstām lcs50? 526 00:43:11,430 --> 00:43:20,510 Jā, tā lcs50. Ka karoga signālus ar linker ka jums jābūt saista šajā bibliotēkā. 527 00:43:26,680 --> 00:43:28,910 Jautājumi? 528 00:43:41,310 --> 00:43:46,860 Vai mēs esam aizgājuši pa binārā citā kā 5 sekundēm pirmajā lekcijā? 529 00:43:50,130 --> 00:43:53,010 Es tā nedomāju. 530 00:43:55,530 --> 00:43:58,820 Jums vajadzētu zināt visu par lielo Os ka mēs esam aizgājuši pārāk, 531 00:43:58,820 --> 00:44:02,670 un jums vajadzētu būt iespējai, ja mēs tev funkciju, 532 00:44:02,670 --> 00:44:09,410 Jums vajadzētu būt iespējai pateikt, tas ir liels O, rupji. Vai arī, liels O ir raupja. 533 00:44:09,410 --> 00:44:15,300 Tātad, ja jūs redzat ligzdot uz cilpas looping pa to pašu skaitu lietas, 534 00:44:15,300 --> 00:44:22,260 piemēram int i, i > [students] n rūtiņām. >> Tas mēdz būt n rūtiņām. 535 00:44:22,260 --> 00:44:25,280 Ja jums ir trīskāršs ligzdot, tā mēdz būt n kubā. 536 00:44:25,280 --> 00:44:29,330 Tāpēc, ka veida lieta, jums vajadzētu būt iespējai norādīt uzreiz. 537 00:44:29,330 --> 00:44:33,890 Jums jāzina ievietošanas šķirot un burbulis šķirot un apvienot veida un visu no tiem. 538 00:44:33,890 --> 00:44:41,420 Tas ir vieglāk saprast, kāpēc viņi ir tie n rūtiņām un n log n un visiem, kas 539 00:44:41,420 --> 00:44:47,810 jo es domāju, ka tur bija viktorīnu vienu gadu, kur mēs būtībā deva jums 540 00:44:47,810 --> 00:44:55,050 gada burbuļu veida ieviešana un sacīja: "Kāds ir darba laiks šīs funkcijas?" 541 00:44:55,050 --> 00:45:01,020 Tātad, ja jūs atzīt to kā burbulis kārtot, tad jūs varat uzreiz pateikt n rūtiņām. 542 00:45:01,020 --> 00:45:05,470 Bet, ja jūs vienkārši skatīties uz to, jums nav pat nepieciešams saprast, tas ir burbulis šķirot; 543 00:45:05,470 --> 00:45:08,990 Jūs varat vienkārši pateikt tas dara šo un to. Šis ir n rūtiņām. 544 00:45:12,350 --> 00:45:14,710 [Students] Vai ir kādas grūtas piemērus var nākt klajā ar, 545 00:45:14,710 --> 00:45:20,370 piemēram līdzīgu ideju norādītas? 546 00:45:20,370 --> 00:45:24,450 >> Es nedomāju, ka mēs varētu sniegt jums jebkādu grūts piemērus. 547 00:45:24,450 --> 00:45:30,180 Burbulis šķirot lieta ir apmēram tikpat grūts kā mēs varētu iet, 548 00:45:30,180 --> 00:45:36,280 un pat, ka, kamēr jūs saprotat, ka jūs atkārtojot pa masīva 549 00:45:36,280 --> 00:45:41,670 katram elementam masīvā, kas būs kaut kas ir n rūtiņām. 550 00:45:45,370 --> 00:45:49,940 Ir vispārīgi jautājumi, piemēram, tepat mums ir - Ak. 551 00:45:55,290 --> 00:45:58,530 Tikai otro dienu, Dags apgalvoja: "Es esmu izgudroja algoritmu, kas var sakārtot masīvu 552 00:45:58,530 --> 00:46:01,780 "No n skaitļu O (log n) laiks!" 553 00:46:01,780 --> 00:46:04,900 Tātad, kā mēs zinām, ka ir neiespējami? 554 00:46:04,900 --> 00:46:08,850 [Dzirdams studentu reaģēšanas] >> Jā. 555 00:46:08,850 --> 00:46:13,710 Vismaz, jums ir pieskarties katru elementu masīvā, 556 00:46:13,710 --> 00:46:16,210 tāpēc nav iespējams sakārtot masīvu - 557 00:46:16,210 --> 00:46:20,850 Ja viss ir nešķirotu kārtībā, tad jūs esat būs pieskaras viss masīvā, 558 00:46:20,850 --> 00:46:25,320 tāpēc tas ir iespējams darīt to mazāk nekā O n. 559 00:46:27,430 --> 00:46:30,340 [Students] Jūs mums parādīja, ka piemērs ir iespēja to darīt O n 560 00:46:30,340 --> 00:46:33,920 ja jūs izmantojat daudz atmiņas. >> Jā. 561 00:46:33,920 --> 00:46:37,970 Un That - es aizmirst to That - Vai tas skaitīšanas šķirot? 562 00:46:47,360 --> 00:46:51,330 Hmm. Tas ir vesels šķirošanas algoritmu. 563 00:46:59,850 --> 00:47:05,100 Es meklēju īpašo nosaukumu tas, ka es nevarēju atcerēties pagājušajā nedēļā. 564 00:47:05,100 --> 00:47:13,000 Yeah. Tie ir veidi veidu, kas var paveikt lietas n Big O. 565 00:47:13,000 --> 00:47:18,430 Bet ir ierobežojumi, piemēram, jūs varat izmantot tikai integers līdz noteiktam skaitam. 566 00:47:20,870 --> 00:47:24,560 Plus, ja jūs mēģināt kārtot kaut That - 567 00:47:24,560 --> 00:47:30,750 Ja jūsu masīvs ir 012, -12, 151, 4 miljoni, 568 00:47:30,750 --> 00:47:35,120 tad viens elements ir gatavojas pilnībā sagraut visu šķirošanu. 569 00:47:42,060 --> 00:47:44,030 >> Jautājumi? 570 00:47:49,480 --> 00:47:58,870 [Students] Ja jums ir rekursīvo funkciju un tas tikai padara rekursīvas zvanu 571 00:47:58,870 --> 00:48:02,230 ietvaros atgriešanās paziņojumu, ka ir astes rekursīvs 572 00:48:02,230 --> 00:48:07,360 un tā būtu, ka ne vairāk atmiņas laikā Runtime 573 00:48:07,360 --> 00:48:12,550 vai tas būtu vismaz izmantot salīdzināmu atmiņā kā iteratīvs risinājums? 574 00:48:12,550 --> 00:48:14,530 [Bowden] Jā. 575 00:48:14,530 --> 00:48:19,840 Tas būtu iespējams, būs nedaudz lēnāks, bet nav īsti. 576 00:48:19,840 --> 00:48:23,290 Astes rekursīvs ir diezgan laba. 577 00:48:23,290 --> 00:48:32,640 Raugoties atkal kaudze rāmji, pieņemsim, ka mums ir galvenais 578 00:48:32,640 --> 00:48:42,920 un mums ir int bar (int x) vai kaut ko. 579 00:48:42,920 --> 00:48:52,310 Tas nav ideāls rekursīvas funkcijas, bet atgriešanās bārs (x - 1). 580 00:48:52,310 --> 00:48:57,620 Tātad acīmredzot, tas ir kļūdains. Jums ir nepieciešams bāzes lietas un stuff. 581 00:48:57,620 --> 00:49:00,360 Bet doma ir, ka tas ir aste rekursīvs 582 00:49:00,360 --> 00:49:06,020 kas nozīmē, kad galvenais zvani bārs tas notiek, lai saņemtu savu steka rāmi. 583 00:49:09,550 --> 00:49:12,440 Šajā kaudze rāmi tur būs maz bloks atmiņas 584 00:49:12,440 --> 00:49:17,490 kas atbilst tās argumentu x. 585 00:49:17,490 --> 00:49:25,840 Un tāpēc pieņemsim, ka galvenais notiek zvanīt bar (100); 586 00:49:25,840 --> 00:49:30,050 Tātad x ir gatavojas sākt no kā 100. 587 00:49:30,050 --> 00:49:35,660 Ja kompilators atzīst, ka šis ir astes rekursīvs funkcija, 588 00:49:35,660 --> 00:49:38,540 tad kad josla padara tās rekursīvas aicinājumu uz bāru, 589 00:49:38,540 --> 00:49:45,490 vietā, lai jauno kaudze rāmi, kas ir, ja kaudze sāk aug lielākoties, 590 00:49:45,490 --> 00:49:48,220 galu galā tā nonāks kaudzes un tad jūs saņemsiet segmentācijas kļūdas 591 00:49:48,220 --> 00:49:51,590 jo atmiņas sākas sadursmes. 592 00:49:51,590 --> 00:49:54,830 >> Tā vietā, lai padarītu savu steku rāmi, tā var realizēt, 593 00:49:54,830 --> 00:49:59,080 hey, es nekad tiešām ir nepieciešams atgriezties pie šā kaudze rāmi, 594 00:49:59,080 --> 00:50:08,040 tā vietā es ņemšu tikai aizstāt šo argumentu ar 99 un pēc tam sākt bārs visā. 595 00:50:08,040 --> 00:50:11,810 Un tad tas būs jādara vēlreiz, un tas sasniegs atgriešanās bārs (x - 1), 596 00:50:11,810 --> 00:50:17,320 un tā vietā, lai jauno kaudze rāmi, tas būs vienkārši nomainīt savu pašreizējo argumentu ar 98 597 00:50:17,320 --> 00:50:20,740 un tad lēkt atpakaļ uz paša sākuma bārā. 598 00:50:23,860 --> 00:50:30,430 Šīs operācijas, aizstājot ka 1 vērtību kaudze un lekt atpakaļ uz sākumu, 599 00:50:30,430 --> 00:50:32,430 ir diezgan efektīvi. 600 00:50:32,430 --> 00:50:41,500 Tātad ne tikai šis pats atmiņas izmantošana kā atsevišķu funkciju, kas ir atkārtots 601 00:50:41,500 --> 00:50:45,390 jo jūs tikai izmantojot 1 steka rāmis, bet jūs neesat cieš downsides 602 00:50:45,390 --> 00:50:47,240 , kam zvanīt funkcijas. 603 00:50:47,240 --> 00:50:50,240 Zvanu funkcijas var būt nedaudz dārgāka, jo tas ir jādara visu šo setup 604 00:50:50,240 --> 00:50:52,470 un Teardown un tas viss. 605 00:50:52,470 --> 00:50:58,160 Tātad šī aste rekursija ir labs. 606 00:50:58,160 --> 00:51:01,170 [Students] Kāpēc tas neradītu jaunus soļus? 607 00:51:01,170 --> 00:51:02,980 Jo tas saprot, ka tas nav nepieciešams. 608 00:51:02,980 --> 00:51:07,800 Zvanu uz bāru ir tikai atgriežas rekursīvas zvanu. 609 00:51:07,800 --> 00:51:12,220 Tāpēc nav nepieciešams neko darīt ar atgriešanās vērtību. 610 00:51:12,220 --> 00:51:15,120 Tas ir tikai gatavojas nekavējoties atdot. 611 00:51:15,120 --> 00:51:20,530 Tātad tas ir tikai gatavojas nomainīt savu argumentāciju un sākt no jauna. 612 00:51:20,530 --> 00:51:25,780 Un arī, ja jums nav asti rekursīvas versiju, 613 00:51:25,780 --> 00:51:31,460 tad jums visas šīs bāri, kur, kad šis bārs atgriež 614 00:51:31,460 --> 00:51:36,010 tas ir, lai atgrieztos tās vērtību šo vienu, tad bārs uzreiz atgriež 615 00:51:36,010 --> 00:51:39,620 un tas atgriežas savu vērtību uz šo vienu, tad tas ir tikai gatavojas nekavējoties atgriezties 616 00:51:39,620 --> 00:51:41,350 un atgriezties tās vērtību uz šo vienu. 617 00:51:41,350 --> 00:51:45,350 Tātad jūs esat taupīšanu šis popping visas šīs lietas nost no skursteņa 618 00:51:45,350 --> 00:51:48,730 kopš atgriešanās vērtība ir tikai būs pagājis visu ceļu atpakaļ līdz vienalga. 619 00:51:48,730 --> 00:51:55,400 Tad kāpēc ne tikai nomainīt mūsu argumentu ar atjaunināto argumentu un sākt no jauna? 620 00:51:57,460 --> 00:52:01,150 Ja funkcija nav astes rekursīvs, ja jūs kaut kas līdzīgs - 621 00:52:01,150 --> 00:52:07,530 [Students], ja josla (x + 1). >> Jā. 622 00:52:07,530 --> 00:52:11,770 >> Tātad, ja jūs nodot to stāvoklī, tad jūs darāt kaut ko ar atgriešanās vērtību. 623 00:52:11,770 --> 00:52:16,260 Vai pat, ja jūs vienkārši darīt atdevi 2 * bar (x - 1). 624 00:52:16,260 --> 00:52:23,560 Tāpēc tagad josla (x - 1) nepieciešams atgriezties, lai tā varētu aprēķināt 2 reizes, ka vērtība, 625 00:52:23,560 --> 00:52:26,140 tāpēc tagad tai ir nepieciešama sava atsevišķa steka rāmi, 626 00:52:26,140 --> 00:52:31,180 un tagad, nav svarīgi, cik grūti jums izmēģināt, jūs dodas uz nepieciešamību - 627 00:52:31,180 --> 00:52:34,410 Tas nav astes rekursīvs. 628 00:52:34,410 --> 00:52:37,590 [Students] Vai es mēģinātu celt rekursija tiekties uz astes rekursijas - 629 00:52:37,590 --> 00:52:41,450 [Bowden] Ir ideāla pasaule, bet CS50 jums nav. 630 00:52:43,780 --> 00:52:49,280 Lai iegūtu asti rekursijas, vispār, jums izveidot papildu argumentu 631 00:52:49,280 --> 00:52:53,550 kur josla būs int x vērā y 632 00:52:53,550 --> 00:52:56,990 un y atbilst gala lieta, ko vēlaties atgriezties. 633 00:52:56,990 --> 00:53:03,650 Tātad, tad tas jūs esat būs atgriešanās bar (x - 1), 2 * y. 634 00:53:03,650 --> 00:53:09,810 Tātad tas ir tikai augsta līmeņa, kā jūs pārveidot lietas, kas asti rekursīvas. 635 00:53:09,810 --> 00:53:13,790 Bet papildu arguments - 636 00:53:13,790 --> 00:53:17,410 Un tad beigās, kad jūs sasniedzat savu pamata situāciju, jūs vienkārši atgriezties y 637 00:53:17,410 --> 00:53:22,740 jo jūs esat uzkrājas visu laiku atgriešanās vērtību, ko vēlaties. 638 00:53:22,740 --> 00:53:27,280 Jūs veida ir darot to iteratīvi bet izmantojot rekursīvas zvaniem. 639 00:53:32,510 --> 00:53:34,900 Jautājumi? 640 00:53:34,900 --> 00:53:39,890 [Students] Varbūt par rādītāja aritmētisko, piemēram, izmantojot virknes. >> Protams. 641 00:53:39,890 --> 00:53:43,610 Rādītājs aritmētika. 642 00:53:43,610 --> 00:53:48,440 Ja izmanto virknes tas ir viegli, jo stīgas ir char zvaigznes, 643 00:53:48,440 --> 00:53:51,860 simboli ir mūžīgi un vienmēr baitu, 644 00:53:51,860 --> 00:53:57,540 un tā rādītājs aritmētiskais ir līdzvērtīgs regulāri aritmētisko kad jūs nodarbojas ar stīgām. 645 00:53:57,540 --> 00:54:08,790 Pieņemsim tikai teikt, char * s = "sveiki". 646 00:54:08,790 --> 00:54:11,430 Tātad mums ir bloku atmiņā. 647 00:54:19,490 --> 00:54:22,380 Tas nepieciešams 6 baiti, jo jums vienmēr vajag null terminatoru. 648 00:54:22,380 --> 00:54:28,620 Un char * s gatavojas norādīt uz sākumu šī masīva. 649 00:54:28,620 --> 00:54:32,830 Tāpēc s norāda tur. 650 00:54:32,830 --> 00:54:36,710 Tagad tas ir būtībā kā jebkurš masīvs darbi, 651 00:54:36,710 --> 00:54:40,780 neatkarīgi no tā, vai tā bija atgriešanās pēc malloc vai tas ir uz skursteņa. 652 00:54:40,780 --> 00:54:47,110 Jebkurš masīvs būtībā rādītājs uz sākuma masīvs, 653 00:54:47,110 --> 00:54:53,640 un tad jebkura masīva operācija, jebkura indeksācija, ir tikai iet uz šo masīvs noteiktu atlīdzību. 654 00:54:53,640 --> 00:55:05,360 >> Tātad, kad es saku kaut ko līdzīgu s [3], tas ir gatavojas s un skaitīšana 3 chars collas 655 00:55:05,360 --> 00:55:12,490 Tāpēc s [3], mums ir 0, 1, 2, 3, tāpēc s [3] gatavojas atsaukties uz šo l. 656 00:55:12,490 --> 00:55:20,460 [Students] Un mēs varētu sasniegt to pašu vērtību darot s + 3 un tad iekavas zvaigzne? 657 00:55:20,460 --> 00:55:22,570 Jā. 658 00:55:22,570 --> 00:55:26,010 Tas ir līdzvērtīgs * (s + 3); 659 00:55:26,010 --> 00:55:31,240 un tas ir uz visiem laikiem un vienmēr līdzvērtīgi nav svarīgi, ko jūs darāt. 660 00:55:31,240 --> 00:55:34,070 Jums nekad nevajadzēs izmantot balsteņa sintaksi. 661 00:55:34,070 --> 00:55:37,770 Jūs vienmēr varat izmantot * (S + 3) sintakse. 662 00:55:37,770 --> 00:55:40,180 Cilvēki mēdz patīk balsteņa sintaksi, lai gan. 663 00:55:40,180 --> 00:55:43,860 [Students] Tātad visi bloki ir faktiski tikai norādes. 664 00:55:43,860 --> 00:55:53,630 Ir neliela atšķirība, kad es saku int x [4]; >> [students] Vai tas rada atmiņu? 665 00:55:53,630 --> 00:56:03,320 [Bowden] Tas būs izveidot 4 Ints uz skursteņa, tā 16 baiti kopumā. 666 00:56:03,320 --> 00:56:05,700 Tas notiek, lai radītu 16 baiti uz skursteņa. 667 00:56:05,700 --> 00:56:09,190 x netiek saglabāta jebkur. 668 00:56:09,190 --> 00:56:13,420 Tas ir tikai simbols, kas attiecas uz sākuma lieta. 669 00:56:13,420 --> 00:56:17,680 Jo jums paziņoja masīvs iekšpuses šo funkciju, 670 00:56:17,680 --> 00:56:22,340 ko kompilators gatavojas darīt, ir vienkārši nomainīt visus gadījumus mainīgā x 671 00:56:22,340 --> 00:56:26,400 ar kur tas noticis, lai izvēlētos, lai šos 16 baiti. 672 00:56:26,400 --> 00:56:30,040 To nevar darīt, ka ar char * s, jo s ir faktiskā rādītājs. 673 00:56:30,040 --> 00:56:32,380 Tā ir bezmaksas, tad norādīt uz citām lietām. 674 00:56:32,380 --> 00:56:36,140 x ir konstants. Jūs nevar būt tā norāda uz citu masīvu. >> [Students] Labi. 675 00:56:36,140 --> 00:56:43,420 Bet šī ideja, šis indeksācija, ir tas pats, neatkarīgi no tā, vai tas ir tradicionāls masīvs 676 00:56:43,420 --> 00:56:48,230 vai, ja tas ir rādītājs, lai kaut vai, ja tas rādītājs, lai malloced masīvs. 677 00:56:48,230 --> 00:56:59,770 Un patiesībā, tas ir tik līdzvērtīga ka ir arī pats. 678 00:56:59,770 --> 00:57:05,440 Tas faktiski tikai nozīmē to, kas iekšpusē no iekavās un to, kas palicis pāri no iekavās, 679 00:57:05,440 --> 00:57:07,970 piebilst tos kopā, un dereferences. 680 00:57:07,970 --> 00:57:14,710 Tātad tas ir tikpat derīga kā * (S + 3) vai s [3]. 681 00:57:16,210 --> 00:57:22,090 [Students] Vai jums ir norādes, kas norāda uz 2-dimensiju masīvu? 682 00:57:22,090 --> 00:57:27,380 >> Tas ir grūtāk. Tradicionāli, nē. 683 00:57:27,380 --> 00:57:34,720 2 dimensiju masīvs ir tikai 1-dimensiju masīvs ar kādu ērtu sintaksi 684 00:57:34,720 --> 00:57:54,110 jo, kad es saku int x [3] [3], tas ir tiešām tikai 1 masīvs ar 9 vērtībām. 685 00:57:55,500 --> 00:58:03,000 Un tad, kad es indekss, kompilators zina, ko es domāju. 686 00:58:03,000 --> 00:58:13,090 Ja es saku x [1] [2], tas zina, ka es gribu iet uz otrās rindas, tāpēc tas būs izlaist pirmo 3, 687 00:58:13,090 --> 00:58:17,460 un tad tas grib otro lieta, ka, lai tas notiek, lai iegūtu šo vienu. 688 00:58:17,460 --> 00:58:20,480 Bet tas joprojām ir tikai viena dimensiju masīvs. 689 00:58:20,480 --> 00:58:23,660 Un tāpēc, ja es gribēju, lai piešķirtu rādītāju uz šo masīvs, 690 00:58:23,660 --> 00:58:29,770 Es teiktu int * p = x; 691 00:58:29,770 --> 00:58:33,220 X veids ir vienkārši - 692 00:58:33,220 --> 00:58:38,280 Tas ir aptuvens sakot veida X, jo tas ir tikai simbols un tas nav faktiskā mainīgs, 693 00:58:38,280 --> 00:58:40,140 bet tas ir tikai int *. 694 00:58:40,140 --> 00:58:44,840 x ir tikai rādītājs uz sākuma šo. >> [Students] Labi. 695 00:58:44,840 --> 00:58:52,560 Un tāpēc es nevarēs piekļūt [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Es domāju, ka ir īpaša sintakse pasludināšanai par rādītāju, 697 00:58:58,370 --> 00:59:12,480 kaut smieklīgi kā int (* p [-. kaut pilnīgi smieklīgi es pat nezinu. 698 00:59:12,480 --> 00:59:17,090 Bet ir, lai deklarētu norādes, piemēram, ar iekavām un lietām sintakse. 699 00:59:17,090 --> 00:59:22,960 To var pat ļauj jums darīt. 700 00:59:22,960 --> 00:59:26,640 Es varētu atskatīties kaut kas varētu man pateikt patiesību. 701 00:59:26,640 --> 00:59:34,160 Es meklēt to vēlāk, ja ir stacionārajiem sintakse. Bet jūs nekad redzēt. 702 00:59:34,160 --> 00:59:39,670 Un pat sintakse ir tik arhaiska, ka, ja jūs to izmantot, cilvēki tiks neizprotamu. 703 00:59:39,670 --> 00:59:43,540 Daudzdimensiju masīvi ir diezgan reti, jo tas ir. 704 00:59:43,540 --> 00:59:44,630 Jūs diezgan daudz - 705 00:59:44,630 --> 00:59:48,490 Nu, ja jūs darāt matrix lietas tas nav būs reti, 706 00:59:48,490 --> 00:59:56,730 bet C jūs reti būs izmantojot daudzdimensiju masīvus. 707 00:59:57,630 --> 01:00:00,470 Yeah. >> [Students] Pieņemsim, ka jums ir patiešām ilgi masīvs. 708 01:00:00,470 --> 01:00:03,900 >> Tātad virtuālo atmiņu tas varētu būt viss pēc kārtas, 709 01:00:03,900 --> 01:00:05,640 tāpat elementiem blakus viens otram, 710 01:00:05,640 --> 01:00:08,770 bet fiziskā atmiņa, tas būtu iespējams, ka tiks sadalīt? >> Jā. 711 01:00:08,770 --> 01:00:16,860 Kā virtuālā atmiņas darbus tā ir tikai atdalās - 712 01:00:19,220 --> 01:00:24,860 To piešķiršanu vienība ir lapas, kas mēdz būt 4 kilobaiti, 713 01:00:24,860 --> 01:00:29,680 un tad, kad process saka, hey, es vēlos izmantot šo atmiņu, 714 01:00:29,680 --> 01:00:35,970 operētājsistēma gatavojas atvēlēt to 4 kilobaitus, ka maz bloka atmiņu. 715 01:00:35,970 --> 01:00:39,100 Pat ja jūs tikai izmantot vienu nedaudz baitu visā blokā atmiņu, 716 01:00:39,100 --> 01:00:42,850 operētājsistēma ir gatavojas sniegt tai pilnu 4 kilobaitus. 717 01:00:42,850 --> 01:00:49,410 Tātad, ko tas nozīmē, es varētu būt - teiksim tā ir mana kaudze. 718 01:00:49,410 --> 01:00:53,180 Šo kaudze varētu atdalīt. Mana kaudze varētu būt megabaitu un megabaiti. 719 01:00:53,180 --> 01:00:55,020 Mana kaudze varētu būt milzīgs. 720 01:00:55,020 --> 01:01:00,220 Bet kaudze pati ir sadalīt atsevišķās lapās, 721 01:01:00,220 --> 01:01:09,010 kas, ja mēs skatāmies uz vairāk nekā šeit, teiksim tā ir mūsu atmiņa, 722 01:01:09,010 --> 01:01:16,600 ja man ir 2 gigabaiti RAM, tas ir faktiskā adrese 0 piemēram 0. baits no mana RAM, 723 01:01:16,600 --> 01:01:22,210 un tas ir 2 gigabaiti visu ceļu uz leju šeit. 724 01:01:22,210 --> 01:01:27,230 Tātad šī lapa var atbilst šā bloka nekā šeit. 725 01:01:27,230 --> 01:01:29,400 Šī lapa varētu atbilst šā bloka nekā šeit. 726 01:01:29,400 --> 01:01:31,560 Tas varētu atbilst šo vienu pār šeit. 727 01:01:31,560 --> 01:01:35,540 Tāpēc operētājsistēma ir brīvi piešķirt fiziskās atmiņas 728 01:01:35,540 --> 01:01:39,320 uz jebkuru individuālu lapā patvaļīgi. 729 01:01:39,320 --> 01:01:46,180 Un tas nozīmē, ka, ja šī robeža notiek statņu masīvs, 730 01:01:46,180 --> 01:01:50,070 masīvs notiek atstāt šo un pa labi no šā rīkojuma lapā, 731 01:01:50,070 --> 01:01:54,460 tad masīvs būs sadalīt fiziskās atmiņas. 732 01:01:54,460 --> 01:01:59,280 Un tad, kad jūs atmest programmu, kad process beidzas, 733 01:01:59,280 --> 01:02:05,690 šie samērošanai saņemt izdzēsta, un tad tas ir brīvi izmantot šos maz blokiem citām lietām. 734 01:02:14,730 --> 01:02:17,410 Vēl jautājumi? 735 01:02:17,410 --> 01:02:19,960 [Students] rādītājs aritmētika. >> Ak jā. 736 01:02:19,960 --> 01:02:28,410 Stīgas bija vieglāk, bet meklē kaut ko līdzīgu Ints, 737 01:02:28,410 --> 01:02:35,000 Tātad atpakaļ pie int x [4]; 738 01:02:35,000 --> 01:02:41,810 Vai tas ir masīvs vai tas rādītājs, lai malloced masīvs 4 integers, 739 01:02:41,810 --> 01:02:47,060 tas būs jāārstē tāpat. 740 01:02:50,590 --> 01:02:53,340 [Students] Tātad bloki ir par kaudzes? 741 01:03:01,400 --> 01:03:05,270 [Bowden] Masīvi ir nevis uz kaudzes. >> [Students] Ak. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] Šis masīvs veida mēdz būt uz skursteņa 743 01:03:08,320 --> 01:03:12,220 ja vien jūs deklarēta to - ignorējot pasaules mainīgie. Neizmantojiet pasaules mainīgie. 744 01:03:12,220 --> 01:03:16,280 Iekšpusē funkciju es saku int x [4]; 745 01:03:16,280 --> 01:03:22,520 Tas notiek, lai izveidotu 4 veselo bloku uz skursteņa šim masīvs. 746 01:03:22,520 --> 01:03:26,960 Bet tas malloc (4 * sizeof (int)); gatavojas doties uz kaudzes. 747 01:03:26,960 --> 01:03:31,870 Bet pēc šī brīža es varu izmantot X un P diezgan daudz to pašu veidos, 748 01:03:31,870 --> 01:03:36,140 izņemot izņēmumus es teicu par varat pārdalīt p. 749 01:03:36,140 --> 01:03:40,960 Tehniski to izmēri ir nedaudz atšķirīgi, taču tas ir pilnīgi nekādas nozīmes. 750 01:03:40,960 --> 01:03:43,310 Tu nekad faktiski izmantot to izmērus. 751 01:03:48,020 --> 01:03:56,810 P Es varētu teikt lpp [3] = 2; vai x [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Jūs varat izmantot tos tādos pašos veidos. 753 01:03:59,680 --> 01:04:01,570 Tāpēc rādītājs aritmētika tagad - Jā. 754 01:04:01,570 --> 01:04:07,390 [Students] Vai jums nav jādara p * Ja jums ir iekavās? 755 01:04:07,390 --> 01:04:11,720 Iekavas ir netiešs dereference. >> Labi. 756 01:04:11,720 --> 01:04:20,200 Patiesībā, arī to, ko tu saki, ar var saņemt daudzdimensiju masīvus 757 01:04:20,200 --> 01:05:02,650 ar norādes, ko jūs varat darīt, ir kaut kas līdzīgs, teiksim, int ** pp = malloc (sizeof (int *) * 5); 758 01:05:02,650 --> 01:05:06,900 Es ņemšu tikai rakstīt to visu pirmās. 759 01:05:37,880 --> 01:05:41,020 Es negribēju, ka viens. 760 01:05:41,020 --> 01:05:42,550 Labi. 761 01:05:42,550 --> 01:05:48,910 Ko es izdarīju šeit ir - Tas būtu pp [i]. 762 01:05:48,910 --> 01:05:53,680 Tātad pp ir rādītājs, lai rādītājs. 763 01:05:53,680 --> 01:06:02,420 Tu esi mallocing procentpunkti norādīt uz masīvu 5 int zvaigznēm. 764 01:06:02,420 --> 01:06:10,950 Tātad atmiņā jums ir uz skursteņa pp 765 01:06:10,950 --> 01:06:20,150 Tas notiek, lai norādītu uz masīvu 5 blokiem, kas visas paši norādes. 766 01:06:20,150 --> 01:06:28,210 Un tad, kad es malloc šeit lejā, es malloc, ka katrs no šiem atsevišķiem norādes 767 01:06:28,210 --> 01:06:32,080 vajadzētu norādīt uz atsevišķu bloka 4 baiti uz kaudzes. 768 01:06:32,080 --> 01:06:35,870 Tātad šis norāda uz 4 baiti. 769 01:06:37,940 --> 01:06:40,660 Un tas viens norāda uz citu 4 baiti. 770 01:06:40,660 --> 01:06:43,200 >> Un visi no tiem norāda uz saviem 4 baiti. 771 01:06:43,200 --> 01:06:49,080 Tas dod man veids, kā to daudzdimensiju lietas. 772 01:06:49,080 --> 01:06:58,030 Es varētu teikt, pp [3] [4], bet tagad tas nav tas pats, kā daudzdimensiju masīvus 773 01:06:58,030 --> 01:07:05,390 jo daudzdimensiju masīvi tas tulkots [3] [4] par vienotu kompensēt uz x masīvs. 774 01:07:05,390 --> 01:07:14,790 Tas dereferences p, piekļūst trešo indeksu, tad dereferences ka 775 01:07:14,790 --> 01:07:20,790 un piekļūšanas - 4 nebūs spēkā - otrais rādītājs. 776 01:07:24,770 --> 01:07:31,430 Tā kā, mums bija int x [3] [4] pirms kā daudzdimensiju masīvu 777 01:07:31,430 --> 01:07:35,740 un kad jūs divreiz kronšteinu tas tiešām tikai viena dereference, 778 01:07:35,740 --> 01:07:40,490 jūs pēc vienotu rādītāju un pēc tam kompensēt, 779 01:07:40,490 --> 01:07:42,850 tas ir patiešām 2D atsauces. 780 01:07:42,850 --> 01:07:45,840 Jūs sekot 2 atsevišķas norādes. 781 01:07:45,840 --> 01:07:50,420 Tāpēc tas arī tehniski ļauj jums ir daudzdimensiju masīvus 782 01:07:50,420 --> 01:07:53,550 kur katrs indivīds masīvs ir dažādi izmēri. 783 01:07:53,550 --> 01:07:58,000 Tāpēc es domāju, robains daudzdimensiju masīvi ir tas, ko tas sauc 784 01:07:58,000 --> 01:08:01,870 jo tiešām pirmā lieta varētu norādīt uz kaut ko, kas ir 10 elementi, 785 01:08:01,870 --> 01:08:05,540 Otrā lieta varētu norādīt uz kaut ko, kas ir 100 elementi. 786 01:08:05,540 --> 01:08:10,790 [Students] Vai ir kāds ierobežojums uz numuru norādes var būt 787 01:08:10,790 --> 01:08:14,290 norādot uz citiem norādes? >> Nr 788 01:08:14,290 --> 01:08:17,010 Jūs varat būt int ***** lpp. 789 01:08:18,050 --> 01:08:23,760 Atpakaļ uz norādīto aritmētisko - >> [students] Ak. >> Jā. 790 01:08:23,760 --> 01:08:35,649 [Students] Ja man ir int *** p un tad es to dereferencing un es saku p * ir vienāds ar šo lielumu, 791 01:08:35,649 --> 01:08:39,560 tas ir tikai gatavojas darīt par 1 līmeni dereferencing? >> Jā. 792 01:08:39,560 --> 01:08:43,340 Tātad, ja es gribu, lai piekļūtu lieta, ka pēdējā rādītājs ir pavērsts - 793 01:08:43,340 --> 01:08:46,210 Tad jūs *** p. >> Labi. 794 01:08:46,210 --> 01:08:54,080 Tātad šis ir p norāda 1 bloku, norāda uz vēl kādu bloku, norāda uz citu bloku. 795 01:08:54,080 --> 01:09:02,010 Tad, ja jūs * p = kaut kas cits, tad jums ir mainīt šo 796 01:09:02,010 --> 01:09:13,640 lai tagad norāda uz citu bloku. >> Labi. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] un, ja šie malloced, tad tu tagad noplūdis atmiņu 798 01:09:17,649 --> 01:09:20,430 Ja vien jums gadās būt dažādas atsauces šiem 799 01:09:20,430 --> 01:09:25,270 jo jūs nevarat saņemt atpakaļ uz tiem tiem, kas jūs vienkārši aizmeta. 800 01:09:25,270 --> 01:09:29,550 Rādītājs aritmētika. 801 01:09:29,550 --> 01:09:36,310 int x [4], ir gatavojas piešķirt masīva 4 integers 802 01:09:36,310 --> 01:09:40,670 kur x gatavojas norādīt uz sākumu masīva. 803 01:09:40,670 --> 01:09:50,420 Tātad, kad es saku kaut ko līdzīgu X [1], es gribu to nozīmē iet uz otro skaitlim masīvā, 804 01:09:50,420 --> 01:09:53,319 kas būtu tas viens. 805 01:09:53,319 --> 01:10:04,190 Bet tiešām, tas ir 4 baiti uz masīva jo šis veselais aizņem 4 baitus. 806 01:10:04,190 --> 01:10:08,470 Tāpēc kompensēt no 1 īsti nozīmē kompensēt no 1 807 01:10:08,470 --> 01:10:12,030 reizes lielāka par neatkarīgi no masīva tips. 808 01:10:12,030 --> 01:10:17,170 Tas ir masīvs integers, tāpēc zina darīt 1 reizi lielumu int kad tā vēlas kompensēt. 809 01:10:17,170 --> 01:10:25,260 Citi sintakse. Atcerieties, ka tas ir līdzvērtīgs * (x + 1); 810 01:10:25,260 --> 01:10:35,250 Kad es saku rādītāju + 1, kas, kas atgriež ir adrese, rādītājs ir uzglabātu 811 01:10:35,250 --> 01:10:40,360 plus 1 reizes lielāka par veidu rādītāja. 812 01:10:40,360 --> 01:10:59,510 Tātad, ja x = ox100, tad x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 Un jūs varat ļaunprātīgi šo un teikt kaut ko līdzīgu char * c = (char *) x; 814 01:11:19,750 --> 01:11:23,050 un tagad c būs pati adrese kā x. 815 01:11:23,050 --> 01:11:26,040 c būs vienāds ar ox100, 816 01:11:26,040 --> 01:11:31,490 bet c + 1 būs vienāds ar ox101 817 01:11:31,490 --> 01:11:38,030 jo rādītājs aritmētika atkarīgs no veida norādei, ka jūs papildinot. 818 01:11:38,030 --> 01:11:45,390 Tātad c + 1, tas izskatās pēc C, tas ir char rādītājs, tāpēc tas notiek, lai pievienotu 1 reizes izmēru char, 819 01:11:45,390 --> 01:11:48,110 kas vienmēr būs 1, lai jūs iegūtu 101, 820 01:11:48,110 --> 01:11:54,890 tā kā, ja man x, kas ir arī vēl 100, x + 1 būs 104. 821 01:11:56,660 --> 01:12:06,340 [Students] Vai jūs izmantot C + +, lai sekmētu savu rādītāju par 1? 822 01:12:06,340 --> 01:12:09,810 Jā, jūs varat. 823 01:12:09,810 --> 01:12:16,180 Jūs nevarat darīt, ka ar X, jo x ir tikai simbols, tā ir nemainīga, jūs nevarat mainīt x. 824 01:12:16,180 --> 01:12:22,610 >> Bet c notiek vienkārši rādītājs, tāpēc C + + ir ļoti lietderīga, un tā pieauguma 1. 825 01:12:22,610 --> 01:12:32,440 Ja c bija tikai int *, tad C + + būtu 104. 826 01:12:32,440 --> 01:12:41,250 + + Nav rādītājs aritmētika tāpat kā c + 1 būtu jādara rādītājs aritmētika. 827 01:12:43,000 --> 01:12:48,870 Tas ir tiešām kā daudzas lietas, piemēram, sapludināšanas veida - 828 01:12:49,670 --> 01:12:55,710 Tā vietā, lai izveidotu kopijas lietas, varat tā vietā iet - 829 01:12:55,710 --> 01:13:02,400 Piemēram, ja es gribēju, lai iziet šo pusi no masīva - pieņemsim izdzēsīs daļu no tā. 830 01:13:04,770 --> 01:13:10,520 Pieņemsim, ka es gribēju iet šaipus masīva uz funkciju. 831 01:13:10,520 --> 01:13:12,700 Ko man iet uz šo funkciju? 832 01:13:12,700 --> 01:13:17,050 Ja es iet x, es esmu iet šo adresi. 833 01:13:17,050 --> 01:13:23,780 Bet es gribu, lai iet šo konkrēto adresi. Tātad, ko man iet? 834 01:13:23,780 --> 01:13:26,590 [Students] Rādītājs + 2? 835 01:13:26,590 --> 01:13:29,350 [Bowden] Tātad x + 2. Jā. 836 01:13:29,350 --> 01:13:31,620 Tas būs šī adrese. 837 01:13:31,620 --> 01:13:42,810 Jūs arī ļoti bieži redzēt to kā x [2], un tad adresi, kas. 838 01:13:42,810 --> 01:13:47,850 Tātad jums ir nepieciešams veikt adresi to, jo grupa ir netiešs dereference. 839 01:13:47,850 --> 01:13:53,250 x [2] attiecas uz vērtību, kas atrodas šajā zonā, un tad jūs vēlaties adresi šajā ailē, 840 01:13:53,250 --> 01:13:56,850 lai jums teikt & X [2]. 841 01:13:56,850 --> 01:14:02,880 Tātad tas, kā kaut kas sapludināšanas veida kur vēlaties iet pusi sarakstu kaut 842 01:14:02,880 --> 01:14:08,790 Jūs tiešām tikai iet & X [2], un tagad cik rekursīvas zvans ir bažas, 843 01:14:08,790 --> 01:14:12,510 mana jaunā masīva sākas tur. 844 01:14:12,510 --> 01:14:15,130 Pēdējā brīža jautājumus. 845 01:14:15,130 --> 01:14:20,050 [Students] Ja mums nav likts aizvieto & zīmes vai - kas tas sauc? >> Kategorijā? 846 01:14:20,050 --> 01:14:23,200 [Students] kategorijā. >> Tehniski, dereference operators, bet - >> [students] Dereference. 847 01:14:23,200 --> 01:14:29,310 >> Ja mums nav izvirzīti zvaigzni vai zīme &, kas notiek, ja es tikai saku y = x un x ir rādītājs? 848 01:14:29,310 --> 01:14:34,620 Kas ir y veidu? >> [Students] Es ņemšu tikai teikt, tas ir rādītājs 2. 849 01:14:34,620 --> 01:14:38,270 Tātad, ja jūs vienkārši pateikt y = x, tagad x un y norāda uz to pašu. >> [Students] punkts uz to pašu. 850 01:14:38,270 --> 01:14:45,180 Un, ja x ir int rādītājs? >> Tas varētu sūdzēties, jo jūs nevarat piešķirt norādes. 851 01:14:45,180 --> 01:14:46,540 [Students] Labi. 852 01:14:46,540 --> 01:14:51,860 Atcerieties, ka norādes, lai gan mēs izdarīt tos kā bultas, 853 01:14:51,860 --> 01:15:02,010 tiešām visi tie veikals - int * x - tiešām viss x ir uzglabāt ir kaut kas līdzīgs ox100, 854 01:15:02,010 --> 01:15:06,490 kas mums gadās pārstāvēt kā norādot uz bloku glabājas pie 100. 855 01:15:06,490 --> 01:15:19,660 Tātad, kad es saku int * y = x, es esmu tikai kopēšanu ox100 uz y, 856 01:15:19,660 --> 01:15:24,630 kas mēs esam tikai gatavojas pārstāvēt kā y, arī norādot uz ox100. 857 01:15:24,630 --> 01:15:39,810 Un ja es saku int i = (int) x, tad es gatavojas glabāt neatkarīgi no ox100 vērtība ir 858 01:15:39,810 --> 01:15:45,100 iekšpusē tā, bet tagad tas būs jāinterpretē kā veselums, nevis rādītājs. 859 01:15:45,100 --> 01:15:49,310 Bet jums ir nepieciešams nodoto vai arī tas būs sūdzēties. 860 01:15:49,310 --> 01:15:53,300 [Students] Tātad jūs domājat nodot - 861 01:15:53,300 --> 01:16:00,290 Vai tas būs liešana int no x vai liešana int y? 862 01:16:00,290 --> 01:16:03,700 [Bowden] Kas? 863 01:16:03,700 --> 01:16:07,690 [Students] Labi. Pēc šiem iekavās ir tur būs x vai ay tur? 864 01:16:07,690 --> 01:16:11,500 >> [Bowden] nu. x un y ir līdzvērtīgi. >> [Students] Labi. 865 01:16:11,500 --> 01:16:14,390 Jo viņi abi norādes. >> Jā. 866 01:16:14,390 --> 01:16:21,050 [Students] Tātad tas varētu glabāt heksadecimālo 100 skaitlim formā? >> [Bowden] Jā. 867 01:16:21,050 --> 01:16:23,620 Bet ne vērtība neatkarīgi no tā norāda uz. 868 01:16:23,620 --> 01:16:29,940 [Bowden] Jā. >> [Students] Tik vienkārši adrese skaitlim formā. Labi. 869 01:16:29,940 --> 01:16:34,720 [Bowden] Ja jūs vēlētos, lai kādu savāda iemesla dēļ, 870 01:16:34,720 --> 01:16:38,900 Jūs varētu tikai galā ar norādes un nekad galā ar veseliem skaitļiem 871 01:16:38,900 --> 01:16:49,240 un vienkārši tāpat int * x = 0. 872 01:16:49,240 --> 01:16:53,000 Tad jūs gatavojas iegūt patiešām sajaukt reizi rādītājs aritmētika sāk notiek. 873 01:16:53,000 --> 01:16:56,570 Tāpēc skaitļi, ka viņi veikalā ir bezjēdzīgas. 874 01:16:56,570 --> 01:16:58,940 Tas ir tikai kā jūs galu galā interpretējot tos. 875 01:16:58,940 --> 01:17:02,920 Tāpēc es esmu brīvi kopēt ox100 no int * uz int, 876 01:17:02,920 --> 01:17:07,790 un es esmu brīva, lai piešķirtu - jūs esat nokļuvis vērsīsies kliedza uz ne liešana - 877 01:17:07,790 --> 01:17:18,160 Es esmu brīva, lai piešķirtu kaut ko līdzīgu (int *) ox1234 stāšanās šajā patvaļīgu int *. 878 01:17:18,160 --> 01:17:25,480 Tik ox123 ir tikpat derīga atmiņas adrese kā & y. 879 01:17:25,480 --> 01:17:32,060 & Y notiek atgriezties kaut kas ir diezgan daudz ox123. 880 01:17:32,060 --> 01:17:35,430 [Students] Tas var būt patiešām foršs veids, kā aiziet no heksadecimālā uz decimālskaitli, 881 01:17:35,430 --> 01:17:39,230 piemēram, ja jums ir rādītāju un jūs nodot to kā int? 882 01:17:39,230 --> 01:17:44,860 [Bowden] Jūs varat patiešām vienkārši izdrukāt, izmantojot, piemēram, printf. 883 01:17:44,860 --> 01:17:50,300 Pieņemsim, ka man ir int y = 100. 884 01:17:50,300 --> 01:18:02,700 Tātad printf (% d \ n - kā jūs jau zināt - drukāt, ka ar veselu,% x. 885 01:18:02,700 --> 01:18:05,190 Mēs vienkārši izdrukāt to kā heksadecimālo. 886 01:18:05,190 --> 01:18:10,760 Tāpēc rādītājs netiek saglabāta kā heksadecimālā, 887 01:18:10,760 --> 01:18:12,960 un skaitlis netiek saglabāta decimālo. 888 01:18:12,960 --> 01:18:14,700 Viss ir saglabāts kā bināro. 889 01:18:14,700 --> 01:18:17,950 Tas ir tikai, ka mums ir tendence, lai parādītu norādes kā heksadecimālā 890 01:18:17,950 --> 01:18:23,260 jo mēs domājam par lietām šajās 4-baitu blokiem, 891 01:18:23,260 --> 01:18:25,390 un atmiņas adreses mēdz būt pazīstami. 892 01:18:25,390 --> 01:18:28,890 Mēs esam līdzīgi, ja tā sākas ar bf, tad tas notiek, ir uz skursteņa. 893 01:18:28,890 --> 01:18:35,560 Tātad tas ir tikai mūsu interpretācija norādes kā heksadecimālo. 894 01:18:35,560 --> 01:18:39,200 Labi. Jebkuras pēdējie jautājumi? 895 01:18:39,200 --> 01:18:41,700 >> Es būšu šeit, lai mazliet pēc tam, ja jums ir kaut kas cits. 896 01:18:41,700 --> 01:18:46,070 Un tas ir beigas, kas. 897 01:18:46,070 --> 01:18:48,360 >> [Studentu] Yay! [Aplausi] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]