1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [Sekcio 4 - Pli Vasta] 2 00:00:02,520 --> 00:00:04,850 [Rob Bowden - Universitato Harvard] 3 00:00:04,850 --> 00:00:07,370 [Jen CS50. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 Ni havas kvizon morgaŭ, en la okazo you guys ne sciis tion. 5 00:00:14,810 --> 00:00:20,970 Estas esence pri ĉio vi povus esti viditaj en klaso aŭ devus esti vidita en klaso. 6 00:00:20,970 --> 00:00:26,360 Kiu inkludas punteros, kvankam ili estas tre freŝaj temo. 7 00:00:26,360 --> 00:00:29,860 Vi devus almenaŭ kompreni la altaj niveloj de ili. 8 00:00:29,860 --> 00:00:34,760 Ion, kio estis for super en klaso vi devus kompreni por la kvizo. 9 00:00:34,760 --> 00:00:37,320 Do se vi havas demandojn pri ili, vi povas peti ilin nun. 10 00:00:37,320 --> 00:00:43,280 Sed ĉi tiu tuj estos tre studento gvidata kunsido kie infanoj demandojn, 11 00:00:43,280 --> 00:00:45,060 tiel espereble homoj havas demandojn. 12 00:00:45,060 --> 00:00:48,020 Ĉu iu havas demandojn? 13 00:00:49,770 --> 00:00:52,090 Jes. >> [Studento] Ĉu vi povas iri super punteros denove? 14 00:00:52,090 --> 00:00:54,350 Mi tuj iros punteros. 15 00:00:54,350 --> 00:00:59,180 Ĉiuj viaj variabloj nepre vivos en memoro, 16 00:00:59,180 --> 00:01:04,450 sed kutime oni ne zorgu pri tio kaj vi simple diru x + 2 kaj y + 3 17 00:01:04,450 --> 00:01:07,080 kaj la tradukilo elŝeligi kie la aĵoj vivas por vi. 18 00:01:07,080 --> 00:01:12,990 Iam vi pritraktas punteros, nun vi eksplicite uzante tiujn memoro adresoj. 19 00:01:12,990 --> 00:01:19,800 Do sola variablo nur iam vivi en unu sola adreso je ĉiu tempo. 20 00:01:19,800 --> 00:01:24,040 Se ni volas deklari pointer, kio estas la tipo iri al aspektas? 21 00:01:24,040 --> 00:01:26,210 >> Mi volas deklari puntero p. Kion faras la tipo aspektas? 22 00:01:26,210 --> 00:01:33,530 [Studento] int * p. >> Jes. Do int * p. 23 00:01:33,530 --> 00:01:38,030 Kaj kiel mi faru ĝin noti al x? >> [Studento] ampersand. 24 00:01:40,540 --> 00:01:45,300 [Bowden] Do signo laŭvorte nomis la adreson de operatoro. 25 00:01:45,300 --> 00:01:50,460 Do kiam mi diras & x Fariĝas la memoro adreso de la variablo x. 26 00:01:50,460 --> 00:01:56,790 Do nun mi havas la puntero p, kaj ie ajn en mia kodo mi povas uzi * p 27 00:01:56,790 --> 00:02:02,960 aŭ mi ne povis uzi x kaj estos la ĝusta sama afero. 28 00:02:02,960 --> 00:02:09,520 (* P). Kio estas ĉi faras? Kion tio stelo signifas? 29 00:02:09,520 --> 00:02:13,120 [Studento] Ĝi signifas valoro je tiu punkto. >> Jes. 30 00:02:13,120 --> 00:02:17,590 Do, se ni rigardas ĝin, ĝi povas esti tre utila al nudigos la diagramojn 31 00:02:17,590 --> 00:02:22,230 kie ĉi tiu estas iom skatolo da memoro por x, kio okazas al havi la valoro 4, 32 00:02:22,230 --> 00:02:25,980 tiam ni havis iom skatolo da memoro por p, 33 00:02:25,980 --> 00:02:31,590 kaj tiel p poentojn al x, do ni desegni sago de p al x. 34 00:02:31,590 --> 00:02:40,270 Do kiam ni diras * p ni dirante iri al la skatolo kiu estas p. 35 00:02:40,270 --> 00:02:46,480 Stelo estas sekvi la sago kaj do kion vi volas kun tiu skatolo dekstre tie. 36 00:02:46,480 --> 00:03:01,090 Do mi povas diri * p = 7, kaj kiu iros al la skatolo kiu estas x kaj ŝanĝo kiu al 7. 37 00:03:01,090 --> 00:03:13,540 Aŭ mi ne povis diri int z = * p * 2; Tio konfuzas ĉar la stelo, stelo. 38 00:03:13,540 --> 00:03:19,230 La stelo estas dereferencing p, la alia stelo estas multiplikante per 2. 39 00:03:19,230 --> 00:03:26,780 Rimarku mi povus havi same bone anstataŭis la * p kun x. 40 00:03:26,780 --> 00:03:29,430 Vi povas uzi ilin en la sama maniero. 41 00:03:29,430 --> 00:03:38,000 Kaj tiam poste mi povas havi p punkto al tute nova afero. 42 00:03:38,000 --> 00:03:42,190 Mi povas nur diri p = &z; 43 00:03:42,190 --> 00:03:44,940 Do nun p ne plu punktoj al x; notas al z. 44 00:03:44,940 --> 00:03:50,510 Kaj iam mi faros * p estas la sama kiel fari z. 45 00:03:50,510 --> 00:03:56,170 Do la utila afero pri ĉi tiu estas iam ni komencu akiri en funkcioj. 46 00:03:56,170 --> 00:03:59,790 >> Estas speco de senutile deklari puntero ke poentojn al io 47 00:03:59,790 --> 00:04:03,140 kaj tiam vi simple dereferencing ĝin 48 00:04:03,140 --> 00:04:06,060 kiam vi povus esti uzita la originala variablo por komenci. 49 00:04:06,060 --> 00:04:18,190 Sed kiam vi enir funkcioj - do ni diras, ke ni havas iun funkcion, int foo, 50 00:04:18,190 --> 00:04:32,810 kiu prenas puntero kaj nur faras * p = 6; 51 00:04:32,810 --> 00:04:39,990 Kiel ni vidis antaŭe kun interŝanĝa, vi ne povas fari efikan interŝanĝo kaj aparta funkcio 52 00:04:39,990 --> 00:04:45,180 por nur pasante entjeroj ĉar ĉiu en C estas ĉiam preteriras valoro. 53 00:04:45,180 --> 00:04:48,360 Eĉ kiam vi pasante punteros vi preterpasanta valoro. 54 00:04:48,360 --> 00:04:51,940 Simple tiel okazas ke tiuj valoroj estas memoro adresoj. 55 00:04:51,940 --> 00:05:00,770 Do kiam mi diras foo (p); Mi pasante la puntero en la funkcio foo 56 00:05:00,770 --> 00:05:03,910 kaj tiam foo faras * p = 6; 57 00:05:03,910 --> 00:05:08,600 Do ene de tiu funkcio, * p estas ankoraŭ ekvivalenta al x, 58 00:05:08,600 --> 00:05:12,720 sed mi ne povas uzi x ene de tiu funkcio, ĉar ĝi ne scoped ene de tiu funkcio. 59 00:05:12,720 --> 00:05:19,510 Do * p = 6 estas la sola maniero mi povas atingi lokan variablon de alia funkcio. 60 00:05:19,510 --> 00:05:23,600 Aŭ, nu, punteros estas la sola maniero mi povas atingi lokan variablon de alia funkcio. 61 00:05:23,600 --> 00:05:31,600 [Studento] Imagu ke vi volis reveni puntero. Kiel ekzakte vi faras tion? 62 00:05:31,600 --> 00:05:44,270 [Bowden] Reveno puntero kiel en iu kiel int y = 3; reveno & y? >> [Studento] Yeah. 63 00:05:44,270 --> 00:05:48,480 [Bowden] Okay. Vi devus neniam faros. Ĉi tiu estas malbona. 64 00:05:48,480 --> 00:05:59,480 Mi kredas ke mi vidis en tiuj prelego diapozitivoj vi komencis vidi tiun tutan diagramon de memoro 65 00:05:59,480 --> 00:06:02,880 kie ĝis tie vi havas memoron adreso 0 66 00:06:02,880 --> 00:06:09,550 kaj cxi tie vi havas memoron adreso 4 koncertoj aŭ 2 al la 32. 67 00:06:09,550 --> 00:06:15,120 Tial vi havas iujn aferojn kaj iuj aĵoj kaj tiam vi havos vian stako 68 00:06:15,120 --> 00:06:21,780 kaj kiam vi mem havigis vian monteton, kiun vi ĵus eklernis pri, kreskis. 69 00:06:21,780 --> 00:06:24,390 [Studento] Ĉu ne la havaĵo super la pilo? 70 00:06:24,390 --> 00:06:27,760 >> Yeah. La amaso estas sur supro, ĉu ne? >> [Studento] Nu, li metis 0 sur. 71 00:06:27,760 --> 00:06:30,320 [Studento] Nu, li metis 0 sur. >> [Studento] Ho, bone. 72 00:06:30,320 --> 00:06:36,060 Disclaimer: Ie kun CS50 vi tuj vidos ĝin tiel. >> [Studento] Okay. 73 00:06:36,060 --> 00:06:40,290 Estas nur ke kiam vi unue vidante piloj, 74 00:06:40,290 --> 00:06:45,000 kiel kiam vi pensas pri pilo vi pensas pri staka vido aĵoj sur supro de unu alia. 75 00:06:45,000 --> 00:06:50,810 Do ni emas klaki ĉi ĉirkaŭe tiel la pilo kreskas supren kiel stako kutime would 76 00:06:50,810 --> 00:06:55,940 anstataŭ la pilo pendis malsupren. >> [Studento] Ne amasoj teknike kreski ankaŭ, kvankam? 77 00:06:55,940 --> 00:07:01,100 Ĝi dependas de kion vi volas diri per kreski. 78 00:07:01,100 --> 00:07:04,010 La pilo kaj amaso ĉiam kreski en kontraŭaj direktoj. 79 00:07:04,010 --> 00:07:09,420 Al pilo ĉiam kreski en la senco ke ĝi estas kreski 80 00:07:09,420 --> 00:07:12,940 al pli alta memoro adresoj, kaj la amaso kreskas malsupren 81 00:07:12,940 --> 00:07:17,260 en tiu ĝi estas kreskanta al suba memoro adresoj. 82 00:07:17,260 --> 00:07:20,250 Do la supro estas 0 kaj la fundo estas alta memoro adresoj. 83 00:07:20,250 --> 00:07:26,390 Ili ambaŭ kreski, ĝuste kontraŭaj direktoj. 84 00:07:26,390 --> 00:07:29,230 [Studento] Mi nur signifis ke ĉar vi diris ke vi metis stako sur la fundo 85 00:07:29,230 --> 00:07:33,640 ĉar ĝi similas pli intuicia ĉar por la pilo komenci ĉe la supro de monteto, 86 00:07:33,640 --> 00:07:37,520 amaso estas sur la supro de sin tro, do that's - >> Jes. 87 00:07:37,520 --> 00:07:44,960 Vi ankaŭ pensi pri la havaĵo kiel kreskis kaj pli grandaj, sed la pilo pli. 88 00:07:44,960 --> 00:07:50,280 Do la pilo estas kiu ni ia volas montri kreskis. 89 00:07:50,280 --> 00:07:55,390 Sed ĉie vi rigardas alie tuj montri adreso 0 je la supro 90 00:07:55,390 --> 00:07:59,590 kaj la plej alta memoro adreso malsupre, do ĉi tiu estas via kutima vidpunkto de memoro. 91 00:07:59,590 --> 00:08:02,100 >> Ĉu vi havas demandon? 92 00:08:02,100 --> 00:08:04,270 [Studento] Ĉu vi povas diri al ni pli pri la amaso? 93 00:08:04,270 --> 00:08:06,180 Yeah. Mi ricevos ke en sekundo. 94 00:08:06,180 --> 00:08:12,220 Unue, superante kial reveni & y estas malbona afero, 95 00:08:12,220 --> 00:08:18,470 sur la stako vi havas faskon da pilo kadroj kiuj reprezentas ĉiujn funkciojn 96 00:08:18,470 --> 00:08:20,460 kiuj estis nomata. 97 00:08:20,460 --> 00:08:27,990 Do ignorante antaŭa aĵoj, la supro de via pilo ĉiam tuj estos la ĉefa funkcio 98 00:08:27,990 --> 00:08:33,090 ĉar tio estas la unua funkcio ke tio esti nomita. 99 00:08:33,090 --> 00:08:37,130 Kaj kiam vi nomas alian funkcion, la stako tuj kreski malsupren. 100 00:08:37,130 --> 00:08:41,640 Do, se mi vokas iu funkcio, foo, kaj ricevas sian propran pilo kadro, 101 00:08:41,640 --> 00:08:47,280 ĝi povas nomi iujn funkcion, trinkejo; alvenas sian propran pilo kadro. 102 00:08:47,280 --> 00:08:49,840 Kaj trinkejo eblis rekursie kaj povus nomi sin, 103 00:08:49,840 --> 00:08:54,150 kaj por ke dua alvoko al trinkejo tuj akiri propran pilo kadro. 104 00:08:54,150 --> 00:08:58,880 Kaj tiel kion iras en tiuj pilo kadroj estas ĉiuj de la lokaj variabloj 105 00:08:58,880 --> 00:09:03,450 kaj ĉiuj de la funkcio argumentojn ke - 106 00:09:03,450 --> 00:09:08,730 Neniu tion, kio estas loke scoped al ĉi tiu funkcio iri en tiuj pilo kadroj. 107 00:09:08,730 --> 00:09:21,520 Do tio signifas, kiam mi diris ion kiel stango estas funkcio, 108 00:09:21,520 --> 00:09:29,270 Mi simple intencas deklari entjero kaj tiam revenu puntero al tiu entjero. 109 00:09:29,270 --> 00:09:33,790 Do kie ne y vivas? 110 00:09:33,790 --> 00:09:36,900 [Studento] y vivas en trinkejo. >> [Bowden] Yeah. 111 00:09:36,900 --> 00:09:45,010 Ie en tiu malgranda kvadrato de memoro estas malabunda kvadrata kiu havas y en ĝi. 112 00:09:45,010 --> 00:09:53,370 Kiam mi revenos & y, Mi revenis puntero al tiu malgranda bloko de memoro. 113 00:09:53,370 --> 00:09:58,400 Sed tiam kiam funkcio revenas, lia pilo kadro gets pusxis for la stako. 114 00:10:01,050 --> 00:10:03,530 Kaj tio estas kial ĝi estas nomata pilo. 115 00:10:03,530 --> 00:10:06,570 Estas kiel la pilo datumstrukturo, se vi scias, kio tio estas. 116 00:10:06,570 --> 00:10:11,580 Aŭ eĉ kiel stako de pletoj estas ĉiam la ekzemplo, 117 00:10:11,580 --> 00:10:16,060 ĉefa tuj iros sur la fundo, tiam la unua funkcio vi nomas tuj iros sur supro de tiu, 118 00:10:16,060 --> 00:10:20,400 kaj vi ne povas reiri al la ĉefa ĝis vi revenos el ĉiuj funkcioj, kiujn oni nomas 119 00:10:20,400 --> 00:10:22,340 kiuj estis metitaj sur supron. 120 00:10:22,340 --> 00:10:28,650 >> [Studento] Do se vi faris do redonas la & y, tiu valoro estas subjekto ŝanĝi sen averto. 121 00:10:28,650 --> 00:10:31,290 Jes, it's - >> [studento] Ĝi eblus anstataŭigi. >> Jes. 122 00:10:31,290 --> 00:10:34,660 Estas tute - Se vi provos kaj - 123 00:10:34,660 --> 00:10:38,040 Ĉi tio ankaŭ esti int * trinkejo ĉar ĝi estas reveni puntero, 124 00:10:38,040 --> 00:10:41,310 tial lia reveno tipo estas int *. 125 00:10:41,310 --> 00:10:46,500 Se vi provas uzi la reveno valoro de tiu funkcio, ĝi estas nedifinita konduto 126 00:10:46,500 --> 00:10:51,770 ĉar tio puntero notas al malbona memoro. >> [Studento] Okay. 127 00:10:51,770 --> 00:11:01,250 Do kio se, ekzemple, vi deklaris int * y = malloc (sizeof (int))? 128 00:11:01,250 --> 00:11:03,740 Tio estas bona. Jes. 129 00:11:03,740 --> 00:11:07,730 [Studento] Ni parolis pri kiel kiam ni treni aferojn al nia recicla bin 130 00:11:07,730 --> 00:11:11,750 ili ne efektive viŝita, ni nur perdos siajn punteros. 131 00:11:11,750 --> 00:11:15,550 Do en ĉi tiu kazo ni vere viŝi la valoro aŭ ĉu ankoraŭ en memoro? 132 00:11:15,550 --> 00:11:19,130 Plejparte, ĝi tuj ankoraŭ tie. 133 00:11:19,130 --> 00:11:24,220 Sed diru ni okazi nomi iu alia funkcio, baz. 134 00:11:24,220 --> 00:11:28,990 Baz tuj akiri propran pilo kadro ĉi tie. 135 00:11:28,990 --> 00:11:31,470 Oni tuj estos overwriting ĉio ĉi stuff, 136 00:11:31,470 --> 00:11:34,180 kaj poste, se vi poste provi kaj uzi la puntero ke vi havas antaŭe, 137 00:11:34,180 --> 00:11:35,570 ĝi ne tuj estos la sama valoro. 138 00:11:35,570 --> 00:11:38,150 Ĝi tuj ŝanĝiĝis nur ĉar vi nomas la funkcion baz. 139 00:11:38,150 --> 00:11:43,080 [Studento] Sed se ni ne, estus ankoraŭ get 3? 140 00:11:43,080 --> 00:11:44,990 [Bowden] Tre verŝajne vi volos. 141 00:11:44,990 --> 00:11:49,670 Sed vi ne povas fidi tion. C nur diras nedefinita konduto. 142 00:11:49,670 --> 00:11:51,920 >> [Studento] Ho, jes. Okay. 143 00:11:51,920 --> 00:11:58,190 Do, kiam vi volas reveni al puntero, ĉi tiu estas kie malloc venas en uzo. 144 00:12:00,930 --> 00:12:15,960 Mi skribas fakte ĝuste reveni malloc (3 * sizeof (int)). 145 00:12:17,360 --> 00:12:24,050 Ni transiru malloc pli en dua, sed la ideo de malloc estas ĉiuj viaj lokaj variabloj 146 00:12:24,050 --> 00:12:26,760 ĉiam iras sur la stako. 147 00:12:26,760 --> 00:12:31,570 Io ke tio malloced iras sur la havaĵon, kaj estos ĉiam kaj ĉiam esti sur la havaĵon 148 00:12:31,570 --> 00:12:34,490 ĝis vi eksplicite liberigi ĝin. 149 00:12:34,490 --> 00:12:42,130 Do tio signifas ke kiam vi malloc ion, tio okazas por postvivi post la funkcio redonas. 150 00:12:42,130 --> 00:12:46,800 [Studento] Ĉu ĝi postvivos post la programo haltas kurante? >> No 151 00:12:46,800 --> 00:12:53,180 Okay, do tuj estos tie ĝis la programo estas la tuta vojo farita kuri. >> Jes. 152 00:12:53,180 --> 00:12:57,510 Ni povas iri sur detalojn de kio okazas kiam la programo haltas kurante. 153 00:12:57,510 --> 00:13:02,150 Vi eble bezonas memorigi min, sed tio estas aparta afero tute. 154 00:13:02,150 --> 00:13:04,190 [Studento] Do malloc kreas puntero? >> Jes. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [studento] I think malloc designa blokon de memoro, ke puntero povas uzi. 156 00:13:15,400 --> 00:13:19,610 [Bowden] Mi volas, ke diagramon denove. >> [Studento] Do tiu funkcio laboras, kvankam? 157 00:13:19,610 --> 00:13:26,430 [Studento] Yeah, malloc designa blokon de memoro, ke vi povas uzi, 158 00:13:26,430 --> 00:13:30,470 kaj tiam redonas la adreson de la unua bloko de tiu memoro. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] Yeah. Do kiam vi malloc, vi kaptante iujn bloko de memoro 160 00:13:36,750 --> 00:13:38,260 jen nun en la havaĵo. 161 00:13:38,260 --> 00:13:43,040 Se la havaĵo estas tro malgranda, tiam la havaĵo estas ĝuste tuj kreski, kaj ĝi kreskas en tiu direkto. 162 00:13:43,040 --> 00:13:44,650 Do diru la havaĵo estas tro malgranda. 163 00:13:44,650 --> 00:13:49,960 Tiam temas pri kreski iom kaj resendas puntero al ĉi tiu bloko kiu ĝuste kreskis. 164 00:13:49,960 --> 00:13:55,130 Kiam vi liberan stuff, vi faris pli ĉambron en la havaĵo, 165 00:13:55,130 --> 00:14:00,030 do tiam poste nomi al malloc povas reuzi ke memoro kiun vi antaŭe estis liberigita. 166 00:14:00,030 --> 00:14:09,950 La grava afero pri malloc kaj libera estas kiu donas al vi kompletan kontrolon 167 00:14:09,950 --> 00:14:12,700 super la tuta vivo de tiuj memoro blokoj. 168 00:14:12,700 --> 00:14:15,420 Suma variabloj estas ĉiam vivas. 169 00:14:15,420 --> 00:14:18,500 Loka variabloj estas viva en sia amplekso. 170 00:14:18,500 --> 00:14:22,140 Tuj kiam vi iras preter unu frizita streĉa, la loka variabloj estas morta. 171 00:14:22,140 --> 00:14:28,890 Malloced memoro vivas kiam vi volas, ke li vivas 172 00:14:28,890 --> 00:14:33,480 kaj tiam estas liberigita kiam vi diras al tio kiel eldonita. 173 00:14:33,480 --> 00:14:38,420 Tiuj estas fakte la nur 3 tipojn de memoro, vere. 174 00:14:38,420 --> 00:14:41,840 Estas aŭtomata memoro demarŝon, kiu estas la pilo. 175 00:14:41,840 --> 00:14:43,840 Aĵoj okazas al vi aŭtomate. 176 00:14:43,840 --> 00:14:46,910 Kiam vi diras int x, memoro estas asignitaj por int x. 177 00:14:46,910 --> 00:14:51,630 Kiam x eliras de medio, memoro estas rekuperita por x. 178 00:14:51,630 --> 00:14:54,790 Tiam ekzistas dinamika memoro demarŝon, kiu estas kiu malloc estas, 179 00:14:54,790 --> 00:14:56,740 kio estas kiam vi havas kontrolon. 180 00:14:56,740 --> 00:15:01,290 Vi dinamike decidi kiam memoro devus kaj ne devas esti atribuitaj. 181 00:15:01,290 --> 00:15:05,050 Kaj tiam tie estas statika, kiu ĵus signifas ke ĝi vivas eterne, 182 00:15:05,050 --> 00:15:06,610 kiu estas kiu tutmonda variabloj estas. 183 00:15:06,610 --> 00:15:10,240 Ili estas nur ĉiam en la memoro. 184 00:15:10,960 --> 00:15:12,760 >> Demandoj? 185 00:15:14,490 --> 00:15:17,230 [Studento] Ĉu vi povas difini bloko nur uzante frizita krampoj 186 00:15:17,230 --> 00:15:21,220 sed ne devi havi se aserto aŭ dum deklaro aŭ io simila? 187 00:15:21,220 --> 00:15:29,130 Vi povas difini bloko kiel en funkcio, sed kiu havas frizita krampoj tro. 188 00:15:29,130 --> 00:15:32,100 [Studento] Do vi ne povas nur devas kiel hazarda paro de frizita krampoj en via kodo 189 00:15:32,100 --> 00:15:35,680 kiuj havas lokajn variablojn? >> Jes, vi povas. 190 00:15:35,680 --> 00:15:45,900 Ene de int trinkejo ni povus havi {int y = 3;}. 191 00:15:45,900 --> 00:15:48,440 Tio devus esti ĉi tie. 192 00:15:48,440 --> 00:15:52,450 Sed tio tute difinas la medio de int y. 193 00:15:52,450 --> 00:15:57,320 Post tiu dua frizita streĉa, y ne povas esti uzata plu. 194 00:15:57,910 --> 00:16:00,630 Vi preskaŭ neniam faras tion, though. 195 00:16:02,940 --> 00:16:07,370 Getting reen al kio okazas kiam programo finiĝas, 196 00:16:07,370 --> 00:16:18,760 ekzistas speco de miskompreno / duono mensogo, ke ni donu la celo nur fari aĵojn pli facila. 197 00:16:18,760 --> 00:16:24,410 Ni diras al vi ke kiam vi rezervi memoron 198 00:16:24,410 --> 00:16:29,860 vi atribuante iun eron de RAM por tiu variablo. 199 00:16:29,860 --> 00:16:34,190 Sed vi ne vere rekte tuŝi RAM eterna en viaj programoj. 200 00:16:34,190 --> 00:16:37,490 Se vi pensas pri tio, kiom mi tiris - 201 00:16:37,490 --> 00:16:44,330 Kaj efektive, se vi iras tra en GDB vi vidos la saman aferon. 202 00:16:51,120 --> 00:16:57,590 Sendepende de kiom fojoj vi kuras via programo aŭ kio programo ke vi uzas, 203 00:16:57,590 --> 00:16:59,950 la pilo estas ĉiam tuj komenci - 204 00:16:59,950 --> 00:17:06,510 vi ĉiam tuj vidos variabloj ĉirkaŭ adreso oxbffff ion. 205 00:17:06,510 --> 00:17:09,470 Estas kutime ie en tiu regiono. 206 00:17:09,470 --> 00:17:18,760 Sed kiel 2 programoj eble havas punteros al la sama memoro? 207 00:17:20,640 --> 00:17:27,650 [Studento] Jen iuj arbitraj indika kie oxbfff supozas esti sur la RAM 208 00:17:27,650 --> 00:17:31,320 kiu povas reale esti en malsamaj lokoj depende kiam la funkcio vokita. 209 00:17:31,320 --> 00:17:35,920 Yeah. La termino estas virtuala memoro. 210 00:17:35,920 --> 00:17:42,250 La ideo estas ke ĉiu unuopa procezo, ĉiu unuopa programo kiu ruliĝas sur via komputilo 211 00:17:42,250 --> 00:17:49,450 havas sian propran - ni supozu 32 bitoj - tute sendependa adreso spaco. 212 00:17:49,450 --> 00:17:51,590 Tio estas la adreso spaco. 213 00:17:51,590 --> 00:17:56,220 Ĝi havas sian propran tute sendependa 4 gigabajtoj uzi. 214 00:17:56,220 --> 00:18:02,220 >> Do se vi kuros 2 programoj samtempe, tiu programo vidas 4 gigabajtoj al sin, 215 00:18:02,220 --> 00:18:04,870 tiu programo vidas 4 gigabajtoj al sin, 216 00:18:04,870 --> 00:18:07,720 kaj estas neebla por tiu programo por dereference puntero 217 00:18:07,720 --> 00:18:10,920 kaj fini kun memoro de tiu programo. 218 00:18:10,920 --> 00:18:18,200 Kaj kion virtuala memoro estas estas surĵeto de procezoj adreso spaco 219 00:18:18,200 --> 00:18:20,470 al realaj aĵoj en RAM. 220 00:18:20,470 --> 00:18:22,940 Do ĝi estas ĝis via mastruma sistemo por scii ke, 221 00:18:22,940 --> 00:18:28,080 hey, kiam ĉi ulo dereferences puntero oxbfff, kiu vere signifas 222 00:18:28,080 --> 00:18:31,040 ke li volas RAM bajto 1000, 223 00:18:31,040 --> 00:18:38,150 dum se tiu programo dereferences oxbfff, li vere volas RAM bajto 10000. 224 00:18:38,150 --> 00:18:41,590 Ili povas esti arbitre malproksime aparte. 225 00:18:41,590 --> 00:18:48,730 Tio estas eĉ vera de aĵoj en sola procezoj adreso spaco. 226 00:18:48,730 --> 00:18:54,770 Do kiel li vidas ĉiujn 4 gigabajtoj al sin, sed diru - 227 00:18:54,770 --> 00:18:57,290 [Studento] Ĉu ĉiu unuopa procezo - 228 00:18:57,290 --> 00:19:01,350 Imagu ke vi havas komputilon kun nur 4 gigabajtoj de RAM. 229 00:19:01,350 --> 00:19:06,430 Ĉu ĉiu unuopa procezo vidi la tutan 4 gigabajtoj? >> Jes. 230 00:19:06,430 --> 00:19:13,060 Sed la 4 gigabajtoj vidas estas mensogo. 231 00:19:13,060 --> 00:19:20,460 Ĝi simple pensas ĝi havas ĉiujn ĉi memoro ĉar ĝi ne scias neniu alia procezo ekzistas. 232 00:19:20,460 --> 00:19:28,140 Ĝi estos nur uzi tiel memoro kiel ĝi vere bezonas. 233 00:19:28,140 --> 00:19:32,340 La mastruma sistemo ne tuj donu RAM al tiu procezo 234 00:19:32,340 --> 00:19:35,750 se ĝi ne uzas ajnan memoro en ĉi tiu tuta regiono. 235 00:19:35,750 --> 00:19:39,300 Oni ne tuj donos ĝin memoro por tiu regiono. 236 00:19:39,300 --> 00:19:54,780 Sed la ideo estas ke - mi provas pensi pri - mi ne povas pensi pri analogio. 237 00:19:54,780 --> 00:19:56,780 Analogioj estas malmola. 238 00:19:57,740 --> 00:20:02,700 Unu el la temoj de virtuala memoro aŭ unu el la aferoj ĝi estas solvanta 239 00:20:02,700 --> 00:20:06,810 estas ke procezoj devus esti tute ignoris unu la alian. 240 00:20:06,810 --> 00:20:12,140 Kaj tiel vi povas skribi ajnan programon kiu ĵus dereferences ajna pointer, 241 00:20:12,140 --> 00:20:19,340 kiel simple skribi programon kiu diras * (ox1234), 242 00:20:19,340 --> 00:20:22,890 kaj tiu estas dereferencing memoro adreso 1234. 243 00:20:22,890 --> 00:20:28,870 >> Sed estas ĝis la mastruma sistemo por poste traduki kion 1234 rimedoj. 244 00:20:28,870 --> 00:20:33,960 Do se 1234 okazas esti valida memoro adreso por ĉi procezo, 245 00:20:33,960 --> 00:20:38,800 kiel ĝi estas en la pilo aŭ io, tiam ĉi tiu redonos la valoron de tiu memoro adreso 246 00:20:38,800 --> 00:20:41,960 gxis la procezo scias. 247 00:20:41,960 --> 00:20:47,520 Sed se 1234 ne estas valida adreso, kiel okazas al la tero 248 00:20:47,520 --> 00:20:52,910 en iu malgranda peco de memoro tie estas preter la pilo kaj preter la amaso 249 00:20:52,910 --> 00:20:57,200 kaj vi ne vere uzis tiun, tiam tio estas kiam vi ricevas aĵojn kiel segfaults 250 00:20:57,200 --> 00:21:00,260 ĉar vi tuŝas memoro kiun vi ne devas esti tuŝi. 251 00:21:07,180 --> 00:21:09,340 Tio estas ankaŭ vera - 252 00:21:09,340 --> 00:21:15,440 Al 32-bita sistemo, 32 bitoj signifas ke vi havas 32 bitojn por difini memoro adreso. 253 00:21:15,440 --> 00:21:22,970 Estas kial punteros estas 8 bajtoj ĉar 32 bitoj estas 8 bajtoj - aŭ 4 bitokoj. 254 00:21:22,970 --> 00:21:25,250 Punteros estas 4 bitokoj. 255 00:21:25,250 --> 00:21:33,680 Do kiam vi vidas puntero kiel oxbfffff, tio estas - 256 00:21:33,680 --> 00:21:40,080 Ene ajna programo vi povas simple konstrui ajnan arbitran pointer, 257 00:21:40,080 --> 00:21:46,330 ie ajn el ox0 al bovo 8 f's - ffffffff. 258 00:21:46,330 --> 00:21:49,180 [Studento] Ĉu vi ne diras ili estas 4 bajtoj? >> Jes. 259 00:21:49,180 --> 00:21:52,730 [Studento] Tiam ĉiu bajto havos - >> [Bowden] Deksesuma. 260 00:21:52,730 --> 00:21:59,360 Deksesuma - 5, 6, 7, 8. Do punteros vi tuj ĉiam vidas en deksesuma. 261 00:21:59,360 --> 00:22:01,710 Estas nur ke ni klasifikas punteros. 262 00:22:01,710 --> 00:22:05,240 Ĉiu 2 ciferoj de deksesuma estas 1 bajtoj. 263 00:22:05,240 --> 00:22:09,600 Do tuj estos 8 deksesumaj ciferoj por 4 bitokoj. 264 00:22:09,600 --> 00:22:14,190 Do ĉiu unuopa puntero sur 32-bita sistemo tuj estos 4 bajtoj, 265 00:22:14,190 --> 00:22:18,550 kio signifas, ke en via procezo povas konstrui ajnan arbitran 4 bitokoj 266 00:22:18,550 --> 00:22:20,550 kaj fari puntero el ĝi, 267 00:22:20,550 --> 00:22:32,730 kio signifas, ke gxis estas konscia, ĝi povas trakti tutan 2 al la 32 bajtoj de memoro. 268 00:22:32,730 --> 00:22:34,760 Kvankam ĝi ne vere havas aliron al tiu, 269 00:22:34,760 --> 00:22:40,190 eĉ se via komputilo nur havas 512 megabajtojn, ĝi pensas ke ĝi havas tiom da memoro. 270 00:22:40,190 --> 00:22:44,930 Kaj la mastruma sistemo estas sufiĉe inteligenta, ke ĝi nur atribui kion vi fakte bezonas. 271 00:22:44,930 --> 00:22:49,630 Ĝi ne nur iru, ho, novan procezon: 4 koncertoj. 272 00:22:49,630 --> 00:22:51,930 >> Yeah. >> [Studento] Kion signifas la bovo signifas? Kial vi skribas tion? 273 00:22:51,930 --> 00:22:54,980 Estas nur la simbolo por deksesuma. 274 00:22:54,980 --> 00:22:59,590 Kiam vi vidos kelkajn komenco kun bovo, la pluaj aĵoj estas deksesuma. 275 00:23:01,930 --> 00:23:05,760 [Studento] Vi estis klarigante pri kio okazas kiam programo finiĝas. >> Jes. 276 00:23:05,760 --> 00:23:09,480 Kio okazas kiam programo finiĝas estas la mastruma sistemo 277 00:23:09,480 --> 00:23:13,600 nur viŝas la surĵetoj kiu havas por tiuj adresoj, kaj tio estas ĝi. 278 00:23:13,600 --> 00:23:17,770 La mastruma sistemo povas nun simple doni tiun memoron al alia programo por uzi. 279 00:23:17,770 --> 00:23:19,490 [Studento] Okay. 280 00:23:19,490 --> 00:23:24,800 Do kiam vi atribui iun sur la havaĵon aŭ la pilo aŭ tutmonda variabloj aŭ nenion, 281 00:23:24,800 --> 00:23:27,010 ili cxiuj nur malaperi tuj kiam la programo finiĝas 282 00:23:27,010 --> 00:23:32,120 ĉar la mastruma sistemo estas nun libera doni tiun memoron al ajna alia procezo. 283 00:23:32,120 --> 00:23:35,150 [Studento] Kvankam ne estas probable ankoraux valoroj skribita en? >> Jes. 284 00:23:35,150 --> 00:23:37,740 La valoroj estas verŝajna ankoraŭ tie. 285 00:23:37,740 --> 00:23:41,570 Oni ĵus tuj estos malfacile akiri ilin. 286 00:23:41,570 --> 00:23:45,230 Estas multe pli malfacile akiri ilin ol estas alveni al forviŝita dosieron 287 00:23:45,230 --> 00:23:51,450 ĉar la forviŝita dosiero specon de sidas tie dum longa tempo kaj la malmola disko estas multe pli granda. 288 00:23:51,450 --> 00:23:54,120 Do tuj anstatauxigas malsamaj partoj de memoro 289 00:23:54,120 --> 00:23:58,640 antaŭ ol ĝi okazas al anstataŭigi la bloko de memoro, ke tiu dosiero uzita por esti je. 290 00:23:58,640 --> 00:24:04,520 Sed ĉefmemoro, RAM, vi ciklo tra multe pli rapida, 291 00:24:04,520 --> 00:24:08,040 tiel okazas al tre rapide esti anstataŭigi. 292 00:24:10,300 --> 00:24:13,340 Demandoj pri tiu aŭ io alia? 293 00:24:13,340 --> 00:24:16,130 [Studento] Mi havas demandojn pri malsama temo. >> Bone. 294 00:24:16,130 --> 00:24:19,060 Ĉu iu havas demandojn pri tiu? 295 00:24:20,170 --> 00:24:23,120 >> Okay. Malsamaj temo. >> [Studento] Okay. 296 00:24:23,120 --> 00:24:26,550 Mi tuj tra iu el la praktiko provoj, 297 00:24:26,550 --> 00:24:30,480 kaj en unu el ili parolis pri la sizeof 298 00:24:30,480 --> 00:24:35,630 kaj la valoro kiu revenas aŭ malsama variablo tipoj. >> Jes. 299 00:24:35,630 --> 00:24:45,060 Kaj gxi diris ke ambaŭ int kaj longaj ambaŭ reveno 4, do ili estas ambaŭ 4 bitokoj longa. 300 00:24:45,060 --> 00:24:48,070 Ĉu estas diferenco inter int kaj longa, aŭ estas la sama afero? 301 00:24:48,070 --> 00:24:50,380 Jes, estas diferenco. 302 00:24:50,380 --> 00:24:52,960 La C normo - 303 00:24:52,960 --> 00:24:54,950 Mi verŝajne tuj salaton supren. 304 00:24:54,950 --> 00:24:58,800 La C normo estas ĝuste kiel kio C estas, la oficiala dokumentaro de C. 305 00:24:58,800 --> 00:25:00,340 Jen kion diras. 306 00:25:00,340 --> 00:25:08,650 Do la C normo ĵus diras ke char estos por ĉiam kaj ĉiam esti 1 bajto. 307 00:25:10,470 --> 00:25:19,040 Ĉio post tio - mallonga estas ĉiam nur difinita kiel estante pli granda ol aŭ egala al char. 308 00:25:19,040 --> 00:25:23,010 Tio povas esti strikte pli granda ol, sed ne pozitiva. 309 00:25:23,010 --> 00:25:31,940 An int estas simple difinita kiel estante pli granda ol aŭ egala al mallonga. 310 00:25:31,940 --> 00:25:36,210 Kaj longa estas nur difinita kiel estante pli granda ol aŭ egala al int. 311 00:25:36,210 --> 00:25:41,600 Kaj longa longa estas pli granda ol aŭ egala al longa. 312 00:25:41,600 --> 00:25:46,610 Do la sola afero la C normo difinas estas la relativa ordenamiento de ĉiu. 313 00:25:46,610 --> 00:25:54,880 La reala kvanto de memoro, ke aferoj levu estas ĝenerale ĝis efektivigo, 314 00:25:54,880 --> 00:25:57,640 sed ĝi estas sufiĉe bone difinitaj en ĉi tiu punkto. >> [Studento] Okay. 315 00:25:57,640 --> 00:26:02,490 Do mallongaj preskaŭ ĉiam tuj estos 2 bajtoj. 316 00:26:04,920 --> 00:26:09,950 Ints estas preskaŭ ĉiam tuj estos 4 bitokoj. 317 00:26:12,070 --> 00:26:15,340 Longa sopiras estas preskaŭ ĉiam tuj estos 8 bajtoj. 318 00:26:17,990 --> 00:26:23,160 Kaj sopiras, ĝi dependas de ĉu vi uzas de 32-bita aŭ 64-bita sistemo. 319 00:26:23,160 --> 00:26:27,450 Do longa tuj respondas al la tipo de sistemo. 320 00:26:27,450 --> 00:26:31,920 Se vi uzas 32-bitan sistemo kiel la Appliance, ĝi tuj estos 4 bitokoj. 321 00:26:34,530 --> 00:26:42,570 Se vi uzas 64-bita kiel multe da freŝaj komputiloj, ĝi tuj estos 8 bajtoj. 322 00:26:42,570 --> 00:26:45,230 >> Ints estas preskaŭ ĉiam 4 bitokoj je ĉi tiu punkto. 323 00:26:45,230 --> 00:26:47,140 Longa sopiras estas preskaŭ ĉiam 8 bajtoj. 324 00:26:47,140 --> 00:26:50,300 En la pasinteco, ints uzata por nur esti 2 bitokoj. 325 00:26:50,300 --> 00:26:56,840 Sed rimarki ke tiu tute kontentigas ĉiujn el tiuj rilatoj de pli granda ol kaj egala al. 326 00:26:56,840 --> 00:27:01,280 Tiel longe estas perfekte permesita al esti la sama amplekso kiel entjero, 327 00:27:01,280 --> 00:27:04,030 kaj ĝi estas ankaŭ permesita al esti la sama amplekso kiel longa longa. 328 00:27:04,030 --> 00:27:11,070 Kaj ĝuste tial hazarde estas, ke en 99,999% de sistemoj, tuj esti egala al 329 00:27:11,070 --> 00:27:15,800 ĉu int aŭ longa longa. Simple dependas de 32-bita aŭ 64-bita. >> [Studento] Okay. 330 00:27:15,800 --> 00:27:24,600 Per flosoj, kiom estas la dekuma punkto designado en terminoj de bitoj? 331 00:27:24,600 --> 00:27:27,160 Kvazaux duuma? >> Jes. 332 00:27:27,160 --> 00:27:30,570 Vi ne bezonas scii ke por CS50. 333 00:27:30,570 --> 00:27:32,960 Vi eĉ ne lernas, ke en 61. 334 00:27:32,960 --> 00:27:37,350 Vi ne lernas ke vere en ajna direkto. 335 00:27:37,350 --> 00:27:42,740 Estas nur reprezento. 336 00:27:42,740 --> 00:27:45,440 Mi forgesas la ĝusta iom allotments. 337 00:27:45,440 --> 00:27:53,380 La ideo de flosanta punkto estas ke vi rezervu specifa nombro de bitoj por reprezenti - 338 00:27:53,380 --> 00:27:56,550 Esence, ĉiu estas en scienca notacio. 339 00:27:56,550 --> 00:28:05,600 Do vi atribui specifan numeron da bitoj por reprezenti la nombro mem, kiel 1,2345. 340 00:28:05,600 --> 00:28:10,200 Mi neniam povas reprezenti nombro kun pli ol 5 ciferoj. 341 00:28:12,200 --> 00:28:26,300 Tiam vi ankaŭ rezervu specifa nombro de bitoj por ke ĝi emas esti kiel 342 00:28:26,300 --> 00:28:32,810 vi nur povas iru al certa nombro, kiel tio estas la plej granda eksponento vi povas havi, 343 00:28:32,810 --> 00:28:36,190 kaj vi nur povas iri en iun eksponento, 344 00:28:36,190 --> 00:28:38,770 kiel tio estas la plej malgranda eksponento povas havi. 345 00:28:38,770 --> 00:28:44,410 >> Mi ne memoras la ĝustan vojon bitoj estas atribuitaj al ĉiuj tiuj valoroj, 346 00:28:44,410 --> 00:28:47,940 sed iu numero de bitoj estas dediĉitaj al 1,2345, 347 00:28:47,940 --> 00:28:50,930 alia iun numeron de bitoj estas dediĉitaj al la eksponento, 348 00:28:50,930 --> 00:28:55,670 kaj estas nur ebla por reprezenti eksponento de iu grandeco. 349 00:28:55,670 --> 00:29:01,100 [Studento] Kaj duobla? Ĉu tio estas kiel ekstra longa kaleŝego? >> Jes. 350 00:29:01,100 --> 00:29:07,940 Ĝi estas la sama afero kiel kaleŝego krom nun vi uzas 8 bajtoj anstataŭ 4 bitokoj. 351 00:29:07,940 --> 00:29:11,960 Nun vi povos uzi 9 ciferoj aŭ 10 ciferoj, 352 00:29:11,960 --> 00:29:16,630 kaj ĉi povos iri ĝis 300 anstataŭ 100. >> [Studento] Okay. 353 00:29:16,630 --> 00:29:21,550 Kaj floto estas ankaŭ 4 bitokoj. >> Jes. 354 00:29:21,550 --> 00:29:27,520 Nu, denove, ĝi probable dependas entute sur ĝenerala apliko, 355 00:29:27,520 --> 00:29:30,610 sed flosas estas 4 bajtoj, duobloj estas 8. 356 00:29:30,610 --> 00:29:33,440 Duobloj nomas duobla ĉar ili estas duobla la grandeco de kaleŝegoj. 357 00:29:33,440 --> 00:29:38,380 [Studento] Okay. Kaj ili tie duoblan duobligas? >> Estas ne. 358 00:29:38,380 --> 00:29:43,660 Mi kredas - >> [studento] Kiel longe sopiras? >> Jes. Mi ne kredas tion. Jes. 359 00:29:43,660 --> 00:29:45,950 [Studento] La pasinta jaro provo estis demando pri la ĉefa funkcio 360 00:29:45,950 --> 00:29:49,490 devi esti parto de via programo. 361 00:29:49,490 --> 00:29:52,310 La respondo estis, ke ĝi ne devas esti parto de via programo. 362 00:29:52,310 --> 00:29:55,100 En kio situacio? Tion mi vidis. 363 00:29:55,100 --> 00:29:59,090 [Bowden] Sxajnas - >> [studento] Kio situacio? 364 00:29:59,090 --> 00:30:02,880 Ĉu vi havas la problemon? >> [Studento] Jes, mi povas definitive tiri gxin. 365 00:30:02,880 --> 00:30:07,910 Ĝi ne devas esti, teknike, sed esence tuj estos. 366 00:30:07,910 --> 00:30:10,030 [Studento] Mi vidis unu sur alian jaron. 367 00:30:10,030 --> 00:30:16,220 Estis kiel Vera aŭ Falsa: A valida - >> Ho, al. C dosiero? 368 00:30:16,220 --> 00:30:18,790 [Studento] Ajna. C dosiero devas havi - [ambaŭ parolantaj samtempe - nekomprenebla] 369 00:30:18,790 --> 00:30:21,120 Okay. Do jen disigas. 370 00:30:21,120 --> 00:30:26,800 >> A. C dosiero simple bezonas enhavi funkciojn. 371 00:30:26,800 --> 00:30:32,400 Vi povas kompili dosieron en maŝino kodo, duuma, kion ajn, 372 00:30:32,400 --> 00:30:36,620 sen ĝi esti ruleblan ankoraŭ. 373 00:30:36,620 --> 00:30:39,420 Entajpu validan ruleblan devas havi ĉefan funkcion. 374 00:30:39,420 --> 00:30:45,460 Vi povas skribi 100 funkcioj en 1 dosiero sed neniu ĉefa 375 00:30:45,460 --> 00:30:48,800 kaj poste kompilos ke malsupren al duuma, 376 00:30:48,800 --> 00:30:54,460 tiam vi skribos alia dosiero kiu nur havas ĉefan sed nomas aron da tiuj funkcioj 377 00:30:54,460 --> 00:30:56,720 en ĉi duuma dosiero super tie. 378 00:30:56,720 --> 00:31:01,240 Kaj tiel, kiam vi faras la ruleblan, jen kion la enlazador faras 379 00:31:01,240 --> 00:31:05,960 Estas ĝi kombinas tiuj 2 duumajn dosierojn en plenumeblan. 380 00:31:05,960 --> 00:31:11,400 Kaj la prezo. C dosiero ne bezonas havi ĉefan funkcion ajn. 381 00:31:11,400 --> 00:31:19,220 Kaj sur granda kodo bazoj vi vidos milojn da. C dosierojn kaj 1 ĉefa dosiero. 382 00:31:23,960 --> 00:31:26,110 Pli demandoj? 383 00:31:29,310 --> 00:31:31,940 [Studento] Ne estis alia demando. 384 00:31:31,940 --> 00:31:36,710 Ĝi diris fari estas tradukilo. Vera aŭ falsa? 385 00:31:36,710 --> 00:31:42,030 Kaj la respondo estis falsa, kaj mi komprenis kial ĝi ne estas kiel Clang. 386 00:31:42,030 --> 00:31:44,770 Sed kion ni nomas fari se ĝi ne estas? 387 00:31:44,770 --> 00:31:49,990 Faru estas esence nur - Mi povas vidi ĝuste kio ĝi nomas ĝin. 388 00:31:49,990 --> 00:31:52,410 Sed ĵus kuras ordonojn. 389 00:31:53,650 --> 00:31:55,650 Fari. 390 00:31:58,240 --> 00:32:00,870 Mi povas tiri tiun supren. Yeah. 391 00:32:10,110 --> 00:32:13,180 Ho, jes. Faru ankaux faras tion. 392 00:32:13,180 --> 00:32:17,170 Ĉi tio diras la celo de la fari utileco estas determini aŭtomate 393 00:32:17,170 --> 00:32:19,610 kio pecoj de granda programo bezonas esti recompiled 394 00:32:19,610 --> 00:32:22,350 kaj elsendi la komandojn recompilar ilin. 395 00:32:22,350 --> 00:32:27,690 Vi povas fari fari dosieroj kiuj estas absolute enorma. 396 00:32:27,690 --> 00:32:33,210 Faru rigardas la tempo poŝtmarkojn de dosieroj kaj, kiel ni diris antaŭe, 397 00:32:33,210 --> 00:32:36,930 vi povas kompili individuaj dosieroj malsupren, kaj ne estas ĝis vi atingos la enlazador 398 00:32:36,930 --> 00:32:39,270 ke ili estas kunmetita en plenumeblan. 399 00:32:39,270 --> 00:32:43,810 Do se vi havas 10 malsamajn dosierojn kaj vi fari ŝanĝon al 1 de ili, 400 00:32:43,810 --> 00:32:47,870 tiam kion fari tuj fari estas simple recompilar ke 1 dosiero 401 00:32:47,870 --> 00:32:50,640 kaj tiam relink ĉio kune. 402 00:32:50,640 --> 00:32:53,020 Sed estas multe dumber ol tio. 403 00:32:53,020 --> 00:32:55,690 Ĝi dependas de vi tute difinas ke tio kio devus esti farante. 404 00:32:55,690 --> 00:32:59,560 Ĝi defaŭlte havas la kapablon rekoni tiun tempon stampon stuff, 405 00:32:59,560 --> 00:33:03,220 sed vi povas skribi fari dosieron fari nenion. 406 00:33:03,220 --> 00:33:09,150 Vi povas skribi fari dosieron por ke kiam vi tajpas fari ĝin ĵus cd la alian dosierujon. 407 00:33:09,150 --> 00:33:15,560 Mi komencis frustritaj ĉar mi Tack ĉio ene de mia Appliance 408 00:33:15,560 --> 00:33:21,740 kaj tiam mi vidi la PDF de la Mac. 409 00:33:21,740 --> 00:33:30,720 >> Do mi iras al ranojn, kaj mi povas fari Iru Konekti al Servilo, 410 00:33:30,720 --> 00:33:36,950 kaj la servilo ligojn al mia Appliance, kaj tiam mi malfermi la PDF 411 00:33:36,950 --> 00:33:40,190 ke gets kompilita de LaTeX. 412 00:33:40,190 --> 00:33:49,320 Sed mi getting frustritaj ĉar ĉiu unuopa tempo mi bezonis por refreŝigi la PDF, 413 00:33:49,320 --> 00:33:53,900 Mi devis kopii ĝin al specifa dosierujo kiu ĝin povis konsenti 414 00:33:53,900 --> 00:33:57,710 kaj estis ĉiufoje ĝena. 415 00:33:57,710 --> 00:34:02,650 Do anstataŭe mi skribis fari dosieron, kiun vi havas al difini kiel faras tion. 416 00:34:02,650 --> 00:34:06,130 Kiel vi faras en ĉi estas PDF LaTeX. 417 00:34:06,130 --> 00:34:10,090 Same kiel ĉiu alia fari dosieron - aŭ mi supozas vi ne vidis la fakto dosieroj, 418 00:34:10,090 --> 00:34:13,510 sed ni havas en la Appliance tutmonda fari dosieron kiu nur diras, 419 00:34:13,510 --> 00:34:16,679 se vi kompili C dosiero, uzu Clang. 420 00:34:16,679 --> 00:34:20,960 Kaj tiel cxi tie en mia fari dosieron, kiun mi faras mi diras, 421 00:34:20,960 --> 00:34:25,020 ĉi tiu dosiero vi tuj volas kompili kun PDF LaTeX. 422 00:34:25,020 --> 00:34:27,889 Kaj tial ĝi estas PDF LaTeX ke tio faras la kompili. 423 00:34:27,889 --> 00:34:31,880 Faru ne kompili. Ĝi estas nur kurante tiuj ordonoj en la vico mi specifitaj. 424 00:34:31,880 --> 00:34:36,110 Do ĝi kuras PDF LaTeX, ĝi kopias ĝin al la dosierujo Mi volas ke ĝi estu kopiitaj al, 425 00:34:36,110 --> 00:34:38,270 ĝi cd al la katalogo kaj faras aliajn aĵojn, 426 00:34:38,270 --> 00:34:42,380 sed vi nur faras estas rekoni kiam dosieron ŝanĝoj, 427 00:34:42,380 --> 00:34:45,489 kaj se ĝi ŝanĝas, tiam ĝi kuros la komandojn kiujn ĝi estas supozitaj kuri 428 00:34:45,489 --> 00:34:48,760 kiam la dosiero ŝanĝojn. >> [Studento] Okay. 429 00:34:50,510 --> 00:34:54,420 Mi ne scias, kie la tutmonda fari dosieroj estas por mi kontroli ĝin. 430 00:34:57,210 --> 00:35:04,290 Aliaj demandoj? Ion de pasintaj kvizojn? Ajna puntero aferojn? 431 00:35:06,200 --> 00:35:08,730 Estas subtilaj aferoj kun indikoj kiel - 432 00:35:08,730 --> 00:35:10,220 Mi ne tuj povos trovi kvizon demandon sur ĝi - 433 00:35:10,220 --> 00:35:16,250 sed ĝuste kiel ĉi tiajn aferojn. 434 00:35:19,680 --> 00:35:24,060 Certiĝu vi komprenas, ke kiam mi diras int * x * y - 435 00:35:24,890 --> 00:35:28,130 Tiu ne estas ĝuste nenio ĉi tie, mi supozas. 436 00:35:28,130 --> 00:35:32,140 Sed kiel * x * y, tiuj estas 2 variabloj, kiuj estas sur la stako. 437 00:35:32,140 --> 00:35:37,220 Kiam mi diras x = malloc (sizeof (int)), x estas ankoraŭ variablo en la pilo, 438 00:35:37,220 --> 00:35:41,180 malloc estas iu bloko super en la havaĵo, kaj ni havi x punkto al la amaso. 439 00:35:41,180 --> 00:35:43,900 >> Do iun sur la stako punktoj al la amaso. 440 00:35:43,900 --> 00:35:48,100 Kiam ajn vi malloc nenion, vi neeviteble stoki ĝin ene de puntero. 441 00:35:48,100 --> 00:35:55,940 Por ke puntero estas sur la stako, la malloced bloko estas sur la muro. 442 00:35:55,940 --> 00:36:01,240 Multaj homoj atingas konfuzita kaj diru int * x = malloc; x estas sur la monteto. 443 00:36:01,240 --> 00:36:04,100 Ne Kio x notas al estas sur la monteto. 444 00:36:04,100 --> 00:36:08,540 x mem estas sur la pilo, se por ajna kialo vi x esti tutmonda variablo, 445 00:36:08,540 --> 00:36:11,960 en kies kazo tio okazas al esti en alia regiono de memoro. 446 00:36:13,450 --> 00:36:20,820 Do konservanta trako, tiuj skatolo kaj sago diagramoj estas bela komuna por la kvizo. 447 00:36:20,820 --> 00:36:25,740 Aŭ se ĝi ne estas sur kvizo 0, ĝi estas sur kvizo 1. 448 00:36:27,570 --> 00:36:31,940 Vi devas scii ĉiu de ĉi tiuj, la paŝoj en kompili 449 00:36:31,940 --> 00:36:35,740 ĉar vi devis respondi demandojn de tiuj. Jes. 450 00:36:35,740 --> 00:36:38,940 [Studento] Could we go super tiuj paŝoj - >> Certe. 451 00:36:48,340 --> 00:36:58,640 Antaŭ paŝoj kaj kompili ni havas preprocesamiento, 452 00:36:58,640 --> 00:37:16,750 kompili, ariganta, kaj kunligi. 453 00:37:16,750 --> 00:37:21,480 Preprocesamiento. Kion tio do? 454 00:37:29,720 --> 00:37:32,290 Ĝi estas la plej facila paŝo en - nu, ne kiel - 455 00:37:32,290 --> 00:37:35,770 tio ne signifas ke devus esti evidenta, sed ĝi estas la plej facila paŝo. 456 00:37:35,770 --> 00:37:38,410 You guys povus apliki ĝin vi mem. Yeah. 457 00:37:38,410 --> 00:37:43,410 [Studento] Prenu kion vi havas en via inkludas kiel ĉi tio kaj ĝi kopias kaj poste ankaŭ difinas. 458 00:37:43,410 --> 00:37:49,250 Ĝi serĉas aĵojn kiel # include kaj # difini, 459 00:37:49,250 --> 00:37:53,800 kaj tio nur kopioj kaj pastes kio tiuj vere signifas. 460 00:37:53,800 --> 00:37:59,240 Do kiam vi diras # include cs50.h, la antaŭtraktilo estas kopii kaj bati cs50.h 461 00:37:59,240 --> 00:38:01,030 en tiun linion. 462 00:38:01,030 --> 00:38:06,640 Kiam vi diras # difini x al esti 4, la antaŭtraktilo iras tra la tuta programo 463 00:38:06,640 --> 00:38:10,400 kaj anstataŭas cxia okazoj de x kun 4. 464 00:38:10,400 --> 00:38:17,530 Do la antaŭtraktilo prenas validan C dosieron kaj eligas validan C dosieron 465 00:38:17,530 --> 00:38:20,300 kie aĵoj estis kopiitaj kaj pasted. 466 00:38:20,300 --> 00:38:24,230 Do nun kompili. Kion tio do? 467 00:38:25,940 --> 00:38:28,210 [Studento] Ĝi iras de C al duuma. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] Ne iru la tuta vojo al duuma. 469 00:38:30,970 --> 00:38:34,220 [Studento] Por maŝino kodo do? >> Ne maŝino kodo. 470 00:38:34,220 --> 00:38:35,700 [Studento] Asembleo? >> Asembleo. 471 00:38:35,700 --> 00:38:38,890 Ĝi iras al Asembleo antaux gxi iras tuta vojo al C kodo, 472 00:38:38,890 --> 00:38:45,010 kaj plej lingvoj fari ion kiel ĉi tio. 473 00:38:47,740 --> 00:38:50,590 Pick ajna altnivela lingvo, kaj se vi iras por kompili ĝin, 474 00:38:50,590 --> 00:38:52,390 ĝi estas verŝajna kompili en paŝoj. 475 00:38:52,390 --> 00:38:58,140 Unue okazas kompili Python al C, tiam ĝi tuj kompili C al Asembleo, 476 00:38:58,140 --> 00:39:01,600 kaj tiam Asembleo tuj get tradukita al duuma. 477 00:39:01,600 --> 00:39:07,800 Do kompili tuj alportos ĝin de C al Asembleo. 478 00:39:07,800 --> 00:39:12,130 La vorto kompili kutime signifas alporti ĝin de pli alta nivelo 479 00:39:12,130 --> 00:39:14,340 al malsupera nivelo programlingvo. 480 00:39:14,340 --> 00:39:19,190 Do ĉi tiu estas la sola paŝo en kompilita kie vi komencos kun alta nivelo lingva 481 00:39:19,190 --> 00:39:23,270 kaj ili finas en malalta nivelo lingvo, kaj tial la paŝo estas nomata kompili. 482 00:39:25,280 --> 00:39:33,370 [Studento] Dum kompili, diru ke vi faris # include cs50.h. 483 00:39:33,370 --> 00:39:42,190 Ĉu la tradukilo recompilar la cs50.h, kiel la funkcioj, kiuj estas en tie, 484 00:39:42,190 --> 00:39:45,280 kaj traduki ke en Asembleo kodo tiel, 485 00:39:45,280 --> 00:39:50,830 aŭ ĉu ĝi kopii kaj almeti ion kiu jam pasis antaŭ-Asembleo? 486 00:39:50,830 --> 00:39:56,910 cs50.h estos preskaux neniam finos en Asembleo. 487 00:39:59,740 --> 00:40:03,680 Stuff kiel funkcio prototipoj kaj aĵoj estas nur por vi esti singarda. 488 00:40:03,680 --> 00:40:09,270 Ĝi garantias ke la tradukilo povas kontroli tion kiel vi vokas funkciojn 489 00:40:09,270 --> 00:40:12,910 kun la dekstra reveno tipoj kaj la dekstra argumentoj kaj aĵoj. 490 00:40:12,910 --> 00:40:18,350 >> Do cs50.h estos preprocessed en la dosiero, kaj tiam, kiam ĝi estos kompili 491 00:40:18,350 --> 00:40:22,310 ĝi estas esence forĵetis post ĝi certigas ke ĉiu estas nomata ĝuste. 492 00:40:22,310 --> 00:40:29,410 Sed la funkcioj difinitaj en la CS50 biblioteko, kiuj estas apartaj de cs50.h, 493 00:40:29,410 --> 00:40:33,610 tiuj ne estos aparte kompilita. 494 00:40:33,610 --> 00:40:37,270 Tio vere malsupreniru en la ligas paŝo, tial ni atingos ke en dua. 495 00:40:37,270 --> 00:40:40,100 Sed unue, kio estas ariganta? 496 00:40:41,850 --> 00:40:44,500 [Studento] Asembleo por duuma? >> Jes. 497 00:40:46,300 --> 00:40:48,190 Ensamblando. 498 00:40:48,190 --> 00:40:54,710 Ni ne nomas ĝin kompili ĉar Asembleo estas preskaux pura traduko de duuma. 499 00:40:54,710 --> 00:41:00,230 Estas tre malmulte logiko en irante de Asembleo por duuma. 500 00:41:00,230 --> 00:41:03,180 Ĝi simple ŝatus suprenrigardinte en tabulo, oh, ni havas ĉi instrukcion; 501 00:41:03,180 --> 00:41:06,290 kiu respondas al duuma 01110. 502 00:41:10,200 --> 00:41:15,230 Kaj tial la dosieroj kiuj ensamblando ĝenerale eligoj estas. O dosierojn. 503 00:41:15,230 --> 00:41:19,020 Kaj. O dosieroj estas kion ni diras antaŭe, 504 00:41:19,020 --> 00:41:21,570 kiel dosiero ne bezonas havi ĉefan funkcion. 505 00:41:21,570 --> 00:41:27,640 Ajna dosiero povas kompili suben al. O dosieron, kondiĉe ke ĝi estas valida C dosiero. 506 00:41:27,640 --> 00:41:30,300 Ĝi povas esti kompilita ĝis. O. 507 00:41:30,300 --> 00:41:43,030 Nun, ligante estas kio vere alportas aron da. O dosierojn kaj alportas ilin al plenumebla. 508 00:41:43,030 --> 00:41:51,110 Kaj tiel kion kunligi faras estas vi povas pensi pri la CS50 biblioteko kiel. O dosiero. 509 00:41:51,110 --> 00:41:56,980 Estas jam kompilita duuma dosiero. 510 00:41:56,980 --> 00:42:03,530 Kaj tiel, kiam vi kompili vian dosieron, via hello.c, kiu nomas GetString, 511 00:42:03,530 --> 00:42:06,360 hello.c gets kompilita ĝis hello.o, 512 00:42:06,360 --> 00:42:08,910 hello.o estas nun en duuma. 513 00:42:08,910 --> 00:42:12,830 Ĝi uzas GetString, do ĝi bezonas por transiri al cs50.o, 514 00:42:12,830 --> 00:42:16,390 kaj la enlazador smooshes ilin kune kaj kopias GetString en tiun dosieron 515 00:42:16,390 --> 00:42:20,640 kaj eliras kun plenumeblan kiu havas cxiujn funkcioj bezonas. 516 00:42:20,640 --> 00:42:32,620 Do cs50.o ne reale ho dosiero, sed ĝi estas sufiĉe proksimaj, ke ne estas fundamenta diferenco. 517 00:42:32,620 --> 00:42:36,880 Do kunligi nur alportas aron da dosieroj kune 518 00:42:36,880 --> 00:42:41,390 ke aparte enhavi ĉiuj el la funkcioj Mi bezonas uzi 519 00:42:41,390 --> 00:42:46,120 kaj kreas la ruleblan kiu vere funkcias. 520 00:42:48,420 --> 00:42:50,780 >> Kaj tiel tio estas ankaŭ, kion ni volus diri antaux 521 00:42:50,780 --> 00:42:55,970 kie vi povas havi 1000. c dosierojn, vi kompili ilin ĉiujn al. o dosieroj, 522 00:42:55,970 --> 00:43:00,040 kiu probable preni momenton, tiam vi ŝanĝi 1. c dosiero. 523 00:43:00,040 --> 00:43:05,480 Vi nur devas recompilar ke 1. C dosiero kaj tiam relink ĉio alia, 524 00:43:05,480 --> 00:43:07,690 ligi ĉio reen kune. 525 00:43:09,580 --> 00:43:11,430 [Studento] Kiam ni kunligas ni skribi lcs50? 526 00:43:11,430 --> 00:43:20,510 Yeah, tiel lcs50. Tiu flago signalojn al la enlazador ke vi devus kunligi en tiu biblioteko. 527 00:43:26,680 --> 00:43:28,910 Demandoj? 528 00:43:41,310 --> 00:43:46,860 Ĉu ni iris trans duuma aliaj ol 5 sekundoj en la unua prelego? 529 00:43:50,130 --> 00:43:53,010 Mi ne kredas tion. 530 00:43:55,530 --> 00:43:58,820 Vi devas scii ĉiuj el la grandaj Os ke ni iris trans, 531 00:43:58,820 --> 00:44:02,670 kaj vi devus kapabli, se ni donis al vi funkcio, 532 00:44:02,670 --> 00:44:09,410 vi devus povi diri ke estas granda a, proksimume. Aŭ bone, granda O estas malglata. 533 00:44:09,410 --> 00:44:15,300 Do se vi vidas anidado por maŝojn looping super la sama nombro de aĵoj, 534 00:44:15,300 --> 00:44:22,260 kiel int i, i > [studento] n kvadratoj. >> Inklinas esti n kvadratoj. 535 00:44:22,260 --> 00:44:25,280 Se vi triobla anidado, ĝi emas esti n potenco de. 536 00:44:25,280 --> 00:44:29,330 Por ke tiaj aferoj vi povos atentigi tuj. 537 00:44:29,330 --> 00:44:33,890 Vi bezonas scii inserción varo kaj bobelo varo kaj kunfandi varo kaj ĉiuj el tiuj. 538 00:44:33,890 --> 00:44:41,420 Estas pli facile kompreni kial ili estas tiuj n kvadratoj kaj n log n kaj ĉiu de tiu 539 00:44:41,420 --> 00:44:47,810 ĉar mi kredas ke estis sur kvizon unu jaro, kie ni esence donis al vi 540 00:44:47,810 --> 00:44:55,050 realigo de bobelo varo kaj diris, "Kia estas la rula tempo de ĉi tiu funkcio?" 541 00:44:55,050 --> 00:45:01,020 Do se vi rekonas ĝin kiel bobelo varo, tiam vi tuj povas diri n kvadratoj. 542 00:45:01,020 --> 00:45:05,470 Sed se vi simple rigardi ĝin, vi eĉ ne bezonas por realigi ĝin la bobelo varo; 543 00:45:05,470 --> 00:45:08,990 vi povas simple diri ĉi faras tion kaj tion. Tiu estas n kvadratoj. 544 00:45:12,350 --> 00:45:14,710 [Studento] Ĉu estas malmola ekzemploj vi povas veni supren kun, 545 00:45:14,710 --> 00:45:20,370 kiel similan ideon de elŝeligi? 546 00:45:20,370 --> 00:45:24,450 >> Mi ne kredas ke ni devus doni al vi ajnan malmola ekzemploj. 547 00:45:24,450 --> 00:45:30,180 La bobelo speco afero estas proksimume same malfacilaj kiel ni devus iri, 548 00:45:30,180 --> 00:45:36,280 kaj eĉ tio, tiom longe kiom vi komprenas, ke vi ripetanta super la tabelo 549 00:45:36,280 --> 00:45:41,670 por ĉiu elemento en la tabelo, kiu tuj estos io ke tio n kvadratoj. 550 00:45:45,370 --> 00:45:49,940 Estas ĝeneralaj demandoj, kiel ĉi tie ni havas - Oh. 551 00:45:55,290 --> 00:45:58,530 Nur la duan tagon, Doug asertis, "mi elpensis algoritmo kiu povas ordigi tabelo 552 00:45:58,530 --> 00:46:01,780 "De n nombroj en O (logo n) tempo!" 553 00:46:01,780 --> 00:46:04,900 Nu do kiel ni scias, ke estas neeble? 554 00:46:04,900 --> 00:46:08,850 [Inaudible studento respondon] >> Jes. 555 00:46:08,850 --> 00:46:13,710 Almenaŭ, vi devas tuŝi ĉiu elemento en la tabelo, 556 00:46:13,710 --> 00:46:16,210 do ĝi estas neebla al ordigi tabelo de - 557 00:46:16,210 --> 00:46:20,850 Se ĉio estas en unsorted ordo, tiam vi tuj estos tuŝi ĉiun en la tabelo, 558 00:46:20,850 --> 00:46:25,320 do ĝi estas neeble fari ĝin en malpli ol ho de n. 559 00:46:27,430 --> 00:46:30,340 [Studento] Vi montris al ni ke ekzemple de povi fari ĝin en O de n 560 00:46:30,340 --> 00:46:33,920 se vi uzas multan memoron. >> Jes. 561 00:46:33,920 --> 00:46:37,970 Kaj that's - Mi forgesas, kion that's - Ĉu rakonti speco? 562 00:46:47,360 --> 00:46:51,330 Hmm. Tio estas entjero ordigado algoritmo. 563 00:46:59,850 --> 00:47:05,100 Mi serĉis la speciala nomo por tio, kion mi ne povis memori lasta semajno. 564 00:47:05,100 --> 00:47:13,000 Yeah. Ĉi tiuj estas la tipoj de varoj kiuj povas plenumi tion en granda a de n. 565 00:47:13,000 --> 00:47:18,430 Sed estas limigoj, kiel vi nur povas uzi entjeroj ĝis certa nombro. 566 00:47:20,870 --> 00:47:24,560 Plus se vi provas ordigi ion that's - 567 00:47:24,560 --> 00:47:30,750 Se via tabelo estas 012, -12, 151, 4 milionoj, 568 00:47:30,750 --> 00:47:35,120 tiam tiu sola ero tuj tute ruinigi la tutan ordigado. 569 00:47:42,060 --> 00:47:44,030 >> Demandoj? 570 00:47:49,480 --> 00:47:58,870 [Studento] Se vi havas rekursie funkcio kaj ĝi nur faras la rekursiaj alvokoj 571 00:47:58,870 --> 00:48:02,230 ene de return, jen vosto rekursie, 572 00:48:02,230 --> 00:48:07,360 kaj tiel estus ke ne uzas pli memoro dum ekzekuto 573 00:48:07,360 --> 00:48:12,550 aŭ ĝi almenaŭ uzi komparebla memoro kiel ripeta solvo? 574 00:48:12,550 --> 00:48:14,530 [Bowden] Jes. 575 00:48:14,530 --> 00:48:19,840 Ĝi probable estos iom pli malrapida, sed ne vere. 576 00:48:19,840 --> 00:48:23,290 Vosto rekursie estas sufiĉe bonaj. 577 00:48:23,290 --> 00:48:32,640 Looking denove ĉe pilo kadroj, diru ni havas ĉefan 578 00:48:32,640 --> 00:48:42,920 kaj ni havas int trinkejo (int x) aŭ io. 579 00:48:42,920 --> 00:48:52,310 Tio ne estas perfekta rekursie funkcio, sed reveno trinkejo (x - 1). 580 00:48:52,310 --> 00:48:57,620 Do evidente, ĉi tiu estas misa. Vi bezonas bazon kazoj kaj aĵoj. 581 00:48:57,620 --> 00:49:00,360 Sed la ideo estas, ke tio estas vosto rekursie, 582 00:49:00,360 --> 00:49:06,020 kio signifas, kiam ĉefa alvokoj trinkejo ĝi tuj trovi ĝian pilo kadro. 583 00:49:09,550 --> 00:49:12,440 En ĉi tiu pilo kadro tie Iĝos iom bloko de memoro 584 00:49:12,440 --> 00:49:17,490 kiu respondas al lia argumento x. 585 00:49:17,490 --> 00:49:25,840 Kaj tiel diru ĉefa okazas nomi trinkejo (100); 586 00:49:25,840 --> 00:49:30,050 Do x tuj komenciĝas kiel 100. 587 00:49:30,050 --> 00:49:35,660 Se la tradukilo agnoskas ke tiu estas vosto rekursie funkcio, 588 00:49:35,660 --> 00:49:38,540 tiam kiam trinkejo faras lia rekursia alvoko por la ekskludo, 589 00:49:38,540 --> 00:49:45,490 anstataŭ fari novan pilon kadro, kiu estas kie la pilo komencas kreski grandparte, 590 00:49:45,490 --> 00:49:48,220 eventuale ĝi kolizios la amaso kaj tiam vi havos segfaults 591 00:49:48,220 --> 00:49:51,590 ĉar memoro komencas karamboli. 592 00:49:51,590 --> 00:49:54,830 >> Do anstataŭ fari sian propran pilo kadro, ĝi povas realigi, 593 00:49:54,830 --> 00:49:59,080 hey, mi neniam vere bezonas reveni al ĉi tiu pilo kadro, 594 00:49:59,080 --> 00:50:08,040 do anstataŭ mi simple anstataŭigi tiun argumenton kun 99 kaj tiam komenci trinkejo ĉie. 595 00:50:08,040 --> 00:50:11,810 Kaj tiam ĝi faros denove kaj ĝin atingos reveno trinkejo (x - 1), 596 00:50:11,810 --> 00:50:17,320 kaj anstataŭ fari novan pilon kadro, ĝi estos simple anstataŭigi ĝia aktuala argumento kun 98 597 00:50:17,320 --> 00:50:20,740 kaj tiam salti reen al la komenco de trinkejo. 598 00:50:23,860 --> 00:50:30,430 Tiuj operacioj, anstataŭante ke 1 valoro sur la pilo kaj saltante al la komenco, 599 00:50:30,430 --> 00:50:32,430 estas sufiĉe efika. 600 00:50:32,430 --> 00:50:41,500 Do ne nur estas ĉi la sama memoro uzado kiel aparta funkcio kiu estas ripeta 601 00:50:41,500 --> 00:50:45,390 ĉar vi nur uzas 1 pilo kadro, sed vi ne suferas la downsides 602 00:50:45,390 --> 00:50:47,240 devi voki funkciojn. 603 00:50:47,240 --> 00:50:50,240 Nomante funkcioj povas esti iom multekosta ĉar ĝi devas vidi ĉion ĉi instalinstrukciojn 604 00:50:50,240 --> 00:50:52,470 kaj teardown kaj ĉiuj ĉi aferoj. 605 00:50:52,470 --> 00:50:58,160 Do tiu vosto rekursio estas bona. 606 00:50:58,160 --> 00:51:01,170 [Studento] Kial ne krei novan paŝoj? 607 00:51:01,170 --> 00:51:02,980 Ĉar ĝi realigas ĝin ne bezonas. 608 00:51:02,980 --> 00:51:07,800 La alvoko al stango ĝuste redoni la rekursiaj alvokon. 609 00:51:07,800 --> 00:51:12,220 Do ne bezonas fari ion kun la reveno valoro. 610 00:51:12,220 --> 00:51:15,120 Ĝi simple tuj tuj redoni ĝin. 611 00:51:15,120 --> 00:51:20,530 Do ĝi estas ĝuste tuj anstataŭos lian propran argumenton kaj komenci pli. 612 00:51:20,530 --> 00:51:25,780 Kaj ankaŭ, se vi ne havas la voston rekursie versio, 613 00:51:25,780 --> 00:51:31,460 tiam vi ricevis ĉi tiun tutan trinkejoj kie kiam ĉi tiu stango revenas 614 00:51:31,460 --> 00:51:36,010 ĝi devas reveni ĝia valoro por ĉi tiu, tiam tiu trinkejo tuj revenas 615 00:51:36,010 --> 00:51:39,620 kaj denove lian valoron al ĉi tiu, tiam ĝi estas ĝuste tuj tuj revenos 616 00:51:39,620 --> 00:51:41,350 kaj revenu ĝia valoro por ĉi tiu. 617 00:51:41,350 --> 00:51:45,350 Do vi ŝparas ĉi krevi ĉiuj tiuj aferoj ekstere de la stako 618 00:51:45,350 --> 00:51:48,730 ekde la reveno valoro nur tuj estos pasis tuta vojo reen ĝis ĉiuokaze. 619 00:51:48,730 --> 00:51:55,400 Do kial ne simple anstataŭi nian argumenton kun la ĝisdatigita argumento kaj komenci pli? 620 00:51:57,460 --> 00:52:01,150 Se la funkcio estas ne vosto rekursia, se vi faros ion kiel - 621 00:52:01,150 --> 00:52:07,530 [Studento] se trinkejo (x + 1). >> Jes. 622 00:52:07,530 --> 00:52:11,770 >> Do se vi metas ĝin en kondiĉo, tiam vi faras ion kun la reveno valoro. 623 00:52:11,770 --> 00:52:16,260 Aŭ eĉ se vi nur faru reveno 2 * trinkejo (x - 1). 624 00:52:16,260 --> 00:52:23,560 Do nun trinkejo (x - 1) bezonas reveni por ke ĝi kalkuli 2 fojoj tiun valoron, 625 00:52:23,560 --> 00:52:26,140 tial nun ĝi bezonas propran apartan pilo kadro, 626 00:52:26,140 --> 00:52:31,180 kaj nun, kiom ajn vi provos, vi tuj devas - 627 00:52:31,180 --> 00:52:34,410 Ĉi tio ne vosto rekursie. 628 00:52:34,410 --> 00:52:37,590 [Studento] Ĉu mi provos alporti rekursio noti por voston rekursio - 629 00:52:37,590 --> 00:52:41,450 [Bowden] En ideala mondo, sed en CS50 vi ne devas. 630 00:52:43,780 --> 00:52:49,280 Por akiri vosto rekursio, ĝenerale, oni starigis plia argumento 631 00:52:49,280 --> 00:52:53,550 kie trinkejo prenos int x en y 632 00:52:53,550 --> 00:52:56,990 kaj y respondas al la fina afero vi volas reveni. 633 00:52:56,990 --> 00:53:03,650 Tial ĉi vi tuj estos reveni trinkejo (x - 1), 2 * y. 634 00:53:03,650 --> 00:53:09,810 Por ke estas nur altnivela kiel vi transformos aĵoj esti vosto rekursie. 635 00:53:09,810 --> 00:53:13,790 Sed la ekstra argumento - 636 00:53:13,790 --> 00:53:17,410 Kaj poste en la fino, kiam vi atingos vian bazon kazo, kiun vi ĵus revenas y 637 00:53:17,410 --> 00:53:22,740 ĉar vi estas amasigi la tutan tempon la reveno valoro kiun vi volas. 638 00:53:22,740 --> 00:53:27,280 Vi ia estis fari ĝin ripete sed uzante rekursiaj vokoj. 639 00:53:32,510 --> 00:53:34,900 Demandoj? 640 00:53:34,900 --> 00:53:39,890 [Studento] Eble pri puntero aritmetiko, kiel uzinte kordoj. >> Certe. 641 00:53:39,890 --> 00:53:43,610 Pointer aritmetiko. 642 00:53:43,610 --> 00:53:48,440 Kiam uzanta kordoj estas facila ĉar kordoj estas char steloj, 643 00:53:48,440 --> 00:53:51,860 signoj estas ĉiam kaj ĉiam sola bajto, 644 00:53:51,860 --> 00:53:57,540 kaj tiel puntero aritmetiko estas ekvivalento al regula aritmetika kiam vi pritraktas kordoj. 645 00:53:57,540 --> 00:54:08,790 Ni nur diras char * s = "saluton". 646 00:54:08,790 --> 00:54:11,430 Do ni havas blokon en memoro. 647 00:54:19,490 --> 00:54:22,380 Ĝi bezonas 6 bitokoj ĉar vi ĉiam bezonas la nula finilo. 648 00:54:22,380 --> 00:54:28,620 Kaj char * s tuj indikas la komencon de ĉi tabelo. 649 00:54:28,620 --> 00:54:32,830 Do s notas tie. 650 00:54:32,830 --> 00:54:36,710 Nu, temas esence kiel ajna tabelo funkcias, 651 00:54:36,710 --> 00:54:40,780 sendepende de ĉu ĝi estas lia reveno de malloc aŭ ĉu ĝi estas je la stako. 652 00:54:40,780 --> 00:54:47,110 Ajna tabelo estas esence sagon al la komenco de la tabelo, 653 00:54:47,110 --> 00:54:53,640 kaj tiam ajna aro operacio, ajna indeksado, estas ĝuste tuj en tiun tabelo certa kompensi. 654 00:54:53,640 --> 00:55:05,360 >> Do kiam mi diras ion kiel s [3]; ĉi tuj al s kaj rakontante 3 signoj in 655 00:55:05,360 --> 00:55:12,490 Do s [3], ni havi 0, 1, 2, 3, do s [3] tuj raporti al ĉi l. 656 00:55:12,490 --> 00:55:20,460 [Studento] Kaj ni povis atingi la saman valoron farante s + 3 kaj tiam krampoj stelo? 657 00:55:20,460 --> 00:55:22,570 Jes. 658 00:55:22,570 --> 00:55:26,010 Tio estas ekvivalento al * (s + 3); 659 00:55:26,010 --> 00:55:31,240 kaj tio estas por ĉiam kaj ĉiam ekvivalento negrave kion vi faros. 660 00:55:31,240 --> 00:55:34,070 Vi neniam devas uzi la krampo sintakso. 661 00:55:34,070 --> 00:55:37,770 Vi povas ĉiam uzi la * (s + 3) sintakson. 662 00:55:37,770 --> 00:55:40,180 Homoj emas ŝatas la krampo sintakso, though. 663 00:55:40,180 --> 00:55:43,860 [Studento] Tial cxiuj tabeloj estas fakte nur punteros. 664 00:55:43,860 --> 00:55:53,630 Estas eta distingo kiam mi diras int x [4]; >> [studento] Does kiuj kreas la memoro? 665 00:55:53,630 --> 00:56:03,320 [Bowden] Tio tuj krei 4 ints sur la pilo, do 16 bitokoj entute. 666 00:56:03,320 --> 00:56:05,700 Ĝi okazas por krei 16 bitokoj sur la stako. 667 00:56:05,700 --> 00:56:09,190 x estas ne stokas ie ajn. 668 00:56:09,190 --> 00:56:13,420 Ĝi estas nur simbolo raportante al la komenco de la afero. 669 00:56:13,420 --> 00:56:17,680 Ĉar vi deklaris la tabelo ene de ĉi tiu funkcio, 670 00:56:17,680 --> 00:56:22,340 kion la tradukilo tuj fari estas simple anstataŭu ĉiujn aperojn de la variablo x 671 00:56:22,340 --> 00:56:26,400 kun kie okazis elekti meti tiujn 16 bajtoj. 672 00:56:26,400 --> 00:56:30,040 Ĝi ne povas fari tion kun char * s ĉar s estas reala puntero. 673 00:56:30,040 --> 00:56:32,380 Ĝi estas libera de tiam indikas aliajn aĵojn. 674 00:56:32,380 --> 00:56:36,140 x estas konstanto. Vi ne povas havi ĝin punkto al alia tabelo. >> [Studento] Okay. 675 00:56:36,140 --> 00:56:43,420 Sed ĉi tiu ideo, tiu indeksado, estas la sama sendistinge de ĉu ĝi estas tradicia tabelo 676 00:56:43,420 --> 00:56:48,230 aŭ se temas pri puntero al iu aŭ se ĝi estas puntero al malloced tabelo. 677 00:56:48,230 --> 00:56:59,770 Kaj fakte, ĝi estas tiel ekvivalenta ke tiu estas ankaŭ la sama afero. 678 00:56:59,770 --> 00:57:05,440 Ĝi fakte nur tradukas kio estas ene de la krampoj kaj kio restas de la krampoj, 679 00:57:05,440 --> 00:57:07,970 aldonas ilin kune, kaj dereferences. 680 00:57:07,970 --> 00:57:14,710 Do tiu estas same valida kiel * (s + 3) aŭ s [3]. 681 00:57:16,210 --> 00:57:22,090 [Studento] Ĉu vi povas havi punteros indikante 2-dimensia tabeloj? 682 00:57:22,090 --> 00:57:27,380 >> Estas pli malfacile. Tradicie, ne. 683 00:57:27,380 --> 00:57:34,720 2-dimensia tabelo estas nur 1-dimensia tabelo kun iu konvena sintakso 684 00:57:34,720 --> 00:57:54,110 ĉar kiam mi diras int x [3] [3], ĉi tiu estas vere nur 1 tabelo kun 9 valoroj. 685 00:57:55,500 --> 00:58:03,000 Kaj tiel, kiam mi indico, la tradukilo scias, kion mi volas diri. 686 00:58:03,000 --> 00:58:13,090 Se mi diras x [1] [2], scias mi volas iri al la dua vico, do tuj salti la unuaj 3, 687 00:58:13,090 --> 00:58:17,460 kaj tiam ŝi volas la dua afero en tio, kio ĝi estas tuj akiri ĉi tiun. 688 00:58:17,460 --> 00:58:20,480 Sed estas ankoraŭ nur unu-dimensia tabelo. 689 00:58:20,480 --> 00:58:23,660 Kaj tial, se mi volis atribui puntero al tiu tabelo, 690 00:58:23,660 --> 00:58:29,770 Mi dirus int * p = x; 691 00:58:29,770 --> 00:58:33,220 La tipo de x estas simple - 692 00:58:33,220 --> 00:58:38,280 Estas kruda dirante tipo de x ekde ĝi estas nur simbolo kaj ne reala variablo, 693 00:58:38,280 --> 00:58:40,140 sed estas nur int *. 694 00:58:40,140 --> 00:58:44,840 x estas simple sagon al la komenco de ĉi. >> [Studento] Okay. 695 00:58:44,840 --> 00:58:52,560 Kaj do mi ne povos aliri [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Mi opinias, ke estas speciala sintakso por deklari pointer, 697 00:58:58,370 --> 00:59:12,480 io ridinda kiel int (* p [- io absolute ridinda. mi eĉ ne scias. 698 00:59:12,480 --> 00:59:17,090 Sed estas sintakson por deklari punteros kiel kun parentezoj kaj aĵoj. 699 00:59:17,090 --> 00:59:22,960 Eble eĉ ne lasu vin fari tion. 700 00:59:22,960 --> 00:59:26,640 Mi povus retrorigardas al iu kiu dirus al mi la veron. 701 00:59:26,640 --> 00:59:34,160 Mi serĉos ĝin poste, se estas sintakson por punkto. Sed vi neniam vidas. 702 00:59:34,160 --> 00:59:39,670 Kaj eĉ la sintakso estas tiel arkaikajn ke se vi uzas gxin, homoj estos barita. 703 00:59:39,670 --> 00:59:43,540 Multdimensia tabeloj estas sufiĉe malofta kiel estas. 704 00:59:43,540 --> 00:59:44,630 Vi preskaux - 705 00:59:44,630 --> 00:59:48,490 Nu, se vi faras matrico aĵoj ĝi ne tuj estos maloftaj, 706 00:59:48,490 --> 00:59:56,730 sed en C vi malofte tuj estos uzante multdimensia tabeloj. 707 00:59:57,630 --> 01:00:00,470 Yeah. >> [Studento] Imagu ke vi havas vere longan tabelo. 708 01:00:00,470 --> 01:00:03,900 >> Do en virtuala memoro ĝi ŝajnus esti ĉiuj sinsekvaj, 709 01:00:03,900 --> 01:00:05,640 kiel la elementoj dekstra flanko de la alia, 710 01:00:05,640 --> 01:00:08,770 sed en la fizika memoro, ĉu eblus por esti fendi supren? >> Jes. 711 01:00:08,770 --> 01:00:16,860 Kiom virtuala memoro verkoj estas nur disigas - 712 01:00:19,220 --> 01:00:24,860 La unueco de atribuo estas iu paĝo, kiu inklinas esti 4 kilobajtoj, 713 01:00:24,860 --> 01:00:29,680 kaj tiel kiam procezo diras, hey, mi volas uzi tiun memoron, 714 01:00:29,680 --> 01:00:35,970 la mastruma sistemo tuj destini ĝin 4 kilobajtoj por ke iom bloko de memoro. 715 01:00:35,970 --> 01:00:39,100 Eĉ se vi uzas nur solan malgrandan bajto en la tuta bloko de memoro, 716 01:00:39,100 --> 01:00:42,850 la mastruma sistemo tuj donos al ĝi la plenan 4 kilobajtoj. 717 01:00:42,850 --> 01:00:49,410 Do kion tio signifas estas mi povus havi - diru ĉi estas mia pilo. 718 01:00:49,410 --> 01:00:53,180 Tiu stako povus esti apartigita. Mia stako eblis megabajtoj kaj megabajtoj. 719 01:00:53,180 --> 01:00:55,020 Mia stako povus esti grandega. 720 01:00:55,020 --> 01:01:00,220 Sed la pilo mem devas esti dividita en individuaj paĝoj, 721 01:01:00,220 --> 01:01:09,010 kio se ni rigardas pli tie diru ĉi estas nia memoro RAM, 722 01:01:09,010 --> 01:01:16,600 se mi havas 2 gigabajtoj de RAM, ĉi tiu estas reala adreso 0 kiel la nula bajto de mia memoro RAM, 723 01:01:16,600 --> 01:01:22,210 kaj ĉi tiu estas 2 gigabajtoj tuta vojo cxi tie. 724 01:01:22,210 --> 01:01:27,230 Do tiu ĉi paĝo povus respondi al ĉi tiu bloko super tie. 725 01:01:27,230 --> 01:01:29,400 Ĉi tiu paĝo eble respondas al ĉi tiu bloko super tie. 726 01:01:29,400 --> 01:01:31,560 Ĉi tiu povus respondi al ĉi tiu super tie. 727 01:01:31,560 --> 01:01:35,540 Do la mastruma sistemo estas libera atribui fizika memoro 728 01:01:35,540 --> 01:01:39,320 al ajna individua paĝo arbitre. 729 01:01:39,320 --> 01:01:46,180 Kaj tio signifas ke se tiu limo pasas al straddle tabelo, 730 01:01:46,180 --> 01:01:50,070 tabelo okazas resti ĉi tio kaj ĝuste de ĉi tiu ordono de artikolo, 731 01:01:50,070 --> 01:01:54,460 tiam tiu tabelo tuj estos dividitaj en fizika memoro. 732 01:01:54,460 --> 01:01:59,280 Kaj poste, kiam vi forlasis la programon, kiam la procezo finiĝas, 733 01:01:59,280 --> 01:02:05,690 tiuj surĵetoj get viŝita kaj tiam ĝi estas libera por uzi ĉi tiuj malgranduloj blokoj por aliaj aĵoj. 734 01:02:14,730 --> 01:02:17,410 Pli demandoj? 735 01:02:17,410 --> 01:02:19,960 [Studento] La puntero aritmetiko. >> Oh yeah. 736 01:02:19,960 --> 01:02:28,410 Kordoj estis pli facilaj, sed rigardante iun kiel ints, 737 01:02:28,410 --> 01:02:35,000 do reen al int x [4]; 738 01:02:35,000 --> 01:02:41,810 Ĉu ĉi tiu estas tabelo aŭ ĉu ĝi estas puntero al malloced tabelo de 4 entjeroj, 739 01:02:41,810 --> 01:02:47,060 ĝi estas tuj estos traktita la sama maniero. 740 01:02:50,590 --> 01:02:53,340 [Studento] Do tabeloj estas sur la havaĵon? 741 01:03:01,400 --> 01:03:05,270 [Bowden] Arrays estas ne sur la monteto. >> [Studento] Oh. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] Ĉi tiu tipo de tabelo inklinas esti sur la stako 743 01:03:08,320 --> 01:03:12,220 se vi ne deklaris ĝin - ignorante tutmonda variabloj. Ne uzu tutmonda variabloj. 744 01:03:12,220 --> 01:03:16,280 Ene de funkcio mi diras int x [4]; 745 01:03:16,280 --> 01:03:22,520 Ĝi okazas krei 4-entjero bloko en la pilo por ĉi tabelo. 746 01:03:22,520 --> 01:03:26,960 Sed ĉi malloc (4 * sizeof (int)); tuj iros sur la monteto. 747 01:03:26,960 --> 01:03:31,870 Sed post tiu punkto mi povas uzi x kaj p en preskaux la sama vojoj, 748 01:03:31,870 --> 01:03:36,140 krom la esceptoj mi diris antaŭe pri vi povos reassign p. 749 01:03:36,140 --> 01:03:40,960 Teknike, iliaj grandecoj estas tiel malsama, sed tio estas tute pala. 750 01:03:40,960 --> 01:03:43,310 Vi neniam vere uzas siajn grandecoj. 751 01:03:48,020 --> 01:03:56,810 La p mi povus diri p [3] = 2, aŭ x [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Vi povas uzi ilin en ĝuste la sama maniero. 753 01:03:59,680 --> 01:04:01,570 Do puntero aritmetiko nun - Jes. 754 01:04:01,570 --> 01:04:07,390 [Studento] Cxu vi ne devas fari p * se vi havas la krampoj? 755 01:04:07,390 --> 01:04:11,720 La krampoj estas implica dereference. >> Bone. 756 01:04:11,720 --> 01:04:20,200 Fakte, ankaŭ kion vi diris per la povas vin preni multdimensia arrays 757 01:04:20,200 --> 01:05:02,650 kun indikoj, kion vi povas fari estas io kiel, diru, int ** pp = malloc (sizeof (int *) * 5); 758 01:05:02,650 --> 01:05:06,900 Mi nur skribas ĉion el unua. 759 01:05:37,880 --> 01:05:41,020 Mi ne volis ke oni. 760 01:05:41,020 --> 01:05:42,550 Okay. 761 01:05:42,550 --> 01:05:48,910 Kion mi faris tie estas - Tio devus esti pp [i]. 762 01:05:48,910 --> 01:05:53,680 Do pp estas puntero al puntero. 763 01:05:53,680 --> 01:06:02,420 Vi mallocing pp atentigi al tabelo de 5 int steloj. 764 01:06:02,420 --> 01:06:10,950 Do en memoro vi havas sur la stako pp 765 01:06:10,950 --> 01:06:20,150 Ĝi tuj indikas tabelo de 5 blokoj, kiuj estas ĉiuj sin punteros. 766 01:06:20,150 --> 01:06:28,210 Kaj poste, kiam mi malloc cxi tie, mi malloc ke ĉiu de tiuj individuaj punteros 767 01:06:28,210 --> 01:06:32,080 devus celi apartan blokon de 4 bitokoj sur la monteto. 768 01:06:32,080 --> 01:06:35,870 Do ĉi punktojn al 4 bitokoj. 769 01:06:37,940 --> 01:06:40,660 Kaj ĉi tiu punktoj al malsama 4 bitokoj. 770 01:06:40,660 --> 01:06:43,200 >> Kaj ĉiuj ili notas al siaj propraj 4 bitokoj. 771 01:06:43,200 --> 01:06:49,080 Tio donas al mi maniero fari multdimensia aĵoj. 772 01:06:49,080 --> 01:06:58,030 Mi povus diri pp [3] [4], sed nun tio ne estas la sama afero kiel matricoj multidimensionales 773 01:06:58,030 --> 01:07:05,390 ĉar multdimensia arrays tradukis [3] [4] en sola ofseto en la x tabelo. 774 01:07:05,390 --> 01:07:14,790 Ĉi dereferences p, aliroj la tria indekso, tiam dereferences ke 775 01:07:14,790 --> 01:07:20,790 kaj aliroj - 4 estus nevalida - la dua indico. 776 01:07:24,770 --> 01:07:31,430 Dum kiam ni havis la int x [3] [4] antaux kiel multdimensia tabelo 777 01:07:31,430 --> 01:07:35,740 kaj kiam vi duoble krampo estas vere nur sola dereference, 778 01:07:35,740 --> 01:07:40,490 vi sekvas sola puntero kaj poste kompensi, 779 01:07:40,490 --> 01:07:42,850 ĉi tio estas vere 2D referencoj. 780 01:07:42,850 --> 01:07:45,840 Vi sekvu 2 apartajn punteros. 781 01:07:45,840 --> 01:07:50,420 Do ĉi tiu ankaŭ teknike permesas havi multdimensia arrays 782 01:07:50,420 --> 01:07:53,550 kie ĉiu individuo tabelo estas malsamaj grandecoj. 783 01:07:53,550 --> 01:07:58,000 Do mi pensas pintaj multdimensia tabeloj estas kio ĝi estas nomata 784 01:07:58,000 --> 01:08:01,870 ekde vere la unua kiu povus noti al iu kiu havas 10 elementoj, 785 01:08:01,870 --> 01:08:05,540 la dua afero povus noti al iu kiu havas 100 eroj. 786 01:08:05,540 --> 01:08:10,790 [Studento] Ĉu estas limo al la nombro de punteros vi povas havi 787 01:08:10,790 --> 01:08:14,290 montrante al aliaj indikoj? >> No 788 01:08:14,290 --> 01:08:17,010 Vi povas havi int ***** p. 789 01:08:18,050 --> 01:08:23,760 Reen al puntero aritmetiko - >> [studento] Oh. >> Jes. 790 01:08:23,760 --> 01:08:35,649 [Studento] Se mi havas int *** p kaj tiam mi fari dereferencing kaj mi diras p * estas egala al tiu valoro, 791 01:08:35,649 --> 01:08:39,560 Estas nur faros 1 nivelo de dereferencing? >> Jes. 792 01:08:39,560 --> 01:08:43,340 Do se mi volas aliri la aferon ke la lasta puntero notas en - 793 01:08:43,340 --> 01:08:46,210 Tiam vi faras *** p. >> Bone. 794 01:08:46,210 --> 01:08:54,080 Do tiu estas p poentojn al 1 bloko, punktoj al alia bloko, punktoj al alia bloko. 795 01:08:54,080 --> 01:09:02,010 Tiam se vi faras * p = io, tiam vi ŝanĝi ĉi 796 01:09:02,010 --> 01:09:13,640 nun notas al malsama bloko. >> Bone. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] Kaj se tiuj estis malloced, tiam vi nun filtris memoro 798 01:09:17,649 --> 01:09:20,430 se vi hazarde havas malsamajn referencoj de tiuj 799 01:09:20,430 --> 01:09:25,270 ĉar vi ne povas reiri al tiuj kiuj vi ĵus forĵetis. 800 01:09:25,270 --> 01:09:29,550 Pointer aritmetiko. 801 01:09:29,550 --> 01:09:36,310 int x [4]; tuj destini tabelo de 4 entjeroj 802 01:09:36,310 --> 01:09:40,670 kie x iras rekte al la komenco de la tabelo. 803 01:09:40,670 --> 01:09:50,420 Do kiam mi diras ion kiel x [1], mi volas ke ĝi signifas iri al la dua entjera en la tabelo, 804 01:09:50,420 --> 01:09:53,319 kiu estus tiu ĉi. 805 01:09:53,319 --> 01:10:04,190 Sed vere, jen 4 bajtoj en la tabelo ekde ĉi entjero okupas 4 bitokoj. 806 01:10:04,190 --> 01:10:08,470 Do oni kompensas el 1 vere signifas kompensi el 1 807 01:10:08,470 --> 01:10:12,030 fojoj la grandeco de kiom la tipo de la tabelo estas. 808 01:10:12,030 --> 01:10:17,170 Jen tabelo de entjeroj, do scias fari 1 fojoj grandeco de int kiam volas kompensi. 809 01:10:17,170 --> 01:10:25,260 La alia sintakso. Memoru ke ĉi tio estas ekvivalento al * (x + 1); 810 01:10:25,260 --> 01:10:35,250 Kiam mi diras puntero + 1, kion tiu revenas estas la adreso, ke la montrilo estas stokante 811 01:10:35,250 --> 01:10:40,360 plus 1 fojoj la grandeco de la tipo de la puntero. 812 01:10:40,360 --> 01:10:59,510 Do se x = ox100, tiam x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 Kaj vi povas trouzi tion kaj diri iun kiel char * c = (char *) x; 814 01:11:19,750 --> 01:11:23,050 kaj nun c tuj estos la sama adreso kiel x. 815 01:11:23,050 --> 01:11:26,040 c tuj estos egala al ox100, 816 01:11:26,040 --> 01:11:31,490 sed c + 1 tuj estos egala al ox101 817 01:11:31,490 --> 01:11:38,030 ekde puntero aritmetiko dependas de la tipo de la puntero ke vi aldonante. 818 01:11:38,030 --> 01:11:45,390 Do c + 1, ĝi rigardas c, estas char pointer, do tuj aldoni 1 fojoj grandeco de char, 819 01:11:45,390 --> 01:11:48,110 kiu ĉiam iras al esti 1, do vi ricevis 101, 820 01:11:48,110 --> 01:11:54,890 dum se mi faras x, kiu estas ankaŭ ankoraŭ 100, x + 1 tuj estos 104. 821 01:11:56,660 --> 01:12:06,340 [Studento] Ĉu vi povas uzi c + + por antaŭi vian puntero de 1? 822 01:12:06,340 --> 01:12:09,810 Jes, vi povas. 823 01:12:09,810 --> 01:12:16,180 Vi ne povas fari tion kun x ĉar x estas nur simbolo, estas konstanta; vi ne povas ŝanĝi x. 824 01:12:16,180 --> 01:12:22,610 >> Sed c okazas nur esti puntero, do c + + estas perfekte valida kaj ĝi estos pliigo de 1. 825 01:12:22,610 --> 01:12:32,440 Se c estis nur int *, tiam c + + estus 104. 826 01:12:32,440 --> 01:12:41,250 + + Does puntero aritmetiko kiel c + 1 estus farinta puntero aritmetiko. 827 01:12:43,000 --> 01:12:48,870 Tiu estas fakte kiel multajn aferojn kiel merge speco - 828 01:12:49,670 --> 01:12:55,710 Anstataŭ krei kopiojn de aferoj, vi povos anstataŭ pasi - 829 01:12:55,710 --> 01:13:02,400 Kiel se mi volis pasi tiun duono de la tabelo - Ni viŝi iuj de ĉi. 830 01:13:04,770 --> 01:13:10,520 Diru Mi volis pasi ĉi tiu flanko de la tabelo en funkcio. 831 01:13:10,520 --> 01:13:12,700 Kion mi parolu pri tiu funkcio? 832 01:13:12,700 --> 01:13:17,050 Se mi pasi x, mi pasante ĉi tiu adreso. 833 01:13:17,050 --> 01:13:23,780 Sed mi volas pasi ĉi aparta adreso. Do kion mi devas pasi? 834 01:13:23,780 --> 01:13:26,590 [Studento] Pointer + 2? 835 01:13:26,590 --> 01:13:29,350 [Bowden] Do x + 2. Jes. 836 01:13:29,350 --> 01:13:31,620 Tio tuj estos ĉi tiu adreso. 837 01:13:31,620 --> 01:13:42,810 Vi ankaŭ tre ofte vidas kiel x [2] kaj tiam la adreso de tiu. 838 01:13:42,810 --> 01:13:47,850 Do vi bezonas preni la adreson de ĝi ĉar la krampo estas implica dereference. 839 01:13:47,850 --> 01:13:53,250 x [2] indikas la valoron, kiu estas en ĉi tiu skatolo, kaj tiam vi volas ke la adreso de tiu skatolo, 840 01:13:53,250 --> 01:13:56,850 tial vi diras & x [2]. 841 01:13:56,850 --> 01:14:02,880 Do jen kiel io en merge speco kie vi volas pasi duono la listo al iu 842 01:14:02,880 --> 01:14:08,790 vi vere nur pasi & x [2], kaj nun ĝis la rekursia alvoko raportas, 843 01:14:08,790 --> 01:14:12,510 mia nova tabelo komenciĝas tie. 844 01:14:12,510 --> 01:14:15,130 Lasta minuto demandoj. 845 01:14:15,130 --> 01:14:20,050 [Studento] Se ni ne enmetu signo aŭ - kio estas tio nomita? >> Stelo? 846 01:14:20,050 --> 01:14:23,200 [Studento] Stelo. >> Teknike, dereference operatoro, sed - >> [studento] Dereference. 847 01:14:23,200 --> 01:14:29,310 >> Se ni ne metas stelo aŭ signo, kio okazas se mi simple dirus y = x kaj x estas puntero? 848 01:14:29,310 --> 01:14:34,620 Kio estas la tipo de y? >> [Studento] Mi nur diru ke estas puntero 2. 849 01:14:34,620 --> 01:14:38,270 Do, se vi simple diru y = x, nun x kaj y punkton al la sama afero. >> [Studento] Punkto al la sama afero. 850 01:14:38,270 --> 01:14:45,180 Kaj se x estas int puntero? >> Estus plendas ĉar oni ne povas atribui punteros. 851 01:14:45,180 --> 01:14:46,540 [Studento] Okay. 852 01:14:46,540 --> 01:14:51,860 Memoru ke punteros, kvankam ni desegni ilin kiel sagoj, 853 01:14:51,860 --> 01:15:02,010 vere cxiuj vendejo - int * x - vere ĉiuj x estas stokante estas io kiel ox100, 854 01:15:02,010 --> 01:15:06,490 kiuj ni okazi por reprezenti kiel indikante la bloko stokitaj en 100. 855 01:15:06,490 --> 01:15:19,660 Do kiam mi diras int * y = x; Mi simple kopiado ox100 en y, 856 01:15:19,660 --> 01:15:24,630 kiuj ni estas ĝuste tuj reprezentos kiel y, ankaŭ indikante ox100. 857 01:15:24,630 --> 01:15:39,810 Kaj se mi diras int i = (int) x, tiam i tuj stoki ajn la valoro de ox100 estas 858 01:15:39,810 --> 01:15:45,100 interne de ĝi, sed nun tuj esti interpretita kiel entjero anstataŭ puntero. 859 01:15:45,100 --> 01:15:49,310 Sed vi bezonas la dividon alie ĝi plendas. 860 01:15:49,310 --> 01:15:53,300 [Studento] Do vi volas diri, ke ili elpelu - 861 01:15:53,300 --> 01:16:00,290 Ĉu tuj estos malpleniginta int de x aŭ casting int de y? 862 01:16:00,290 --> 01:16:03,700 [Bowden] Kio? 863 01:16:03,700 --> 01:16:07,690 [Studento] Okay. Post tiuj parentezoj estas tie tuj estos x aŭ ay tie? 864 01:16:07,690 --> 01:16:11,500 >> [Bowden] Aŭ. x kaj y estas ekvivalentaj. >> [Studento] Okay. 865 01:16:11,500 --> 01:16:14,390 Ĉar ili estas ambaŭ punteros. >> Jes. 866 01:16:14,390 --> 01:16:21,050 [Studento] Do devus stoki la deksesuma 100 en entjera formo? >> [Bowden] Yeah. 867 01:16:21,050 --> 01:16:23,620 Sed ne la valoron de ĉiu kiu notas al. 868 01:16:23,620 --> 01:16:29,940 [Bowden] Yeah. >> [Studento] Do nur la adreson en entjera formo. Okay. 869 01:16:29,940 --> 01:16:34,720 [Bowden] Se vi volas por iu stranga kialo, 870 01:16:34,720 --> 01:16:38,900 vi povus ekskluzive trakti punteros kaj neniam pritrakti entjeroj 871 01:16:38,900 --> 01:16:49,240 kaj nur estu kiel int * x = 0. 872 01:16:49,240 --> 01:16:53,000 Tiam vi tuj get vere konfuzita unufoje puntero aritmetiko startas okazas. 873 01:16:53,000 --> 01:16:56,570 Do la nombro ke ili stokas estas sensignifa. 874 01:16:56,570 --> 01:16:58,940 Estas nur ke vi finos interpreti ilin. 875 01:16:58,940 --> 01:17:02,920 Do mi estas libera por kopii ox100 el int * al int, 876 01:17:02,920 --> 01:17:07,790 kaj mi rajtas asigni - you're probable tuj get kriis al por ne jxetantajn - 877 01:17:07,790 --> 01:17:18,160 Mi estas libera atribui iun kiel (int *) ox1234 en tiun arbitran int *. 878 01:17:18,160 --> 01:17:25,480 Do ox123 estas same valida memoro adreso kiel estas & y. 879 01:17:25,480 --> 01:17:32,060 & Y okazas reveni iu kiu estas preskaux ox123. 880 01:17:32,060 --> 01:17:35,430 [Studento] Ĉu tiu esti vere malvarmeta vojo iri de deksesuma al decimala formo, 881 01:17:35,430 --> 01:17:39,230 kiel se vi havas puntero kaj ĵetas ĝin kiel int? 882 01:17:39,230 --> 01:17:44,860 [Bowden] Vi povas vere nur presi uzante kiel printf. 883 01:17:44,860 --> 01:17:50,300 Diru Mi havas int y = 100. 884 01:17:50,300 --> 01:18:02,700 Do printf (% d \ n - kiel vi devus jam scii - presi ke kiel entjero,% x. 885 01:18:02,700 --> 01:18:05,190 Ni simple presas ĝin kiel deksesuma. 886 01:18:05,190 --> 01:18:10,760 Do puntero ne stokas kiel deksesuma, 887 01:18:10,760 --> 01:18:12,960 kaj entjero ne stokas kiel decimala. 888 01:18:12,960 --> 01:18:14,700 Ĉio estas stokita kiel duuma. 889 01:18:14,700 --> 01:18:17,950 Estas nur ke ni emas montri punteros kiel deksesuma 890 01:18:17,950 --> 01:18:23,260 ĉar ni pensu pri tio en tiuj 4-bajto blokoj, 891 01:18:23,260 --> 01:18:25,390 kaj memoro adresoj inklinas esti familiara. 892 01:18:25,390 --> 01:18:28,890 Ni ŝatas, se ĝi komenciĝas per bf, tiam okazas al esti sur la stako. 893 01:18:28,890 --> 01:18:35,560 Do estas nur nia interpreto de punteros kiel deksesuma. 894 01:18:35,560 --> 01:18:39,200 Okay. Ajna lastaj demandoj? 895 01:18:39,200 --> 01:18:41,700 >> Mi estos tie por iom post se vi havas ion alian. 896 01:18:41,700 --> 01:18:46,070 Kaj tio estas la fino de tiu. 897 01:18:46,070 --> 01:18:48,360 >> [Studento] Yay! [Aplaŭdo] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]