1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [Одељак 4 - Више Удобан] 2 00:00:02,520 --> 00:00:04,850 [Роб Бовден - Универзитет Харвард] 3 00:00:04,850 --> 00:00:07,370 [Ово је ЦС50. - ЦС50.ТВ] 4 00:00:08,920 --> 00:00:13,350 Имамо квиз сутра, у случају ви не знате. 5 00:00:14,810 --> 00:00:20,970 То је у суштини о свему што је могао да види у класи, или би требало да се види у класи. 6 00:00:20,970 --> 00:00:26,360 То укључује показиваче, иако су врло недавно тема. 7 00:00:26,360 --> 00:00:29,860 Требало би барем разуме висок ниво њих. 8 00:00:29,860 --> 00:00:34,760 Све што је отишао преко у класи треба разумети на квизу. 9 00:00:34,760 --> 00:00:37,320 Дакле, ако имате питања о њима, можете их питати сада. 10 00:00:37,320 --> 00:00:43,280 Али ово ће бити веома ученик предводи седница где ви постављате питања, 11 00:00:43,280 --> 00:00:45,060 па надамо људи имају питања. 12 00:00:45,060 --> 00:00:48,020 Да ли неко има питања? 13 00:00:49,770 --> 00:00:52,090 Да. >> [Ученик] Да ли иду преко показивача поново? 14 00:00:52,090 --> 00:00:54,350 Ја ћу ићи преко показивача. 15 00:00:54,350 --> 00:00:59,180 Сви ваши варијабли нужно живи у меморији, 16 00:00:59,180 --> 00:01:04,450 али обично не брини о томе, а ви само да кажем к + 2 и и + 3 17 00:01:04,450 --> 00:01:07,080 и компајлер ће схватити где су ствари живе за вас. 18 00:01:07,080 --> 00:01:12,990 Када имате посла са показивачима, сада експлицитно користите те меморијске адресе. 19 00:01:12,990 --> 00:01:19,800 Дакле, једна променљива ће икада живети на једној адреси у сваком датом тренутку. 20 00:01:19,800 --> 00:01:24,040 Ако желимо да прогласи показивача, што је тип ће изгледати? 21 00:01:24,040 --> 00:01:26,210 >> Желим да прогласи п показивач. Шта тип изгледа? 22 00:01:26,210 --> 00:01:33,530 [Ученик] инт * п. >> Да. Дакле, инт * п. 23 00:01:33,530 --> 00:01:38,030 И како ја да га истакнем на к? >> [Ученик] Амперсанд. 24 00:01:40,540 --> 00:01:45,300 [Бовден] Дакле амперсанд дословно назива адреса оператера. 25 00:01:45,300 --> 00:01:50,460 Дакле, када кажем & к то је добијање меморијску адресу променљиве к. 26 00:01:50,460 --> 00:01:56,790 Тако да сада имам показивач п, и свуда у мом коду могу користити * П 27 00:01:56,790 --> 00:02:02,960 или могу користити к и то ће бити потпуно исти ствар. 28 00:02:02,960 --> 00:02:09,520 (* П). Шта је ово радиш? Шта то значи звезда? 29 00:02:09,520 --> 00:02:13,120 [Ученик] То значи вредност у том тренутку. >> Да. 30 00:02:13,120 --> 00:02:17,590 Дакле, ако гледамо на то, може бити веома корисно да извуче дијаграме 31 00:02:17,590 --> 00:02:22,230 где је то кутијица меморије за к, која се дешава да имају вредност 4, 32 00:02:22,230 --> 00:02:25,980 онда имамо малу кутију меморије за п, 33 00:02:25,980 --> 00:02:31,590 па п указује на к, па скрећемо стрелицу са стр до к. 34 00:02:31,590 --> 00:02:40,270 Дакле, када кажемо * п говоримо ићи на поље које је п. 35 00:02:40,270 --> 00:02:46,480 Звезда је пратите стрелицу и онда да шта год хоћеш са том пољу тамо. 36 00:02:46,480 --> 00:03:01,090 Тако да могу да кажем * п = 7, и да ће ићи на поље које је к и промене које до 7 година. 37 00:03:01,090 --> 00:03:13,540 Или бих могао да кажем инт з = * п * 2; То је збуњујуће, јер то је звезда, звезда. 38 00:03:13,540 --> 00:03:19,230 Онај звезда дереференцинг п, друга звезда множиш 2. 39 00:03:19,230 --> 00:03:26,780 Обавештење Могао сам исто тако добро заменио * п са к. 40 00:03:26,780 --> 00:03:29,430 Можете их користити на исти начин. 41 00:03:29,430 --> 00:03:38,000 А онда касније могу имати п тачку на потпуно нову ствар. 42 00:03:38,000 --> 00:03:42,190 Ја само могу да кажем п = &з; 43 00:03:42,190 --> 00:03:44,940 Дакле, сада више не п поена на Кс, то указује на з. 44 00:03:44,940 --> 00:03:50,510 И сваки пут ја * П то је исто као ради з. 45 00:03:50,510 --> 00:03:56,170 Дакле, корисна ствар је када почнемо улазим функција. 46 00:03:56,170 --> 00:03:59,790 >> То је врста бескористан прогласи показивач који указује на нешто 47 00:03:59,790 --> 00:04:03,140 и онда ти само то дереференцинг 48 00:04:03,140 --> 00:04:06,060 када би сте користили оригиналну променљиву за почетак. 49 00:04:06,060 --> 00:04:18,190 Али када уђете у функцијама - па хајде да кажемо да имамо неку функцију, инт фоо, 50 00:04:18,190 --> 00:04:32,810 који узима показивач и само ради * п = 6; 51 00:04:32,810 --> 00:04:39,990 Као што смо видели раније са заменом, не можете да урадите ефикасну размену и посебан функцију 52 00:04:39,990 --> 00:04:45,180 за само доношењем бројеве, јер је све у Ц увек пролази по вредности. 53 00:04:45,180 --> 00:04:48,360 Чак и када сте пролазу тројке сте пролазили вредности. 54 00:04:48,360 --> 00:04:51,940 Тако се дешава да управо те вредности су меморијске адресе. 55 00:04:51,940 --> 00:05:00,770 Дакле, када кажем трла (п) ја положеног показивач на функцију фоо 56 00:05:00,770 --> 00:05:03,910 и онда трла ради * п = 6; 57 00:05:03,910 --> 00:05:08,600 Дакле, унутар те функције, * п је увек једнак к, 58 00:05:08,600 --> 00:05:12,720 али ја не могу да користе к унутар те функције, јер није сцопед у тој функцији. 59 00:05:12,720 --> 00:05:19,510 Дакле, * п = 6 је једини начин да се приступи локалну променљиву из друге функције. 60 00:05:19,510 --> 00:05:23,600 Или, добро, показивачи су једини начин да се приступи локалну променљиву из друге функције. 61 00:05:23,600 --> 00:05:31,600 [Ученик] Хајде да кажемо да је желео да врати показивач. Како тачно то радиш? 62 00:05:31,600 --> 00:05:44,270 [Бовден] Повратак показивач као у нешто попут инт и = 3; повратак & и? >> [Ученик] Да. 63 00:05:44,270 --> 00:05:48,480 [Боуден] Ок. Никада не треба да урадите ово. Ово је лоше. 64 00:05:48,480 --> 00:05:59,480 Мислим да сам видео у овим предавањима слајдове сте почели видели цео овај дијаграм меморије 65 00:05:59,480 --> 00:06:02,880 где се овде имаш меморијску адресу 0 66 00:06:02,880 --> 00:06:09,550 а овде имате меморијску адресу 4 свирке или 2 на 32. 67 00:06:09,550 --> 00:06:15,120 Па онда имаш неке ствари и неке ствари и онда имате гомилу 68 00:06:15,120 --> 00:06:21,780 и ти имаш свој гомилу, који сте управо почели да уче о томе, одрастању. 69 00:06:21,780 --> 00:06:24,390 [Ученик] Зар није гомила изнад стек? 70 00:06:24,390 --> 00:06:27,760 >> Да. Гомиле је на врху, зар не? >> [Ученик] Па, ставио 0 на врху. 71 00:06:27,760 --> 00:06:30,320 [Ученик] О, ставио 0 на врху. >> [Ученик] Ох, у реду. 72 00:06:30,320 --> 00:06:36,060 Напомена: Било где са ЦС50 идете да видите да на овај начин. >> [Ученик] Ок. 73 00:06:36,060 --> 00:06:40,290 То је само да када први пут видимо гомиле, 74 00:06:40,290 --> 00:06:45,000 волим када помислите на гомилу мислите гомилања ствари на врху једне другима. 75 00:06:45,000 --> 00:06:50,810 Зато смо склони да окренете ово око тако стек расте као стек иначе 76 00:06:50,810 --> 00:06:55,940 уместо гомиле виси надоле. >> [Ученик] Не гомиле технички одрастају превише, иако? 77 00:06:55,940 --> 00:07:01,100 То зависи од тога шта подразумевате под одрасту. 78 00:07:01,100 --> 00:07:04,010 Штек и гомила увек расте у супротним правцима. 79 00:07:04,010 --> 00:07:09,420 Стек се увек одраста у смислу да је то одрастање 80 00:07:09,420 --> 00:07:12,940 ка вишим меморијске адресе и хеап расте доле 81 00:07:12,940 --> 00:07:17,260 у томе што расте ка нижим меморијским адресама. 82 00:07:17,260 --> 00:07:20,250 Дакле, на врху је 0, а доња је висок меморијске адресе. 83 00:07:20,250 --> 00:07:26,390 Они обоје расте, само у супротстављању правце. 84 00:07:26,390 --> 00:07:29,230 [Ученик] сам мислио зато што сте рекли да сте ставили штос на дну 85 00:07:29,230 --> 00:07:33,640 јер изгледа више интуитивно, јер за стека да почне на врху гомиле, 86 00:07:33,640 --> 00:07:37,520 Гомила је на врху себе превише, па то је - >> Да. 87 00:07:37,520 --> 00:07:44,960 Такође мислим на гомилу као одрастање и већи, али је стек више. 88 00:07:44,960 --> 00:07:50,280 Дакле, стек је онај који смо некако желим да покажем одрастања. 89 00:07:50,280 --> 00:07:55,390 Али свуда другачије изгледају ће показати адресу 0 у врху 90 00:07:55,390 --> 00:07:59,590 а највиша меморијска адреса на дну, тако да је ово ваш уобичајени приказ меморије. 91 00:07:59,590 --> 00:08:02,100 >> Да ли имате неко питање? 92 00:08:02,100 --> 00:08:04,270 [Ученик] Можете ли нам рећи нешто више о гомили? 93 00:08:04,270 --> 00:08:06,180 Да. Ја ћу на то за тренутак. 94 00:08:06,180 --> 00:08:12,220 Прво, да се вратимо на повратку зашто & И је лоша ствар, 95 00:08:12,220 --> 00:08:18,470 на стек имате гомилу стека кадрова који представљају све функције 96 00:08:18,470 --> 00:08:20,460 који су позвани. 97 00:08:20,460 --> 00:08:27,990 Дакле игнорисање претходне ствари, врх вашег стека увек ће бити главна функција 98 00:08:27,990 --> 00:08:33,090 пошто је то прва функција, а која се зове. 99 00:08:33,090 --> 00:08:37,130 И онда када позовете другу функцију, стек ће расти доле. 100 00:08:37,130 --> 00:08:41,640 Дакле, ако ја зовем неку функцију, Фоо, и добија своју стека оквир, 101 00:08:41,640 --> 00:08:47,280 може да позове неку функцију, бар, она добија свој стек оквир. 102 00:08:47,280 --> 00:08:49,840 А бар би могао да буде рекурзивна и могло се зовем, 103 00:08:49,840 --> 00:08:54,150 и тако да други позив на траци ће добити свој оквир стека. 104 00:08:54,150 --> 00:08:58,880 И шта се у тим оквирима стека су све од локалних променљивих 105 00:08:58,880 --> 00:09:03,450 и све функције које аргумената - 106 00:09:03,450 --> 00:09:08,730 Све ствари које су локално сцопед овој функцији иду у овим оквирима стека. 107 00:09:08,730 --> 00:09:21,520 Значи, када сам рекао нешто као бара је функција, 108 00:09:21,520 --> 00:09:29,270 Ја ћу само да прогласи цео број, а затим се вратите показивач на тај цео број. 109 00:09:29,270 --> 00:09:33,790 Па одакле год живите? 110 00:09:33,790 --> 00:09:36,900 [Ученик] год живи у бару. >> [Боуден] Да. 111 00:09:36,900 --> 00:09:45,010 Негде у овом малом тргу меморије литтлер квадрат који има год у њему. 112 00:09:45,010 --> 00:09:53,370 Када се вратим и и, ја враћам показивач на овом малом блоку меморије. 113 00:09:53,370 --> 00:09:58,400 Али онда када функција враћа, њен оквир стек буде појавио ван штос. 114 00:10:01,050 --> 00:10:03,530 И то је разлог зашто се то зове стек. 115 00:10:03,530 --> 00:10:06,570 То је као структуре података стека, ако знате шта је то. 116 00:10:06,570 --> 00:10:11,580 Или чак као гомилу каблова је увек пример, 117 00:10:11,580 --> 00:10:16,060 Главни је да идем на дну, онда прва функција зовете ће ићи на врху тога, 118 00:10:16,060 --> 00:10:20,400 и не могу да се вратим на главни док се не врати из свих функција које су позвали 119 00:10:20,400 --> 00:10:22,340 који су постављени на врху. 120 00:10:22,340 --> 00:10:28,650 >> [Ученик] Дакле, ако сте урадили урадите вратите & И, та вредност је подложни промени без најаве. 121 00:10:28,650 --> 00:10:31,290 Да, то је - >> [ученик] То може бити замењена. >> Да. 122 00:10:31,290 --> 00:10:34,660 У потпуности је - Ако покушате и - 123 00:10:34,660 --> 00:10:38,040 То би такође бити инт * бар зато што се враћа показивач, 124 00:10:38,040 --> 00:10:41,310 па његов тип повратак је инт *. 125 00:10:41,310 --> 00:10:46,500 Ако покушате да користите повратну вредност ове функције, то је недефинисан понашање 126 00:10:46,500 --> 00:10:51,770 јер показивач указује на лоше памћење. >> [Ученик] Ок. 127 00:10:51,770 --> 00:11:01,250 Па шта ако је, на пример, изјавио инт * и = маллоц (сизеоф (инт))? 128 00:11:01,250 --> 00:11:03,740 То је боље. Да. 129 00:11:03,740 --> 00:11:07,730 [Ученик] Разговарали смо о томе како, када смо превуците ствари у нашу корпу за отпатке 130 00:11:07,730 --> 00:11:11,750 Ниси они заправо избрисати, само смо изгубили показиваче. 131 00:11:11,750 --> 00:11:15,550 Дакле, у овом случају не можемо заправо брише вредност или је то још увек постоји у меморији? 132 00:11:15,550 --> 00:11:19,130 За највећи део, то ће и даље бити тамо. 133 00:11:19,130 --> 00:11:24,220 Али, хајде да кажемо да се деси да позове неку другу функцију, Баз. 134 00:11:24,220 --> 00:11:28,990 Баз ће добити свој оквир стека овде. 135 00:11:28,990 --> 00:11:31,470 То ће бити брисе све ове ствари, 136 00:11:31,470 --> 00:11:34,180 и онда ако касније покушате да користите показивач који сте добили раније, 137 00:11:34,180 --> 00:11:35,570 то неће бити иста вредност. 138 00:11:35,570 --> 00:11:38,150 То ће управо променио зато што се зове функција Баз. 139 00:11:38,150 --> 00:11:43,080 [Ученик] Али да нисмо, да ли би ми и даље добити 3? 140 00:11:43,080 --> 00:11:44,990 [Бовден] У свему судећи, ти би. 141 00:11:44,990 --> 00:11:49,670 Али, не можете ослонити на то. Ц само каже недефинисано понашање. 142 00:11:49,670 --> 00:11:51,920 >> [Ученик] Ох, не. Ок. 143 00:11:51,920 --> 00:11:58,190 Дакле, када желите да се вратите показивач, ово је место где маллоц долази у употреби. 144 00:12:00,930 --> 00:12:15,960 Ја сам заправо писао управо вратили маллоц (3 * сизеоф (инт)). 145 00:12:17,360 --> 00:12:24,050 Ми ћемо ићи преко маллоц више у другом, али је идеја маллоц је све своје локалних променљивих 146 00:12:24,050 --> 00:12:26,760 Увек идем на стек. 147 00:12:26,760 --> 00:12:31,570 Све што је маллоцед иде на гомилу, и то ће заувек и увек бити на гомили 148 00:12:31,570 --> 00:12:34,490 док јој експлицитно не ослободи. 149 00:12:34,490 --> 00:12:42,130 Дакле, ово значи да, када маллоц нешто, то ће да преживе након функција враћа. 150 00:12:42,130 --> 00:12:46,800 [Ученик] Хоће ли опстати после програм престаје да ради? Но >> 151 00:12:46,800 --> 00:12:53,180 Ок, тако да ће ту бити све док програм је све тако урађено ради. >> Да. 152 00:12:53,180 --> 00:12:57,510 Можемо ићи преко детаље о томе шта се дешава када програм престаје да ради. 153 00:12:57,510 --> 00:13:02,150 Можда ћете морати да ме подсети, али то је потпуно одвојена ствар. 154 00:13:02,150 --> 00:13:04,190 [Ученик] Дакле маллоц ствара показивач? >> Да. 155 00:13:04,190 --> 00:13:13,030 Маллоц - >> [ученик] Мислим маллоц означава блок меморије која може да показивач користе. 156 00:13:15,400 --> 00:13:19,610 [Бовден] Желим поново тај дијаграм. >> [Ученик] Дакле, ово функционише, иако? 157 00:13:19,610 --> 00:13:26,430 [Ученик] Да, маллоц означава блок меморије коју можете да користите, 158 00:13:26,430 --> 00:13:30,470 и онда враћа адресу првог блока те меморије. 159 00:13:30,470 --> 00:13:36,750 >> [Боуден] Да. Дакле, када маллоц, ти си зграбио неки блок меморије 160 00:13:36,750 --> 00:13:38,260 то је тренутно у гомили. 161 00:13:38,260 --> 00:13:43,040 Ако гомила сувише мали, онда је само гомила ће расти, а расте у том правцу. 162 00:13:43,040 --> 00:13:44,650 Па рецимо да гомила сувише мали. 163 00:13:44,650 --> 00:13:49,960 Онда је требало да расте мало и вратити показивач на овом блоку који само расте. 164 00:13:49,960 --> 00:13:55,130 Када бесплатне ствари, правите више простора у гомили, 165 00:13:55,130 --> 00:14:00,030 па онда касније позове да се поново маллоц ту меморију коју сте раније ослободио. 166 00:14:00,030 --> 00:14:09,950 Важна ствар о маллоц и фрее је да вам даје потпуну контролу 167 00:14:09,950 --> 00:14:12,700 током животног века ових меморијских блокова. 168 00:14:12,700 --> 00:14:15,420 Глобалне променљиве су увек жив. 169 00:14:15,420 --> 00:14:18,500 Локалне променљиве су живи у свом делокругу. 170 00:14:18,500 --> 00:14:22,140 Чим проћи у коврџаве браце су локалне променљиве су мртви. 171 00:14:22,140 --> 00:14:28,890 Маллоцед меморија је жив када желите да буде жив 172 00:14:28,890 --> 00:14:33,480 и онда је пуштен када га кажеш да буде ослобођен. 173 00:14:33,480 --> 00:14:38,420 Они су заправо само 3 врсте меморије, стварно. 174 00:14:38,420 --> 00:14:41,840 Ту је аутоматски управљање меморијом, што је стек. 175 00:14:41,840 --> 00:14:43,840 Ствари се десити за вас аутоматски. 176 00:14:43,840 --> 00:14:46,910 Када кажете инт к, меморија је намењена за инт. 177 00:14:46,910 --> 00:14:51,630 Када к излази из оквира, меморија се повратила за к. 178 00:14:51,630 --> 00:14:54,790 Затим, ту је динамичан и управљање меморијом, што је оно што је маллоц, 179 00:14:54,790 --> 00:14:56,740 што је када имате контролу. 180 00:14:56,740 --> 00:15:01,290 Ви одлучујете када треба динамички меморија и не би требало да буде додељена. 181 00:15:01,290 --> 00:15:05,050 А онда је статичан, што само значи да је заувек живи, 182 00:15:05,050 --> 00:15:06,610 што је оно што глобалне променљиве су. 183 00:15:06,610 --> 00:15:10,240 Они су само увек у сећању. 184 00:15:10,960 --> 00:15:12,760 >> Питања? 185 00:15:14,490 --> 00:15:17,230 [Ученик] Можете ли дефинисати блок само помоћу витичасте заграде 186 00:15:17,230 --> 00:15:21,220 али не морају да имају, ако изјави или док изјава или нешто слично томе? 187 00:15:21,220 --> 00:15:29,130 Можете да дефинишете блок као у функцији, али да има и витичасте заграде. 188 00:15:29,130 --> 00:15:32,100 [Ученик] Дакле, не можете само као случајни пар заграда у коду 189 00:15:32,100 --> 00:15:35,680 које имају локалне променљиве? >> Да, можеш. 190 00:15:35,680 --> 00:15:45,900 Унутар инт бар можемо да имамо {инт и = 3;}. 191 00:15:45,900 --> 00:15:48,440 То би требало да буде овде. 192 00:15:48,440 --> 00:15:52,450 Али, то у потпуности дефинише обим инт. 193 00:15:52,450 --> 00:15:57,320 После тог другог коврџаве браце, и не могу се више користити. 194 00:15:57,910 --> 00:16:00,630 Ви скоро никада то, ипак. 195 00:16:02,940 --> 00:16:07,370 Да се ​​вратимо на оно што се дешава када се програм заврши, 196 00:16:07,370 --> 00:16:18,760 постоји нека врста заблуда / пола лажи да дајемо како би само олакшати ствари. 197 00:16:18,760 --> 00:16:24,410 Ми вам рећи да када доделите меморију 198 00:16:24,410 --> 00:16:29,860 ви издвајање неки комад РАМ за ту променљиву. 199 00:16:29,860 --> 00:16:34,190 Али ти ниси баш директно додирује РАМ икада у својим програмима. 200 00:16:34,190 --> 00:16:37,490 Ако мислите о томе, како сам нацртао - 201 00:16:37,490 --> 00:16:44,330 И заиста, ако идете кроз у ГДБ видећете исту ствар. 202 00:16:51,120 --> 00:16:57,590 Без обзира на то колико сте пута покренете програм или који програм сте трчање, 203 00:16:57,590 --> 00:16:59,950 стек се увек иде на почетак - 204 00:16:59,950 --> 00:17:06,510 увек ћете видети променљиве око нечега адресу окбфффф. 205 00:17:06,510 --> 00:17:09,470 Обично је негде у том региону. 206 00:17:09,470 --> 00:17:18,760 Али како могу евентуално имати програми 2 тројке на истом меморије? 207 00:17:20,640 --> 00:17:27,650 [Ученик] Има нека произвољна ознака где окбффф је требало да буде на РАМ 208 00:17:27,650 --> 00:17:31,320 који заиста могу да буду у различитим местима у зависности од тога када функција је звали. 209 00:17:31,320 --> 00:17:35,920 Да. Термин је виртуелна меморија. 210 00:17:35,920 --> 00:17:42,250 Идеја је да сваки процес, сваки програм који је покренут на рачунару 211 00:17:42,250 --> 00:17:49,450 има сопствени - претпоставимо 32 бита - потпуно независни адреса простора. 212 00:17:49,450 --> 00:17:51,590 То је адреса простор. 213 00:17:51,590 --> 00:17:56,220 Она има своје потпуно независна 4 гигабајта користити. 214 00:17:56,220 --> 00:18:02,220 >> Дакле, ако наиђете истовремено 2 програма, овај програм види 4 гигабајта себи, 215 00:18:02,220 --> 00:18:04,870 овај програм види 4 гигабајта себи, 216 00:18:04,870 --> 00:18:07,720 и то је немогуће за овај програм да дереференце показивач 217 00:18:07,720 --> 00:18:10,920 и завршити са меморијом од овог програма. 218 00:18:10,920 --> 00:18:18,200 А шта виртуелна меморија је мапирање из процеса адресном простору 219 00:18:18,200 --> 00:18:20,470 стварним стварима на РАМ. 220 00:18:20,470 --> 00:18:22,940 Дакле, то је до вашег оперативног система да знају да, 221 00:18:22,940 --> 00:18:28,080 хеј, када је овај момак дереференцес показивач окбффф, то заправо значи 222 00:18:28,080 --> 00:18:31,040 да жели РАМ бајт 1000, 223 00:18:31,040 --> 00:18:38,150 а ако овај програм дереференцес окбффф, он стварно жели РАМ бајт 10000. 224 00:18:38,150 --> 00:18:41,590 Они могу бити произвољно далеко. 225 00:18:41,590 --> 00:18:48,730 То је чак важи и за ствари у оквиру једног процеса адресног простора. 226 00:18:48,730 --> 00:18:54,770 Дакле, као да види све 4 гигабајта себи, али хајде да кажемо - 227 00:18:54,770 --> 00:18:57,290 [Ученик] Да ли сваки процес - 228 00:18:57,290 --> 00:19:01,350 Рецимо да имате рачунар са само 4 гигабајта РАМ-а. 229 00:19:01,350 --> 00:19:06,430 Да ли сваки процес види цела 4 гигабајта? >> Да. 230 00:19:06,430 --> 00:19:13,060 Али 4 гигабајта то види је лаж. 231 00:19:13,060 --> 00:19:20,460 То је само он мисли да је све ово сећање, јер не знам ништа друго процес не постоји. 232 00:19:20,460 --> 00:19:28,140 То ће само користити као много меморије као што заиста треба. 233 00:19:28,140 --> 00:19:32,340 Оперативни систем неће дати РАМ овом процесу 234 00:19:32,340 --> 00:19:35,750 ако не користи никакву меморију у овом целом региону. 235 00:19:35,750 --> 00:19:39,300 То неће да га дају за памћење тог региона. 236 00:19:39,300 --> 00:19:54,780 Али идеја је да - Покушавам да смислим - Не могу да се сетим аналогије. 237 00:19:54,780 --> 00:19:56,780 Аналогије су тешка. 238 00:19:57,740 --> 00:20:02,700 Једно од питања виртуелне меморије или једна од ствари које су се решавају 239 00:20:02,700 --> 00:20:06,810 је да процеси буду потпуно несвесни један другог. 240 00:20:06,810 --> 00:20:12,140 И тако можете написати било који програм који само дереференцес било показивача, 241 00:20:12,140 --> 00:20:19,340 волим само написати програм који каже * (ок1234) 242 00:20:19,340 --> 00:20:22,890 и то је меморијска адреса дереференцинг 1234. 243 00:20:22,890 --> 00:20:28,870 >> Али то је на оперативном систему онда преведем шта значи 1234. 244 00:20:28,870 --> 00:20:33,960 Дакле, ако се деси да буде 1234 валидна меморијска адреса за овај процес, 245 00:20:33,960 --> 00:20:38,800 као да је на стеку, или тако нешто, онда ће се вратити вредност тог меморијске адресе 246 00:20:38,800 --> 00:20:41,960 колико процес зна. 247 00:20:41,960 --> 00:20:47,520 Али ако 1234 није валидна адреса, као што се дешава да слети 248 00:20:47,520 --> 00:20:52,910 у неком малом комаду меморије овде који је иза гомиле и изван гомиле 249 00:20:52,910 --> 00:20:57,200 а нисте баш користио, онда је то када вам ствари попут сегфаултс 250 00:20:57,200 --> 00:21:00,260 јер ти додиривања меморију која не би требало да додирује. 251 00:21:07,180 --> 00:21:09,340 Ово је такође тачно - 252 00:21:09,340 --> 00:21:15,440 32-битни систем, 32 бита значи да имају 32 бита дефинишу адресу меморије. 253 00:21:15,440 --> 00:21:22,970 То је разлог зашто су показивачи 8 бајтова, јер 32 бита 8 бајтова - или 4 бајта. 254 00:21:22,970 --> 00:21:25,250 Показивачи су 4 бајта. 255 00:21:25,250 --> 00:21:33,680 Дакле, када видите показивач као окбффффф, то је - 256 00:21:33,680 --> 00:21:40,080 У оквиру било ког програма можете само конструисати било произвољно показивача, 257 00:21:40,080 --> 00:21:46,330 распону од ок0 до вола 8 ф'с - фффффффф. 258 00:21:46,330 --> 00:21:49,180 [Ученик] Зар нисте рекли да су 4 бајта? >> Да. 259 00:21:49,180 --> 00:21:52,730 [Ученик] Онда сваки бајт ће имати - >> [Боуден] Хексадецимални. 260 00:21:52,730 --> 00:21:59,360 Хексадецимални - 5, 6, 7, 8. Дакле, тројке ћете увек видети у хексадецимални. 261 00:21:59,360 --> 00:22:01,710 То је само како ћемо класификовати показиваче. 262 00:22:01,710 --> 00:22:05,240 Сваке 2 цифре хексадецимални је 1 бајт. 263 00:22:05,240 --> 00:22:09,600 Тако да ће бити 8 хексадецималних цифара за 4 бајта. 264 00:22:09,600 --> 00:22:14,190 Дакле, сваки показивач на 32-битном систему ће бити 4 бајта, 265 00:22:14,190 --> 00:22:18,550 што значи да је у вашем процесу можете изградити неке произвољне 4 бајта 266 00:22:18,550 --> 00:22:20,550 и да показивач ван њега, 267 00:22:20,550 --> 00:22:32,730 што значи да колико је познато, може да се обрати цео 2 на 32 бајтова меморије. 268 00:22:32,730 --> 00:22:34,760 Иако то није заиста имају приступ да, 269 00:22:34,760 --> 00:22:40,190 чак и ако ваш рачунар има само 512 мегабајта, она мисли да има толику меморију. 270 00:22:40,190 --> 00:22:44,930 А оперативни систем је довољно паметан да се само издвојити оно што заиста треба. 271 00:22:44,930 --> 00:22:49,630 То не само да иде, о, нови процес: 4 свирке. 272 00:22:49,630 --> 00:22:51,930 >> Да. >> [Ученик] Шта вола значи? Зашто си то написао? 273 00:22:51,930 --> 00:22:54,980 То је само симбол за хексадецимални. 274 00:22:54,980 --> 00:22:59,590 Када видите број почни са вола, узастопни ствари хексадецимални. 275 00:23:01,930 --> 00:23:05,760 [Ученик] Ти си објашњава шта се дешава када се завршава програм. >> Да. 276 00:23:05,760 --> 00:23:09,480 Шта се дешава када се програм завршава се оперативни систем 277 00:23:09,480 --> 00:23:13,600 само брише мапирањима да има за ове адресе, и то је то. 278 00:23:13,600 --> 00:23:17,770 Оперативни систем сада може само да ту меморију на другом програму да користи. 279 00:23:17,770 --> 00:23:19,490 [Ученик] Ок. 280 00:23:19,490 --> 00:23:24,800 Дакле, када сте издвоји нешто на гомили или стека или глобално променљивих или било шта, 281 00:23:24,800 --> 00:23:27,010 сви они само нестану чим програм се завршава 282 00:23:27,010 --> 00:23:32,120 јер оперативни систем је сада слободан да дам тај сећање на било који други процес. 283 00:23:32,120 --> 00:23:35,150 [Ученик] Иако вероватно још увек постоје вредности написане у? >> Да. 284 00:23:35,150 --> 00:23:37,740 Вредности су вероватно још увек ту. 285 00:23:37,740 --> 00:23:41,570 То је само да ће то бити тешко да се на њих. 286 00:23:41,570 --> 00:23:45,230 То је много теже да се на њих него да се на избрисане датотеке 287 00:23:45,230 --> 00:23:51,450 јер обрисани фајл врста седи тамо дуго и хард диск је много већи. 288 00:23:51,450 --> 00:23:54,120 Дакле, то ће заменити различите делове меморије 289 00:23:54,120 --> 00:23:58,640 пре него што се догоди да замените комад меморије која користи тај фајл да буде у. 290 00:23:58,640 --> 00:24:04,520 Али главна меморија, РАМ меморије, ви циклус кроз много брже, 291 00:24:04,520 --> 00:24:08,040 тако да ће врло брзо бити замењена. 292 00:24:10,300 --> 00:24:13,340 Питања о овоме или било шта друго? 293 00:24:13,340 --> 00:24:16,130 [Ученик] Имам питања у вези другу тему. >> Реду. 294 00:24:16,130 --> 00:24:19,060 Да ли неко има питања на ово? 295 00:24:20,170 --> 00:24:23,120 >> Ок. Различити тема. >> [Ученик] Ок. 296 00:24:23,120 --> 00:24:26,550 Ја сам пролазио кроз неке праксе тестова, 297 00:24:26,550 --> 00:24:30,480 ау једној од њих је говорио о сизеоф 298 00:24:30,480 --> 00:24:35,630 а вредност која се враћа или различити типови променљивих. >> Да. 299 00:24:35,630 --> 00:24:45,060 И то је рекао да су инт и дуго и повратак 4, па су оба дугачак 4 бајта. 300 00:24:45,060 --> 00:24:48,070 Да ли постоји разлика између инт и дуже, или је то иста ствар? 301 00:24:48,070 --> 00:24:50,380 Да, постоји разлика. 302 00:24:50,380 --> 00:24:52,960 Ц стандардно - 303 00:24:52,960 --> 00:24:54,950 Вероватно ћу да погрешиш. 304 00:24:54,950 --> 00:24:58,800 Апарат Ц стандард баш као што је Ц, званични документација Ц. 305 00:24:58,800 --> 00:25:00,340 То је оно што каже. 306 00:25:00,340 --> 00:25:08,650 Дакле Ц стандардно само каже да ће знак заувек и увек бити 1 бајт. 307 00:25:10,470 --> 00:25:19,040 Све после тога - кратко је увек само дефинисан као већи или једнак знак. 308 00:25:19,040 --> 00:25:23,010 То може бити строго већи од, али не позитивно. 309 00:25:23,010 --> 00:25:31,940 Инт је само дефинисан као већи или једнак кратко. 310 00:25:31,940 --> 00:25:36,210 И док је само дефинисан као већи или једнак са инт. 311 00:25:36,210 --> 00:25:41,600 И дуго дуго је већи или једнак дуго. 312 00:25:41,600 --> 00:25:46,610 Дакле, једино што је Ц стандард дефинише је релативна наручивање свега. 313 00:25:46,610 --> 00:25:54,880 Стварна количина меморије да се ствари заузимају је генерално до имплементације, 314 00:25:54,880 --> 00:25:57,640 али је прилично добро дефинисан у овом тренутку. >> [Ученик] Ок. 315 00:25:57,640 --> 00:26:02,490 Дакле, шортс су готово увек ће бити 2 бајта. 316 00:26:04,920 --> 00:26:09,950 Интс су готово увек ће бити 4 бајта. 317 00:26:12,070 --> 00:26:15,340 Дуги Лонгс су готово увек ће бити 8 бајтова. 318 00:26:17,990 --> 00:26:23,160 И чезне, то зависи од тога да ли користите 32-битни или 64-битни систем. 319 00:26:23,160 --> 00:26:27,450 Тако дуго ће да одговара типу система. 320 00:26:27,450 --> 00:26:31,920 Ако користите 32-битни систем као Апплианце, то ће бити 4 бајта. 321 00:26:34,530 --> 00:26:42,570 Ако користите 64-битну као много недавних рачунара, то ће бити 8 бајтова. 322 00:26:42,570 --> 00:26:45,230 >> Интс су скоро увек 4 бајта у овом тренутку. 323 00:26:45,230 --> 00:26:47,140 Дуги Лонгс су готово увек 8 бајтова. 324 00:26:47,140 --> 00:26:50,300 У прошлости, ИНТС некада само 2 бајта. 325 00:26:50,300 --> 00:26:56,840 Али приметите да је ово потпуно задовољава све ове односа већа и једнака. 326 00:26:56,840 --> 00:27:01,280 Докле је савршено дозвољено да буду исте величине као цео број, 327 00:27:01,280 --> 00:27:04,030 и то је такође дозвољено да буду исте величине као и дуго дуго. 328 00:27:04,030 --> 00:27:11,070 И тако једноставно деси да буде да се у 99,999% од система, то ће да буде једнака 329 00:27:11,070 --> 00:27:15,800 или инт или дуго дуго. То зависи од 32-бита или 64-битни. >> [Ученик] Ок. 330 00:27:15,800 --> 00:27:24,600 У сплавова, како је децимална тачка одређен у смислу бита? 331 00:27:24,600 --> 00:27:27,160 Као што бинарни? >> Да. 332 00:27:27,160 --> 00:27:30,570 Не морате да знате да је за ЦС50. 333 00:27:30,570 --> 00:27:32,960 Ти чак и не уче да у 61. 334 00:27:32,960 --> 00:27:37,350 Ви не научи да заиста у сваком курсу. 335 00:27:37,350 --> 00:27:42,740 То је само представа. 336 00:27:42,740 --> 00:27:45,440 Заборавио сам тачне битне уношења. 337 00:27:45,440 --> 00:27:53,380 Идеја пливајућег тренутку је да издвоји одређен број бита да заступају - 338 00:27:53,380 --> 00:27:56,550 У суштини, све је у научној нотацији. 339 00:27:56,550 --> 00:28:05,600 Дакле, доделити одређени број битова да заступа самог броја, као и 1,2345. 340 00:28:05,600 --> 00:28:10,200 Ја никада не могу представљати број са више цифара него 5. 341 00:28:12,200 --> 00:28:26,300 Тада сте такође доделити одређени број битова, тако да она тежи да буде као 342 00:28:26,300 --> 00:28:32,810 можете само да иде и до одређеног броја, као да је највећи експонент можете имати, 343 00:28:32,810 --> 00:28:36,190 и можете само да одете до одређеног експоненту, 344 00:28:36,190 --> 00:28:38,770 као да је то најмања експонент можете имати. 345 00:28:38,770 --> 00:28:44,410 >> Не сећам се тачно начин битови се додељују за све ове вредности, 346 00:28:44,410 --> 00:28:47,940 али известан број бита су посвећени 1,2345, 347 00:28:47,940 --> 00:28:50,930 један одређени број битова посвећена експонента, 348 00:28:50,930 --> 00:28:55,670 и то је само могуће да представља експонент одређене величине. 349 00:28:55,670 --> 00:29:01,100 [Ученик] И дупло? Да ли је то као додатни дуг пловка? >> Да. 350 00:29:01,100 --> 00:29:07,940 То је иста ствар као флоат осим сад ви користите 8 бајтова уместо 4 бајта. 351 00:29:07,940 --> 00:29:11,960 Сада ћете моћи да користите 9 цифара или 10 цифре, 352 00:29:11,960 --> 00:29:16,630 и то ће бити у стању да иде до 300 уместо 100. >> [Ученик] Ок. 353 00:29:16,630 --> 00:29:21,550 А пловци су такође 4 бајта. >> Да. 354 00:29:21,550 --> 00:29:27,520 Па, опет, то вероватно зависи укупни о општој примени, 355 00:29:27,520 --> 00:29:30,610 али пловци су 4 бајта, дубл су 8. 356 00:29:30,610 --> 00:29:33,440 Дубл је двоструко зову јер су дупло величина сплавова. 357 00:29:33,440 --> 00:29:38,380 [Ученик] Ок. А ту су дупло дупло? >> Не постоје. 358 00:29:38,380 --> 00:29:43,660 Ја мислим - >> [ученик] Као дугих жуди? >> Да. Ја не мислим тако. Да. 359 00:29:43,660 --> 00:29:45,950 [Ученик] На тесту прошле године било је питање о главној функцији 360 00:29:45,950 --> 00:29:49,490 потребе да буду део вашег програма. 361 00:29:49,490 --> 00:29:52,310 Одговор је био да то не мора да буде део вашег програма. 362 00:29:52,310 --> 00:29:55,100 У којој ситуацији? То је оно што сам видео. 363 00:29:55,100 --> 00:29:59,090 [Бовден] Изгледа - >> [ученик] Шта ситуација? 364 00:29:59,090 --> 00:30:02,880 Да ли имате проблем? >> [Ученик] Да, дефинитивно сам да га подигне. 365 00:30:02,880 --> 00:30:07,910 То не мора да буде, технички, али у суштини ће то бити. 366 00:30:07,910 --> 00:30:10,030 [Ученик] видео сам једну на другачији овогодишњег. 367 00:30:10,030 --> 00:30:16,220 То је било као Тачно или Нетачно: важи - >> О, в фајл. 368 00:30:16,220 --> 00:30:18,790 . [Ученик] Свака в фајл мора имати - [како говоре одједном - неразумљив] 369 00:30:18,790 --> 00:30:21,120 Ок. Дакле, то је посебна. 370 00:30:21,120 --> 00:30:26,800 >> Ц фајл. Само треба да садржи функције. 371 00:30:26,800 --> 00:30:32,400 Можете саставити фајл у машински код, бинарне, свеједно, 372 00:30:32,400 --> 00:30:36,620 без тога што извршна још. 373 00:30:36,620 --> 00:30:39,420 Важи извршна мора имати главну функцију. 374 00:30:39,420 --> 00:30:45,460 Можете написати 100 функције у 1 фајл али нема основне 375 00:30:45,460 --> 00:30:48,800 и онда саставити то доле у ​​бинарни, 376 00:30:48,800 --> 00:30:54,460 онда написати још једну датотеку која има само основни већ зове гомила ових функција 377 00:30:54,460 --> 00:30:56,720 У овом бинарног фајла овамо. 378 00:30:56,720 --> 00:31:01,240 И тако, када правите извршну, то је оно што чини повезивач 379 00:31:01,240 --> 00:31:05,960 се комбинује ове 2 бинарне фајлове у једном програму. 380 00:31:05,960 --> 00:31:11,400 Дакле, ц фајл. Не треба да имају главну функцију уопште. 381 00:31:11,400 --> 00:31:19,220 А на великим базама код видећете хиљаде ц датотека и датотека. 1 главни. 382 00:31:23,960 --> 00:31:26,110 Још питања? 383 00:31:29,310 --> 00:31:31,940 [Ученик] Било је друго питање. 384 00:31:31,940 --> 00:31:36,710 Она каже да је преводилац. Тачно или нетачно? 385 00:31:36,710 --> 00:31:42,030 А одговор је био лажан, а ја сам схватио зашто није као јека. 386 00:31:42,030 --> 00:31:44,770 Али шта ми зовемо да ако то није? 387 00:31:44,770 --> 00:31:49,990 Нека је у основи само - ја видим шта се то зове. 388 00:31:49,990 --> 00:31:52,410 Али то је само ради команде. 389 00:31:53,650 --> 00:31:55,650 Маке. 390 00:31:58,240 --> 00:32:00,870 Ја могу повући ово. Да. 391 00:32:10,110 --> 00:32:13,180 О, да. Нека се то ради. 392 00:32:13,180 --> 00:32:17,170 То каже сврха марку корисности је аутоматски одредити 393 00:32:17,170 --> 00:32:19,610 који делови великог програма треба да се компајлирали 394 00:32:19,610 --> 00:32:22,350 и издаје команде да их рекомпајлирате. 395 00:32:22,350 --> 00:32:27,690 Можете направити да датотеке које су апсолутно огроман. 396 00:32:27,690 --> 00:32:33,210 Нека гледа временским печатима фајлова и, као што смо раније рекли, 397 00:32:33,210 --> 00:32:36,930 можете саставити појединачне фајлове доле, и то није све док не дођете до Линкер 398 00:32:36,930 --> 00:32:39,270 да они саставили у једну извршну. 399 00:32:39,270 --> 00:32:43,810 Дакле, ако имате 10 различитих датотека и да направи промену на 1 од њих, 400 00:32:43,810 --> 00:32:47,870 онда шта да учини јесте да уради само рекомпајлирање да 1 филе 401 00:32:47,870 --> 00:32:50,640 а затим повежите све заједно. 402 00:32:50,640 --> 00:32:53,020 Али то је много глупљи од тога. 403 00:32:53,020 --> 00:32:55,690 То је на вама да се у потпуности дефинише да је то оно што треба да се ради. 404 00:32:55,690 --> 00:32:59,560 Она по дефаулту има способност да препозна ове ствари време маркица, 405 00:32:59,560 --> 00:33:03,220 али можете написати датотеку Направите да уради било шта. 406 00:33:03,220 --> 00:33:09,150 Можете написати да фајл тако да када откуцате учинити само ЦД на други директоријум. 407 00:33:09,150 --> 00:33:15,560 Је добијање сам фрустриран јер сам лепљивост све унутар моје Апплианце 408 00:33:15,560 --> 00:33:21,740 а онда сам видите ПДФ од Мац-а. 409 00:33:21,740 --> 00:33:30,720 >> Зато идем у Финдер и ја могу да урадим Иди, Цоннецт то Сервер, 410 00:33:30,720 --> 00:33:36,950 и сервер да се повежем је мој апарат, а онда сам отвори ПДФ 411 00:33:36,950 --> 00:33:40,190 које добија саставио ЛаТеКс. 412 00:33:40,190 --> 00:33:49,320 Али ја сам био узимајући фрустриран јер сваки пут сам морао да освежите ПДФ, 413 00:33:49,320 --> 00:33:53,900 Морао сам да га ископирате на одређени директоријум да би то могло приступити 414 00:33:53,900 --> 00:33:57,710 и то је све нервира. 415 00:33:57,710 --> 00:34:02,650 Зато сам написао Направите фајл који морате да дефинишете како то чини ствари. 416 00:34:02,650 --> 00:34:06,130 Како сте направити у ово ПДФ ЛаТеКс. 417 00:34:06,130 --> 00:34:10,090 Баш као и било који други фајл марку - или Претпостављам да нисте видели направити датотеке, 418 00:34:10,090 --> 00:34:13,510 али имамо у Апплианце глобалну Направите фајл који само пише, 419 00:34:13,510 --> 00:34:16,679 ако састављању Ц фајл, користите кланг. 420 00:34:16,679 --> 00:34:20,960 И тако овде у мом марку фајлу који сам да кажем, 421 00:34:20,960 --> 00:34:25,020 овај фајл ћете желети да саставе са ПДФ ЛаТеКс. 422 00:34:25,020 --> 00:34:27,889 И тако је ПДФ ЛаТеКс да ради састављања. 423 00:34:27,889 --> 00:34:31,880 Нека се не састављања. То је само ради ове команде у низу сам навели. 424 00:34:31,880 --> 00:34:36,110 Тако то ради ПДФ латекса, он га копира у директоријум желим да се копирају, 425 00:34:36,110 --> 00:34:38,270 је ЦД у именик и обавља друге ствари, 426 00:34:38,270 --> 00:34:42,380 али све то ради се признаје када се фајл измени, 427 00:34:42,380 --> 00:34:45,489 и ако се мења, онда ће покренути команде која је то требало да покрене 428 00:34:45,489 --> 00:34:48,760 када се фајл измени. >> [Ученик] Ок. 429 00:34:50,510 --> 00:34:54,420 Ја не знам где су глобални Направите фајлови су за мене да га проверимо. 430 00:34:57,210 --> 00:35:04,290 Остала питања? Све из прошлости тестови? Било поинтер ствари? 431 00:35:06,200 --> 00:35:08,730 Постоје суптилне ствари са показивачима попут - 432 00:35:08,730 --> 00:35:10,220 Нећу бити у могућности да пронађе питање квиз на њему - 433 00:35:10,220 --> 00:35:16,250 али само као овакве ствари. 434 00:35:19,680 --> 00:35:24,060 Уверите се да сте разумели да када кажем инт * к * и - 435 00:35:24,890 --> 00:35:28,130 Ово није баш ништа овде, претпостављам. 436 00:35:28,130 --> 00:35:32,140 Али као * к * и, они су 2 променљиве које се налазе на стеку. 437 00:35:32,140 --> 00:35:37,220 Када кажем к = маллоц (сизеоф (инт)), к је увек променљива на стек, 438 00:35:37,220 --> 00:35:41,180 маллоц је неки блок преко у гомили, а имамо к указују на гомили. 439 00:35:41,180 --> 00:35:43,900 >> Тако нешто на стек указује на гомили. 440 00:35:43,900 --> 00:35:48,100 Кад год маллоц ништа, ви сте неминовно складишти унутар једног показивача. 441 00:35:48,100 --> 00:35:55,940 Дакле показивач налази на стеку, маллоцед блок је на гомили. 442 00:35:55,940 --> 00:36:01,240 Много људи се збунити и кажу инт * к = маллоц к; је на гомили. 443 00:36:01,240 --> 00:36:04,100 Но Шта к указује на гомиле. 444 00:36:04,100 --> 00:36:08,540 к је сама на стек, уколико из било ког разлога сте к бити глобална променљива, 445 00:36:08,540 --> 00:36:11,960 у ком случају се деси да буде у неком другом региону меморије. 446 00:36:13,450 --> 00:36:20,820 Дакле праћење, ове кутије и стрела дијаграми су прилично уобичајено за квизу. 447 00:36:20,820 --> 00:36:25,740 Или ако није на квизу 0, то ће бити на квизу 1. 448 00:36:27,570 --> 00:36:31,940 Требало би да знате све ово, кораке у састављању 449 00:36:31,940 --> 00:36:35,740 пошто сте морали да одговорите на питања о њима. Да. 450 00:36:35,740 --> 00:36:38,940 [Ученик] Можемо ићи преко тих корака - >> Наравно. 451 00:36:48,340 --> 00:36:58,640 Пре корака и састављање имамо предобраде, 452 00:36:58,640 --> 00:37:16,750 састављање, монтажу и повезивање. 453 00:37:16,750 --> 00:37:21,480 Предобрада. Шта то радиш? 454 00:37:29,720 --> 00:37:32,290 То је најлакши корак у - добро, не као - 455 00:37:32,290 --> 00:37:35,770 то не значи да би требало да буде очигледно, али то је најлакши корак. 456 00:37:35,770 --> 00:37:38,410 Ви би га спровести сами. Да. 457 00:37:38,410 --> 00:37:43,410 [Ученик] Узмите оно што имате у вашој обухвата овако и она копира, а затим и дефинише. 458 00:37:43,410 --> 00:37:49,250 Изгледа да ствари као што су # инцлуде и # дефине, 459 00:37:49,250 --> 00:37:53,800 и то само копије и пасте шта они заправо значе. 460 00:37:53,800 --> 00:37:59,240 Дакле, када кажете # инцлуде цс50.х, Претпроцесор се копирањем и лепљењем цс50.х 461 00:37:59,240 --> 00:38:01,030 у тој линији. 462 00:38:01,030 --> 00:38:06,640 Када кажете # дефине к да буде 4, Претпроцесор пролази кроз цео програм 463 00:38:06,640 --> 00:38:10,400 и замењује све инстанце к са 4. 464 00:38:10,400 --> 00:38:17,530 Дакле Претпроцесор узима важећу Ц датотеку и даје валидну Ц фајл 465 00:38:17,530 --> 00:38:20,300 где ствари су копирали и налепили. 466 00:38:20,300 --> 00:38:24,230 Тако сада састављања. Шта то радиш? 467 00:38:25,940 --> 00:38:28,210 [Ученик] То иде из Ц у бинарни. 468 00:38:28,210 --> 00:38:30,970 >> [Бовден] То не иде све у бинарни. 469 00:38:30,970 --> 00:38:34,220 [Ученик] Да машинског кода онда? >> Није машински код. 470 00:38:34,220 --> 00:38:35,700 [Ученик] Скупштина? >> Скупштина. 471 00:38:35,700 --> 00:38:38,890 То иде у Скупштини пре него што оде скроз у Ц коду, 472 00:38:38,890 --> 00:38:45,010 и већина језика уради овако нешто. 473 00:38:47,740 --> 00:38:50,590 Пицк било језик високог нивоа, а ако ћеш да га састави, 474 00:38:50,590 --> 00:38:52,390 то је вероватно да састави у корацима. 475 00:38:52,390 --> 00:38:58,140 Прво ће да састави Питхон до Ц, онда ће саставити Ц Скупштини, 476 00:38:58,140 --> 00:39:01,600 а онда Скупштина ће се превести у бинарни. 477 00:39:01,600 --> 00:39:07,800 Дакле, састављање ће то донети из Ц Скупштини. 478 00:39:07,800 --> 00:39:12,130 Састављања реч обично значи чиме је са вишег нивоа 479 00:39:12,130 --> 00:39:14,340 на нижем нивоу језику програмирања. 480 00:39:14,340 --> 00:39:19,190 Дакле, ово је само корак у изради где почнете са високом нивоу језика 481 00:39:19,190 --> 00:39:23,270 и завршити у ниском нивоу језика, и то је разлог зашто се зове корак састављања. 482 00:39:25,280 --> 00:39:33,370 [Ученик] Током компајлирања, рецимо да сте урадили # инцлуде цс50.х. 483 00:39:33,370 --> 00:39:42,190 Хоће компилатор рекомпајлирање цс50.х, као функције које су унутра, 484 00:39:42,190 --> 00:39:45,280 и превели у Скупштини, као и код, 485 00:39:45,280 --> 00:39:50,830 или ће га копирате и налепите нешто што је било пре скупштина? 486 00:39:50,830 --> 00:39:56,910 цс50.х ће прилично никада завршити у Скупштини. 487 00:39:59,740 --> 00:40:03,680 Ствари као функција прототипова и ствари су само да будеш опрезан. 488 00:40:03,680 --> 00:40:09,270 То гарантује да компајлер провери ствари као што зовете функције 489 00:40:09,270 --> 00:40:12,910 са правим типовима и повратак правим аргументима и стварима. 490 00:40:12,910 --> 00:40:18,350 >> Тако цс50.х ће бити претходно обрађују у фајлу, и онда када је то састављања 491 00:40:18,350 --> 00:40:22,310 је у основи то баца након што осигурава да се све правилно зове. 492 00:40:22,310 --> 00:40:29,410 Али функције дефинисане у ЦС50 библиотеци, које су одвојене од цс50.х, 493 00:40:29,410 --> 00:40:33,610 они неће бити посебно састављен. 494 00:40:33,610 --> 00:40:37,270 То ће заиста доћи доле у ​​повезује кораку, тако да ћемо се на то у секунди. 495 00:40:37,270 --> 00:40:40,100 Али прво, шта је монтажа? 496 00:40:41,850 --> 00:40:44,500 [Ученик] Скупштина у бинарни? >> Да. 497 00:40:46,300 --> 00:40:48,190 Склапање. 498 00:40:48,190 --> 00:40:54,710 Ми не зовемо састављања јер Скупштина је прилично чист превод бинарни. 499 00:40:54,710 --> 00:41:00,230 Постоји врло мало логике у идући од Скупштине да бинарни. 500 00:41:00,230 --> 00:41:03,180 То је као гледа у табели, ох, имамо ову инструкцију; 501 00:41:03,180 --> 00:41:06,290 који одговара бинарни 01110. 502 00:41:10,200 --> 00:41:15,230 И тако су датотеке које монтажу генерално резултати су. О датотека. 503 00:41:15,230 --> 00:41:19,020 А о филес. Смо оно што смо говорили и раније, 504 00:41:19,020 --> 00:41:21,570 Како датотека не треба да имају главну функцију. 505 00:41:21,570 --> 00:41:27,640 Сваки фајл може бити састављена доле до о фајлу. Док је важећа Ц датотека. 506 00:41:27,640 --> 00:41:30,300 Може се саставља до О.. 507 00:41:30,300 --> 00:41:43,030 Сада, повезујући је оно заправо доноси гомилу о фајлове и доводи их на извршну.. 508 00:41:43,030 --> 00:41:51,110 И шта ради линковање је можете мислити о ЦС50 библиотеке као о фајлу.. 509 00:41:51,110 --> 00:41:56,980 То је већ саставио бинарни фајл. 510 00:41:56,980 --> 00:42:03,530 И тако када компајлирате датотеку, ваш хелло.ц, која тражи ГетСтринг, 511 00:42:03,530 --> 00:42:06,360 хелло.ц добија саставио доле хелло.о, 512 00:42:06,360 --> 00:42:08,910 хелло.о је сада у бинарном. 513 00:42:08,910 --> 00:42:12,830 Она користи ГетСтринг, тако да мора да иде преко на цс50.о, 514 00:42:12,830 --> 00:42:16,390 и линкер тхем смоосхес заједно и копира ГетСтринг у овом фајлу 515 00:42:16,390 --> 00:42:20,640 и излази са извршну који има све функције су му потребни. 516 00:42:20,640 --> 00:42:32,620 Дакле цс50.о заправо није о фајл, али је довољно близу да не постоји фундаментална разлика. 517 00:42:32,620 --> 00:42:36,880 Дакле, повезивање само обједињује гомилу фајлова 518 00:42:36,880 --> 00:42:41,390 да одвојено садржи све функције морам да користим 519 00:42:41,390 --> 00:42:46,120 и ствара извршну који ће заправо покренути. 520 00:42:48,420 --> 00:42:50,780 >> И то је такође оно што смо говорили раније 521 00:42:50,780 --> 00:42:55,970 где можете имати 1000 Ц фајлове. можете саставити их све о фајлове. 522 00:42:55,970 --> 00:43:00,040 који ће вероватно потрајати, онда промените 1 в фајл.. 523 00:43:00,040 --> 00:43:05,480 Потребно је само да компајлирате тај 1. Ц датотеку, а затим све остало, РЕЛИНК 524 00:43:05,480 --> 00:43:07,690 повезати све назад заједно. 525 00:43:09,580 --> 00:43:11,430 [Ученик] Када смо повезивању пишемо лцс50? 526 00:43:11,430 --> 00:43:20,510 Да, тако лцс50. То застава сигнали повезивач да би требало да буде повезивање у тој библиотеци. 527 00:43:26,680 --> 00:43:28,910 Питања? 528 00:43:41,310 --> 00:43:46,860 Да ли смо прошли кроз бинарности, осим да је 5 секунди у првом предавању? 529 00:43:50,130 --> 00:43:53,010 Ја не мислим тако. 530 00:43:55,530 --> 00:43:58,820 Требало би да знате све велике ОС који смо отишли ​​преко, 531 00:43:58,820 --> 00:44:02,670 и требало би да буде у стању да, ако ти је дао функцију, 532 00:44:02,670 --> 00:44:09,410 треба да будете у стању да кажемо да је то велики О, отприлике. Или добро, велики је О груба. 533 00:44:09,410 --> 00:44:15,300 Дакле, ако сте видели угнездио на петљи петље преко истог броја ствари, 534 00:44:15,300 --> 00:44:22,260 као инт, и <н инт ј, ј <н - >> [ученик] н квадрат. >> Тежи да буде н квадрат. 535 00:44:22,260 --> 00:44:25,280 Ако сте троструки угњеждени, она тежи да буде н куб. 536 00:44:25,280 --> 00:44:29,330 Дакле, такве ствари би требало да буде у стању да укаже одмах. 537 00:44:29,330 --> 00:44:33,890 Морате да знате какав уметања и балон сортирате и обједињавање врста и све од њих. 538 00:44:33,890 --> 00:44:41,420 То је лакше разумети зашто су они н квадрат и н лог н и све то 539 00:44:41,420 --> 00:44:47,810 јер мислим да је било на квизу годину, где смо у суштини ти дао 540 00:44:47,810 --> 00:44:55,050 Имплементација буббле врсте и рекао: "Шта је време рада ове функције?" 541 00:44:55,050 --> 00:45:01,020 Дакле, ако сте га препознају као балон врсте, онда одмах можемо рећи н квадрат. 542 00:45:01,020 --> 00:45:05,470 Али, ако само погледате, ви ни не треба да схвате да је то врста балон; 543 00:45:05,470 --> 00:45:08,990 можете само рећи ово ради ово и ово. Ово је н квадрат. 544 00:45:12,350 --> 00:45:14,710 [Ученик] Да ли постоје неки опасни примера можете доћи до, 545 00:45:14,710 --> 00:45:20,370 као сличном идејом схватите? 546 00:45:20,370 --> 00:45:24,450 >> Ја не мислим да ће вам дати неке тешке примере. 547 00:45:24,450 --> 00:45:30,180 Мехур врста ствар је отприлике онолико тешко колико би ми иде, 548 00:45:30,180 --> 00:45:36,280 па чак и да, како год да схватите да сте итератинг преко низа 549 00:45:36,280 --> 00:45:41,670 за сваки елемент у низу, која ће бити нешто што је н квадрат. 550 00:45:45,370 --> 00:45:49,940 Постоје општа питања, као што овде имамо - Ох. 551 00:45:55,290 --> 00:45:58,530 Баш пре неки дан, Даг је тврдио: "Ја сам измислио алгоритам који може сортирати низ 552 00:45:58,530 --> 00:46:01,780 "Од н бројева у О (лог н) време!" 553 00:46:01,780 --> 00:46:04,900 Па како да знамо да је то немогуће? 554 00:46:04,900 --> 00:46:08,850 [Нечујан ученик одговор] >> Да. 555 00:46:08,850 --> 00:46:13,710 У најмању руку, морате да додирнете сваки елемент у низу, 556 00:46:13,710 --> 00:46:16,210 тако да је немогуће да сортирате низ - 557 00:46:16,210 --> 00:46:20,850 Ако је све у некласификовани реду, онда ћемо да се додирује све у низу, 558 00:46:20,850 --> 00:46:25,320 тако да је немогуће то урадити за мање од Ø н. 559 00:46:27,430 --> 00:46:30,340 [Ученик] Ти си нам показао тај пример да буде у стању да то уради у О од н 560 00:46:30,340 --> 00:46:33,920 ако користите пуно меморије. >> Да. 561 00:46:33,920 --> 00:46:37,970 А то је - заборавио сам шта то је - Да ли је то бројање сортирање? 562 00:46:47,360 --> 00:46:51,330 Хмм. То је цео сортирање алгоритам. 563 00:46:59,850 --> 00:47:05,100 Ја сам у потрази за посебан назив за то да не могу да се сетим прошле недеље. 564 00:47:05,100 --> 00:47:13,000 Да. Ово су типови сорти које могу да обављају ствари у великом О од н. 565 00:47:13,000 --> 00:47:18,430 Али постоје ограничења, као што можете да користите само бројеве до одређеног броја. 566 00:47:20,870 --> 00:47:24,560 Плус ако покушавате да сортирате тхат'с нешто - 567 00:47:24,560 --> 00:47:30,750 Ако је ваш низ је 012, -12, 151, 4 милиона, 568 00:47:30,750 --> 00:47:35,120 онда један елемент ће потпуно уништити целу сортирања. 569 00:47:42,060 --> 00:47:44,030 >> Питања? 570 00:47:49,480 --> 00:47:58,870 [Ученик] Ако имате рекурзивно функцију и то само чини Рекурзив позиве 571 00:47:58,870 --> 00:48:02,230 у оквиру повратка изјави, то је реп рекурзивно, 572 00:48:02,230 --> 00:48:07,360 па би да не користе више меморије током извршавања 573 00:48:07,360 --> 00:48:12,550 или би бар користили сличну меморију као итеративни решење? 574 00:48:12,550 --> 00:48:14,530 [Боуден] Да. 575 00:48:14,530 --> 00:48:19,840 То би вероватно бити нешто спорији, али не баш. 576 00:48:19,840 --> 00:48:23,290 Реп рекурзивног је прилично добар. 577 00:48:23,290 --> 00:48:32,640 Гледајући поново стека рамовима, рецимо имамо главни 578 00:48:32,640 --> 00:48:42,920 и имамо инт бар (инт) или тако нешто. 579 00:48:42,920 --> 00:48:52,310 Ово није савршен рекурзивни функција, али повратак бар (к - 1). 580 00:48:52,310 --> 00:48:57,620 Очигледно, ово је погрешна. Треба базу предмете и ствари. 581 00:48:57,620 --> 00:49:00,360 Али идеја је да је ово реп рекурзивни, 582 00:49:00,360 --> 00:49:06,020 што значи да када је главни позива бар што се дешава да се њен оквир стека. 583 00:49:09,550 --> 00:49:12,440 У овом оквиру стека тамо ће бити мало блок меморије 584 00:49:12,440 --> 00:49:17,490 који одговара његовом аргументу к. 585 00:49:17,490 --> 00:49:25,840 И тако рецимо главни деси да позове бар (100); 586 00:49:25,840 --> 00:49:30,050 Дакле, к ће да почне у 100. 587 00:49:30,050 --> 00:49:35,660 Ако компајлер препознаје да је ово реп рекурзивни функција, 588 00:49:35,660 --> 00:49:38,540 онда када бар чини његов рекурзивни позив да забрани, 589 00:49:38,540 --> 00:49:45,490 уместо прављења новог стека оквир, где се стек почиње углавном расте, 590 00:49:45,490 --> 00:49:48,220 на крају то ће наићи на гомилу и онда добијете сегфаултс 591 00:49:48,220 --> 00:49:51,590 јер меморија почиње сударају. 592 00:49:51,590 --> 00:49:54,830 >> Дакле, уместо да своју стек оквир, може реализовати, 593 00:49:54,830 --> 00:49:59,080 хеј, ја стварно не треба да се врати на овај стек оквира, 594 00:49:59,080 --> 00:50:08,040 па уместо да ћу заменити овај аргумент са 99 и онда почне бар свуда. 595 00:50:08,040 --> 00:50:11,810 А онда ће то урадити поново и то ће достићи бар повратка (к - 1), 596 00:50:11,810 --> 00:50:17,320 и уместо прављења новог стека оквир, само ће заменити свој тренутни аргумент са 98 597 00:50:17,320 --> 00:50:20,740 и онда скочите назад на самом почетку бара. 598 00:50:23,860 --> 00:50:30,430 Те операције, замена да је 1 вредност на стек и скакање назад на почетак, 599 00:50:30,430 --> 00:50:32,430 су прилично ефикасан. 600 00:50:32,430 --> 00:50:41,500 Дакле, не само да је ово иста употреба меморије као посебна функција која се итеративни 601 00:50:41,500 --> 00:50:45,390 јер ви само користи 1 стек оквир, али не пате за негативне 602 00:50:45,390 --> 00:50:47,240 потребе да се позове функција. 603 00:50:47,240 --> 00:50:50,240 Позивање функције могу бити нешто скупљи, јер мора да уради све ово подешавање 604 00:50:50,240 --> 00:50:52,470 и мировање и све ове ствари. 605 00:50:52,470 --> 00:50:58,160 Дакле, ово реп рекурзије је добро. 606 00:50:58,160 --> 00:51:01,170 [Ученик] Зашто не ствара нове кораке? 607 00:51:01,170 --> 00:51:02,980 Јер схвата да не треба. 608 00:51:02,980 --> 00:51:07,800 Позив на траци је само враћање рекурзивно позив. 609 00:51:07,800 --> 00:51:12,220 Дакле, не морате ништа да радите са повратном вредношћу. 610 00:51:12,220 --> 00:51:15,120 То ће га одмах врате. 611 00:51:15,120 --> 00:51:20,530 Дакле, то је само ће да замени своју аргументацију и почети испочетка. 612 00:51:20,530 --> 00:51:25,780 Такође, ако немате реп рекурзивно верзију, 613 00:51:25,780 --> 00:51:31,460 онда се све те траке, где, када овај бар се враћа 614 00:51:31,460 --> 00:51:36,010 она мора да врати своју вредност ове, онда бар одмах враћа 615 00:51:36,010 --> 00:51:39,620 и враћа његову вредност ове, онда само ће да се одмах врате 616 00:51:39,620 --> 00:51:41,350 и врати своју вредност овог. 617 00:51:41,350 --> 00:51:45,350 Тако штедите ово искакање све ове ствари искључивање стека 618 00:51:45,350 --> 00:51:48,730 јер повратна вредност је само ће бити донет скроз назад у сваком случају. 619 00:51:48,730 --> 00:51:55,400 Па зашто не замени нашу аргументацију са ажурираним аргумент и испочетка? 620 00:51:57,460 --> 00:52:01,150 Ако функција није реп рекурзивна, ако нешто слично - 621 00:52:01,150 --> 00:52:07,530 [Ученик] ако бар (к + 1). >> Да. 622 00:52:07,530 --> 00:52:11,770 >> Дакле, ако сте га ставили у стању, онда радите нешто са повратном вредношћу. 623 00:52:11,770 --> 00:52:16,260 Или чак и ако само ради повратка 2 * Бар (к - 1). 624 00:52:16,260 --> 00:52:23,560 Дакле, сада бар (к - 1) мора да се врати како би се израчунати 2 пута те вредности, 625 00:52:23,560 --> 00:52:26,140 па сад не треба своју засебну оквир стека, 626 00:52:26,140 --> 00:52:31,180 и сада, без обзира на то колико се ви трудили, ти ћеш морати да - 627 00:52:31,180 --> 00:52:34,410 Ово није реп рекурзивна. 628 00:52:34,410 --> 00:52:37,590 [Ученик] Да покушам да донесе рекурзија да циљ за репа рекурзије - 629 00:52:37,590 --> 00:52:41,450 [Бовден] У идеалном свету, али у ЦС50 не морате. 630 00:52:43,780 --> 00:52:49,280 Да би добили рекурзија реп, генерално, да подесите додатну аргументацију 631 00:52:49,280 --> 00:52:53,550 где ће се бар инт и у 632 00:52:53,550 --> 00:52:56,990 и и одговара крајњи ствар коју желите да се вратите. 633 00:52:56,990 --> 00:53:03,650 Дакле, онда ћеш се вратити бар (к - 1), 2 * и. 634 00:53:03,650 --> 00:53:09,810 Дакле, то је само на високом нивоу како трансформисати ствари буду реп рекурзивно. 635 00:53:09,810 --> 00:53:13,790 Али екстра аргумент - 636 00:53:13,790 --> 00:53:17,410 И онда на крају, када стигнете на базу случај, само вратите и 637 00:53:17,410 --> 00:53:22,740 јер сте били гомилају све време повратну вредност коју желите. 638 00:53:22,740 --> 00:53:27,280 Некако су га радили итеративно али коришћењем рекурзивног позива. 639 00:53:32,510 --> 00:53:34,900 Питања? 640 00:53:34,900 --> 00:53:39,890 [Ученик] Можда око показивача аритметици, као када користите жице. >> Наравно. 641 00:53:39,890 --> 00:53:43,610 Показивач аритметика. 642 00:53:43,610 --> 00:53:48,440 Када користите конце то је лако, јер су жице цхар звезде, 643 00:53:48,440 --> 00:53:51,860 слова су заувек и увек један бајт, 644 00:53:51,860 --> 00:53:57,540 па показивач аритметика је еквивалентно редовном аритметике, када имате посла са стринговима. 645 00:53:57,540 --> 00:54:08,790 Рецимо цхар * с = "здраво". 646 00:54:08,790 --> 00:54:11,430 Дакле, имамо блок у меморији. 647 00:54:19,490 --> 00:54:22,380 Потребно је 6 бајта јер увек треба нулл Терминатор. 648 00:54:22,380 --> 00:54:28,620 И цхар * с ће указати на почетку овог низа. 649 00:54:28,620 --> 00:54:32,830 Тако је тамо поена. 650 00:54:32,830 --> 00:54:36,710 Дакле, ово је у основи како било низ ради, 651 00:54:36,710 --> 00:54:40,780 без обзира на то да ли је повратак тако маллоц или да ли је на стеку. 652 00:54:40,780 --> 00:54:47,110 Било је у основи низ показивач на почетак низа, 653 00:54:47,110 --> 00:54:53,640 и онда сваки низ операција, било индексирање, тек иде у том низу одређени офсет. 654 00:54:53,640 --> 00:55:05,360 >> Дакле, када кажем нешто као с [3], а то ће се с бројањем и 3 знакова за 655 00:55:05,360 --> 00:55:12,490 Дакле, с [3], имамо 0, 1, 2, 3, па с [3] ће да се односи на ову л. 656 00:55:12,490 --> 00:55:20,460 [Ученик] И ми смо могли достићи исту вредност радећи с + 3, а затим заграде звезда? 657 00:55:20,460 --> 00:55:22,570 Да. 658 00:55:22,570 --> 00:55:26,010 Ово је еквивалентно * (с + 3); 659 00:55:26,010 --> 00:55:31,240 и то је заувек и увек еквивалент без обзира шта радите. 660 00:55:31,240 --> 00:55:34,070 Ви никада нећете морати да користите синтаксу носача. 661 00:55:34,070 --> 00:55:37,770 Увек можете користити * (а + 3) синтакса. 662 00:55:37,770 --> 00:55:40,180 Људи су склони да воле синтаксу носача, мада. 663 00:55:40,180 --> 00:55:43,860 [Ученик] Дакле, сви низови су заправо само показивачи. 664 00:55:43,860 --> 00:55:53,630 Постоји благи разлика када кажем инт [4]; >> [ученик] Да ли то створити памћење? 665 00:55:53,630 --> 00:56:03,320 [Бовден] То ће створити 4 Интс на стек, тако да 16 бајтова укупно. 666 00:56:03,320 --> 00:56:05,700 То ће створити 16 бајтова на стек. 667 00:56:05,700 --> 00:56:09,190 к се не чувају нигде. 668 00:56:09,190 --> 00:56:13,420 То је само симбол који се односи на почетак ствари. 669 00:56:13,420 --> 00:56:17,680 Зато што је прогласио низ унутар ове функције, 670 00:56:17,680 --> 00:56:22,340 шта компајлер ће да уради је само заменити све инстанце променљиве к 671 00:56:22,340 --> 00:56:26,400 са којима се десило да изаберете да ове 16 бајтова. 672 00:56:26,400 --> 00:56:30,040 Не могу то да урадим са цхар * с, јер је с стварна показивач. 673 00:56:30,040 --> 00:56:32,380 Слободно је тада указати на друге ствари. 674 00:56:32,380 --> 00:56:36,140 к је константа. Ви не можете да га тачку на други низ. >> [Ученик] Ок. 675 00:56:36,140 --> 00:56:43,420 Али та идеја, та индексирање је иста, без обзира на то да ли је традиционална низ 676 00:56:43,420 --> 00:56:48,230 или ако је показивач на нешто или ако је показивач на маллоцед низа. 677 00:56:48,230 --> 00:56:59,770 А у ствари, то је тако да је еквивалентна је иста ствар. 678 00:56:59,770 --> 00:57:05,440 То је само заправо претвара оно што је унутар заграда и шта је остало од заграда, 679 00:57:05,440 --> 00:57:07,970 додаје их заједно, и дереференцес. 680 00:57:07,970 --> 00:57:14,710 Дакле, ово је исто тако важи као * (а + 3), или с [3]. 681 00:57:16,210 --> 00:57:22,090 [Ученик] Да ли имате савете упућују на 2-димензионалним низовима? 682 00:57:22,090 --> 00:57:27,380 >> То је теже. Традиционално, не. 683 00:57:27,380 --> 00:57:34,720 2-димензионални низ је само 1-димензионални низ са неком погодном синтаксе 684 00:57:34,720 --> 00:57:54,110 јер када сам рекао инт [3] [3], ово је стварно само 1 низ са 9 вредностима. 685 00:57:55,500 --> 00:58:03,000 И тако, када сам индекс, компајлер зна шта мислим. 686 00:58:03,000 --> 00:58:13,090 Ако кажем к [1] ​​[2], зна желим да идем у други ред, тако да ће прескочити прву 3, 687 00:58:13,090 --> 00:58:17,460 а онда жели другу ствар у томе, тако да се дешава да се овај један. 688 00:58:17,460 --> 00:58:20,480 Али још увек је само једна-димензионални низ. 689 00:58:20,480 --> 00:58:23,660 И тако ако сам желео да додели показивач на том низу, 690 00:58:23,660 --> 00:58:29,770 Ја бих рекао инт * п = к; 691 00:58:29,770 --> 00:58:33,220 Тип Кс је само - 692 00:58:33,220 --> 00:58:38,280 То је груба каже тип к јер је само симбол и то није стварна променљива, 693 00:58:38,280 --> 00:58:40,140 али то је само инт *. 694 00:58:40,140 --> 00:58:44,840 к је само показивач на почетак ове. >> [Ученик] Ок. 695 00:58:44,840 --> 00:58:52,560 И тако сам неће моћи да приступи [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Мислим да постоји посебна синтакса за декларисање показивач, 697 00:58:58,370 --> 00:59:12,480 нешто смешно као инт (* п [-. нешто апсолутно смешно Ја чак и не знам. 698 00:59:12,480 --> 00:59:17,090 Али постоји синтакса за декларисање тројки као и са заградама и ствари. 699 00:59:17,090 --> 00:59:22,960 То не може ни да то урадиш. 700 00:59:22,960 --> 00:59:26,640 Могао се осврнем на нешто што би ми рећи истину. 701 00:59:26,640 --> 00:59:34,160 Ја ћу тражити касније, уколико постоји синтакса за тачку. Али никада нећете видети. 702 00:59:34,160 --> 00:59:39,670 А чак и синтакса је толико архаично да ако га користите, људи ће бити збуњени. 703 00:59:39,670 --> 00:59:43,540 Мултидимензионални низови су прилично ретки као што јесте. 704 00:59:43,540 --> 00:59:44,630 Ти прилично - 705 00:59:44,630 --> 00:59:48,490 Па, ако радите матрице ствари то неће бити ретки, 706 00:59:48,490 --> 00:59:56,730 али у Ц ретко ћете се користи мултидимензионалне низове. 707 00:59:57,630 --> 01:00:00,470 Да. >> [Ученик] Рецимо да имате стварно дугачку низ. 708 01:00:00,470 --> 01:00:03,900 >> Дакле, у виртуелну меморију изгледа да се све узастопно, 709 01:00:03,900 --> 01:00:05,640 као елемената право поред другог, 710 01:00:05,640 --> 01:00:08,770 али у физичке меморије, да ли би било могуће да се то подели? >> Да. 711 01:00:08,770 --> 01:00:16,860 Како виртуелна меморија ради се само раздваја - 712 01:00:19,220 --> 01:00:24,860 Јединица алокације је страница, која тежи да буде 4 килобајта, 713 01:00:24,860 --> 01:00:29,680 па кад процес, каже, хеј, желим да искористим ову меморију, 714 01:00:29,680 --> 01:00:35,970 оперативни систем ће га издвојити 4 килобајта за тог малог блока меморије. 715 01:00:35,970 --> 01:00:39,100 Чак и ако користите само један мали бајт у целом блоку меморије, 716 01:00:39,100 --> 01:00:42,850 оперативни систем ће му дати пуну 4 килобајта. 717 01:00:42,850 --> 01:00:49,410 Дакле, шта то значи, могао сам - хајде да кажем да је ово мој стек. 718 01:00:49,410 --> 01:00:53,180 Овај стек може бити раздвојене. Мој стек може бити мегабајта и мегабајта. 719 01:00:53,180 --> 01:00:55,020 Мој стек може бити огромна. 720 01:00:55,020 --> 01:01:00,220 Али сама стек мора да буде подељен на појединачним страницама, 721 01:01:00,220 --> 01:01:09,010 који ако се осврнемо на овамо рецимо ово је наша РАМ-а, 722 01:01:09,010 --> 01:01:16,600 ако имам 2 гигабајта РАМ-а, ово је стварна адреса 0 попут нулте бајт моје меморије, 723 01:01:16,600 --> 01:01:22,210 а то је 2 гигабајта скроз доле. 724 01:01:22,210 --> 01:01:27,230 Дакле, ова страница може да одговарају овом блоку овамо. 725 01:01:27,230 --> 01:01:29,400 Ова страница може да одговарају овом блоку овамо. 726 01:01:29,400 --> 01:01:31,560 Ово би се могло одговарају ове овамо. 727 01:01:31,560 --> 01:01:35,540 Дакле, оперативни систем је слободан да додели физичку меморију 728 01:01:35,540 --> 01:01:39,320 на сваком појединачном страну произвољно. 729 01:01:39,320 --> 01:01:46,180 А то значи да, ако та граница деси уракљити низ, 730 01:01:46,180 --> 01:01:50,070 низа се дешава да се лево од овог и право тог поретка у страну, 731 01:01:50,070 --> 01:01:54,460 онда низа ће бити подељен у физичкој меморији. 732 01:01:54,460 --> 01:01:59,280 И онда када затворите програм, када се процес заврши, 733 01:01:59,280 --> 01:02:05,690 ови мапирања се брише, а онда је слободан да користите ове мале блокове за друге ствари. 734 01:02:14,730 --> 01:02:17,410 Још питања? 735 01:02:17,410 --> 01:02:19,960 [Ученик] показивач аритметика. >> О, да. 736 01:02:19,960 --> 01:02:28,410 Жице су биле лакше, али гледајући тако нешто Интс, 737 01:02:28,410 --> 01:02:35,000 па назад на инт [4]; 738 01:02:35,000 --> 01:02:41,810 Да ли је ово низ или да ли је показивач на маллоцед низ целих бројева 4, 739 01:02:41,810 --> 01:02:47,060 то ће бити третирани на исти начин. 740 01:02:50,590 --> 01:02:53,340 [Ученик] Дакле низови су на гомили? 741 01:03:01,400 --> 01:03:05,270 [Бовден] Низови нису на гомили. >> [Ученик] О. 742 01:03:05,270 --> 01:03:08,320 >> [Бовден] Овај тип низа тежи да буде на стек 743 01:03:08,320 --> 01:03:12,220 осим ако га проглашен на - игнорисање глобалне променљиве. Немојте користити глобалне променљиве. 744 01:03:12,220 --> 01:03:16,280 Унутар функције кажем инт [4]; 745 01:03:16,280 --> 01:03:22,520 То ће створити 4-цео блок на стек за овај низ. 746 01:03:22,520 --> 01:03:26,960 Али ово маллоц (4 * сизеоф (инт)); ће ићи на гомили. 747 01:03:26,960 --> 01:03:31,870 Али после ове тачке могу користити к и п у скоро на исти начин, 748 01:03:31,870 --> 01:03:36,140 осим изузетака сам рекао пре него што о томе можете распоредити стр. 749 01:03:36,140 --> 01:03:40,960 Технички, њихове величине су нешто другачије, али то је потпуно ирелевантно. 750 01:03:40,960 --> 01:03:43,310 Ти стварно никад не користи своје величине. 751 01:03:48,020 --> 01:03:56,810 П Могу да кажем п [3] = 2; или к [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Можете их користити на потпуно исти начин. 753 01:03:59,680 --> 01:04:01,570 Дакле показивач аритметика сада - Да. 754 01:04:01,570 --> 01:04:07,390 [Ученик] Зар не треба да урадите п * ако имате заграде? 755 01:04:07,390 --> 01:04:11,720 Заграде су имплицитни дереференце. >> Реду. 756 01:04:11,720 --> 01:04:20,200 Заправо, и оно што ви говорите са можете добити мултидимензионалне низове 757 01:04:20,200 --> 01:05:02,650 са показивачима, шта можете да урадите нешто као, рецимо, инт ** пп = маллоц (сизеоф (инт *) * 5); 758 01:05:02,650 --> 01:05:06,900 Ја ћу написати све из прве. 759 01:05:37,880 --> 01:05:41,020 Нисам хтео то. 760 01:05:41,020 --> 01:05:42,550 Ок. 761 01:05:42,550 --> 01:05:48,910 Оно што сам овде урадио је - То би требало да буде пп [и]. 762 01:05:48,910 --> 01:05:53,680 Дакле, ПП је показивач на показивач. 763 01:05:53,680 --> 01:06:02,420 Ти маллоцинг ПП да укаже на низ од 5 инт звезда. 764 01:06:02,420 --> 01:06:10,950 Дакле, у меморији имате на стек стр 765 01:06:10,950 --> 01:06:20,150 То ће указати на низ од 5 блокова који су све сами показивачи. 766 01:06:20,150 --> 01:06:28,210 И онда када сам маллоц овде доле, ја маллоц да свака од тих појединачних показивача 767 01:06:28,210 --> 01:06:32,080 треба да укаже на посебном блоку 4 бајта на гомили. 768 01:06:32,080 --> 01:06:35,870 Дакле, ово указује на 4 бајта. 769 01:06:37,940 --> 01:06:40,660 А ово указује на неку другу 4 бајта. 770 01:06:40,660 --> 01:06:43,200 >> И сви они указују на своје 4 бајта. 771 01:06:43,200 --> 01:06:49,080 То ми даје начин рада мултидимензионалне ствари. 772 01:06:49,080 --> 01:06:58,030 Могу да кажем ПП [3] [4], али сада ово није иста ствар као мултидимензионалне низове 773 01:06:58,030 --> 01:07:05,390 јер вишедимензионе низови се преведе [3] [4] у један офсет у к низу. 774 01:07:05,390 --> 01:07:14,790 Ово дереференцес п приступа треће индекса, онда дереференцес да 775 01:07:14,790 --> 01:07:20,790 и пристапи - 4 ће бити неважећа - други индекс. 776 01:07:24,770 --> 01:07:31,430 Док када смо имали инт [3] [4] пре као вишедимензионални низ 777 01:07:31,430 --> 01:07:35,740 а када двапут носач то је заиста само један дереференце, 778 01:07:35,740 --> 01:07:40,490 да сте пратили један показивач и онда офсет, 779 01:07:40,490 --> 01:07:42,850 ово је стварно 2Д референце. 780 01:07:42,850 --> 01:07:45,840 Ви пратите 2 одвојене показиваче. 781 01:07:45,840 --> 01:07:50,420 Дакле, ово је такође технички омогућава вам да имате мултидимензионалне низове 782 01:07:50,420 --> 01:07:53,550 где је сваки појединац низ је различите величине. 783 01:07:53,550 --> 01:07:58,000 Тако да мислим да Јаггед вишедимензионе низови је оно што се зове 784 01:07:58,000 --> 01:08:01,870 јер заиста прва ствар могла указати на нешто што има 10 елемената, 785 01:08:01,870 --> 01:08:05,540 Друга ствар могла указати на нешто што има 100 елемената. 786 01:08:05,540 --> 01:08:10,790 [Ученик] Да ли постоји ограничење броја показивача можете имати 787 01:08:10,790 --> 01:08:14,290 указујући на друге тројке? Но >> 788 01:08:14,290 --> 01:08:17,010 Можете имати инт ***** стр. 789 01:08:18,050 --> 01:08:23,760 Назад на показивач аритметике - >> [ученик] О. >> Да. 790 01:08:23,760 --> 01:08:35,649 [Ученик] Ако имам инт *** п, а онда радим дереференцинг и кажем п * једнака овој вредности, 791 01:08:35,649 --> 01:08:39,560 је само да уради 1 степен дереференцинг? >> Да. 792 01:08:39,560 --> 01:08:43,340 Дакле, ако желим да приступите ствар да је последњи показивач упућује на - 793 01:08:43,340 --> 01:08:46,210 Онда ти *** п. >> Реду. 794 01:08:46,210 --> 01:08:54,080 Дакле, ово је п указује на 1 блок, указује на још једног блока, указује на други блок. 795 01:08:54,080 --> 01:09:02,010 Онда ако ти * п = нешто друго, онда се мењају ово 796 01:09:02,010 --> 01:09:13,640 до сада указују на другом блоку. >> Реду. 797 01:09:13,640 --> 01:09:17,649 >> [Бовден] А ако њих су маллоцед, онда сте сада су процуриле меморију 798 01:09:17,649 --> 01:09:20,430 ако се деси да имају различите референце ових 799 01:09:20,430 --> 01:09:25,270 јер не можете да се вратим на оне које сте управо бацио. 800 01:09:25,270 --> 01:09:29,550 Показивач аритметика. 801 01:09:29,550 --> 01:09:36,310 инт [4]; ће доделити низ целих бројева 4 802 01:09:36,310 --> 01:09:40,670 где је к ће да укаже на почетак низа. 803 01:09:40,670 --> 01:09:50,420 Дакле, када кажем нешто као Кс [1], а ја желим да то значи ићи на други цели број у низу, 804 01:09:50,420 --> 01:09:53,319 што би био овај. 805 01:09:53,319 --> 01:10:04,190 Али стварно, то је 4 бајта у низу јер цео заузима 4 бајта. 806 01:10:04,190 --> 01:10:08,470 Дакле, оффсет оф 1 заиста значи оффсет оф 1 807 01:10:08,470 --> 01:10:12,030 пута већи од било ког типа низа је. 808 01:10:12,030 --> 01:10:17,170 То је низ целих бројева, тако да зна да уради 1 пута величину инт када жели да надокнади. 809 01:10:17,170 --> 01:10:25,260 Друга синтакса. Запамтите да је ово еквивалент * (к + 1); 810 01:10:25,260 --> 01:10:35,250 Када кажем показивач + 1, шта то враћа се адреса која показивач складиштење 811 01:10:35,250 --> 01:10:40,360 плус 1 пута већи од типа показивача. 812 01:10:40,360 --> 01:10:59,510 Дакле, ако је к = ок100, тада к + 1 = ок104. 813 01:10:59,510 --> 01:11:19,750 И можете злоупотребљава ово и кажу нешто као цхар * ц = (цхар *) к; 814 01:11:19,750 --> 01:11:23,050 и сада се ц ће бити иста адреса као и к. 815 01:11:23,050 --> 01:11:26,040 ц ће бити једнака ок100, 816 01:11:26,040 --> 01:11:31,490 али ц + 1 ће бити једнака ок101 817 01:11:31,490 --> 01:11:38,030 јер показивач аритметика зависи од типа показивача који се додавањем. 818 01:11:38,030 --> 01:11:45,390 Дакле, ц + 1, то изгледа на ц, то је знак показивач, па ће додати 1 пута величину цхар, 819 01:11:45,390 --> 01:11:48,110 која ће увек бити 1, тако да ћете добити 101, 820 01:11:48,110 --> 01:11:54,890 а ако урадим к, што је такође још 100, к + 1 ће бити 104. 821 01:11:56,660 --> 01:12:06,340 [Ученик] Да ли користите Ц + + у циљу унапређења показивач за 1? 822 01:12:06,340 --> 01:12:09,810 Да, можеш. 823 01:12:09,810 --> 01:12:16,180 Не могу то да урадим са к, јер је к само симбол, то је константа, ви не можете да промените к. 824 01:12:16,180 --> 01:12:22,610 >> Али, ц деси да буде само показивач, па ц + + је савршено важећа и да ће повећавати до 1. 825 01:12:22,610 --> 01:12:32,440 Ако су само ц инт *, а затим ц + + бити 104. 826 01:12:32,440 --> 01:12:41,250 + + Не показивач аритметика као ц + 1 морати урадити показивача аритметике. 827 01:12:43,000 --> 01:12:48,870 Ово је заправо колико много ствари попут стапања врсте - 828 01:12:49,670 --> 01:12:55,710 Уместо стварања копије ствари, уместо тога можете проћи - 829 01:12:55,710 --> 01:13:02,400 Као да сам хтео да прође ову половину низа - Идемо обришете неке од овога. 830 01:13:04,770 --> 01:13:10,520 Рецимо да сам хтео да прође ову страну низа у функцију. 831 01:13:10,520 --> 01:13:12,700 Оно што бих ја прећи на ту функцију? 832 01:13:12,700 --> 01:13:17,050 Ако прођем к, ја сам пролазећи ову адресу. 833 01:13:17,050 --> 01:13:23,780 Али ја желим да прође овај посебан адресу. Дакле, шта треба да прође? 834 01:13:23,780 --> 01:13:26,590 [Ученик] Показивач + 2? 835 01:13:26,590 --> 01:13:29,350 [Бовден] Дакле, к + 2. Да. 836 01:13:29,350 --> 01:13:31,620 То ће бити ова адреса. 837 01:13:31,620 --> 01:13:42,810 Такође ћете врло често га виде као к [2], а затим адресу тога. 838 01:13:42,810 --> 01:13:47,850 Дакле, потребно је да се адресу томе, јер носач је имплицитна дереференце. 839 01:13:47,850 --> 01:13:53,250 к [2] се односи на вредност која је у овом пољу, а затим желите адресу тој кутији, 840 01:13:53,250 --> 01:13:56,850 тако кажеш & к [2]. 841 01:13:56,850 --> 01:14:02,880 Дакле, то је нешто у томе како стапања врсти где желите да прође пола листу нешто 842 01:14:02,880 --> 01:14:08,790 само заиста проћи & к [2], а сада колико рекурзивни позив тиче, 843 01:14:08,790 --> 01:14:12,510 мој нови низ почиње тамо. 844 01:14:12,510 --> 01:14:15,130 Ласт минуте питања. 845 01:14:15,130 --> 01:14:20,050 [Ученик] Ако ми не стављамо амперсанд или - шта је то зове? >> Звезда? 846 01:14:20,050 --> 01:14:23,200 [Ученик] Звезда. >> Технички, дереференце оператера, али - >> [ученик] дереференце. 847 01:14:23,200 --> 01:14:29,310 >> Ако ми не стављамо звезду или амперсанд, шта се дешава ако сам само да кажем и = к и к је показивач? 848 01:14:29,310 --> 01:14:34,620 Шта је тип и? >> [Ученик] Ја ћу само рећи да је показивач 2. 849 01:14:34,620 --> 01:14:38,270 Дакле, ако сте управо рекли и = к, сада Кс и И указује на исту ствар. >> [Ученик] указују на исту ствар. 850 01:14:38,270 --> 01:14:45,180 А ако је к инт показивач? >> То би се жале зато што не можете доделити показиваче. 851 01:14:45,180 --> 01:14:46,540 [Ученик] Ок. 852 01:14:46,540 --> 01:14:51,860 Запамтите да показиваче, иако смо их извући као стрелице, 853 01:14:51,860 --> 01:15:02,010 Стварно сви они продавница - инт * к - заиста све је к складиштење је нешто попут ок100, 854 01:15:02,010 --> 01:15:06,490 који смо се деси да представљају указујући на блоку ускладиштене на 100. 855 01:15:06,490 --> 01:15:19,660 Дакле, када кажем инт * и = к, ја сам само копирање ок100 у и, 856 01:15:19,660 --> 01:15:24,630 који смо управо идемо да представљају и, такође указује на ок100. 857 01:15:24,630 --> 01:15:39,810 А ако кажем инт = (инт) к онда сам се дешава да складишти обзира вредност ок100 је 858 01:15:39,810 --> 01:15:45,100 унутар њега, али сада ће се тумачити као цео број уместо показивачем. 859 01:15:45,100 --> 01:15:49,310 Али морате екипи или ће жалити. 860 01:15:49,310 --> 01:15:53,300 [Ученик] Дакле, да ли мислите да се баци - 861 01:15:53,300 --> 01:16:00,290 Да ли ће то бити кастинг за инт к или и ливење инт? 862 01:16:00,290 --> 01:16:03,700 [Бовден] Шта? 863 01:16:03,700 --> 01:16:07,690 [Ученик] Ок. Након ових заграда се тамо ће бити к или аи тамо? 864 01:16:07,690 --> 01:16:11,500 >> [Боуден] Свеједно. к и и су еквивалентна. >> [Ученик] Ок. 865 01:16:11,500 --> 01:16:14,390 Зато што су оба показивачи. >> Да. 866 01:16:14,390 --> 01:16:21,050 [Ученик] Дакле, било би држати хексадецимални 100 у цео облику? >> [Боуден] Да. 867 01:16:21,050 --> 01:16:23,620 Али не вредност без обзира на то указује на. 868 01:16:23,620 --> 01:16:29,940 [Боуден] Да. >> [Ученик] Дакле, само адреса у цео облику. Ок. 869 01:16:29,940 --> 01:16:34,720 [Бовден] Ако си хтео да се за неког бизарног разлога, 870 01:16:34,720 --> 01:16:38,900 можете ексклузивно да се баве тројке и никад се баве целих 871 01:16:38,900 --> 01:16:49,240 и само бити као инт * к = 0. 872 01:16:49,240 --> 01:16:53,000 Онда ћеш да се заиста збуњени када показивач аритметичка почиње дешава. 873 01:16:53,000 --> 01:16:56,570 Дакле, бројеви који су продавници су бесмислени. 874 01:16:56,570 --> 01:16:58,940 То је само како се завршити тумаче их. 875 01:16:58,940 --> 01:17:02,920 Тако да сам слободан да копирате ок100 из инт * на инт, 876 01:17:02,920 --> 01:17:07,790 и ја сам слободан да додели - Ти вероватно ће се викао на за ливење не - 877 01:17:07,790 --> 01:17:18,160 Ја сам слободан да додели нешто (инт *) ок1234 у овом произвољног инт *. 878 01:17:18,160 --> 01:17:25,480 Дакле ок123 једнако валидна меморијска адреса, као што је и и. 879 01:17:25,480 --> 01:17:32,060 & И дешава да се врати нешто што је прилично ок123. 880 01:17:32,060 --> 01:17:35,430 [Ученик] Да ли је то било стварно супер начин да се иде од хексадецимални до децималном облику, 881 01:17:35,430 --> 01:17:39,230 свиђа ако имате показивач и баци га као инт? 882 01:17:39,230 --> 01:17:44,860 [Бовден] Можете заиста само штампање помоћу попут принтф. 883 01:17:44,860 --> 01:17:50,300 Рецимо ја имам инт и = 100. 884 01:17:50,300 --> 01:18:02,700 Дакле принтф (% д \ н - као што је већ требало да знате - да одштампате као цео број,% к. 885 01:18:02,700 --> 01:18:05,190 Само ћемо одштампати као хексадецимални. 886 01:18:05,190 --> 01:18:10,760 Дакле, показивач се не памти као хексадецимални, 887 01:18:10,760 --> 01:18:12,960 и цео се не чува као децимални. 888 01:18:12,960 --> 01:18:14,700 Све се чува као бинарни. 889 01:18:14,700 --> 01:18:17,950 То је само да смо склони да покажемо показиваче као хексадецимални 890 01:18:17,950 --> 01:18:23,260 јер мислимо да ствари у ових 4-бајта блока, 891 01:18:23,260 --> 01:18:25,390 и меморијска адресе имају тенденцију да буду упознати. 892 01:18:25,390 --> 01:18:28,890 Ми смо као, ако се почиње са бф, онда се деси да буде на стек. 893 01:18:28,890 --> 01:18:35,560 Дакле, то је само наша интерпретација показивача као хексадецимални. 894 01:18:35,560 --> 01:18:39,200 Ок. Било последње питање? 895 01:18:39,200 --> 01:18:41,700 >> Ја ћу бити овде мало после, ако имате нешто друго. 896 01:18:41,700 --> 01:18:46,070 И то је крај тога. 897 01:18:46,070 --> 01:18:48,360 >> [Ученик] Ура! [Аплауз] 898 01:18:51,440 --> 01:18:53,000 >> [ЦС50.ТВ]