[Powered by Google Translate] [Одељак 4 - Више Удобан]
[Роб Бовден - Универзитет Харвард]
[Ово је ЦС50. - ЦС50.ТВ]
Имамо квиз сутра, у случају ви не знате.
То је у суштини о свему што је могао да види у класи, или би требало да се види у класи.
То укључује показиваче, иако су врло недавно тема.
Требало би барем разуме висок ниво њих.
Све што је отишао преко у класи треба разумети на квизу.
Дакле, ако имате питања о њима, можете их питати сада.
Али ово ће бити веома ученик предводи седница где ви постављате питања,
па надамо људи имају питања.
Да ли неко има питања?
Да. >> [Ученик] Да ли иду преко показивача поново?
Ја ћу ићи преко показивача.
Сви ваши варијабли нужно живи у меморији,
али обично не брини о томе, а ви само да кажем к + 2 и и + 3
и компајлер ће схватити где су ствари живе за вас.
Када имате посла са показивачима, сада експлицитно користите те меморијске адресе.
Дакле, једна променљива ће икада живети на једној адреси у сваком датом тренутку.
Ако желимо да прогласи показивача, што је тип ће изгледати?
>> Желим да прогласи п показивач. Шта тип изгледа?
[Ученик] инт * п. >> Да. Дакле, инт * п.
И како ја да га истакнем на к? >> [Ученик] Амперсанд.
[Бовден] Дакле амперсанд дословно назива адреса оператера.
Дакле, када кажем & к то је добијање меморијску адресу променљиве к.
Тако да сада имам показивач п, и свуда у мом коду могу користити * П
или могу користити к и то ће бити потпуно исти ствар.
(* П). Шта је ово радиш? Шта то значи звезда?
[Ученик] То значи вредност у том тренутку. >> Да.
Дакле, ако гледамо на то, може бити веома корисно да извуче дијаграме
где је то кутијица меморије за к, која се дешава да имају вредност 4,
онда имамо малу кутију меморије за п,
па п указује на к, па скрећемо стрелицу са стр до к.
Дакле, када кажемо * п говоримо ићи на поље које је п.
Звезда је пратите стрелицу и онда да шта год хоћеш са том пољу тамо.
Тако да могу да кажем * п = 7, и да ће ићи на поље које је к и промене које до 7 година.
Или бих могао да кажем инт з = * п * 2; То је збуњујуће, јер то је звезда, звезда.
Онај звезда дереференцинг п, друга звезда множиш 2.
Обавештење Могао сам исто тако добро заменио * п са к.
Можете их користити на исти начин.
А онда касније могу имати п тачку на потпуно нову ствар.
Ја само могу да кажем п = &з;
Дакле, сада више не п поена на Кс, то указује на з.
И сваки пут ја * П то је исто као ради з.
Дакле, корисна ствар је када почнемо улазим функција.
>> То је врста бескористан прогласи показивач који указује на нешто
и онда ти само то дереференцинг
када би сте користили оригиналну променљиву за почетак.
Али када уђете у функцијама - па хајде да кажемо да имамо неку функцију, инт фоо,
који узима показивач и само ради * п = 6;
Као што смо видели раније са заменом, не можете да урадите ефикасну размену и посебан функцију
за само доношењем бројеве, јер је све у Ц увек пролази по вредности.
Чак и када сте пролазу тројке сте пролазили вредности.
Тако се дешава да управо те вредности су меморијске адресе.
Дакле, када кажем трла (п) ја положеног показивач на функцију фоо
и онда трла ради * п = 6;
Дакле, унутар те функције, * п је увек једнак к,
али ја не могу да користе к унутар те функције, јер није сцопед у тој функцији.
Дакле, * п = 6 је једини начин да се приступи локалну променљиву из друге функције.
Или, добро, показивачи су једини начин да се приступи локалну променљиву из друге функције.
[Ученик] Хајде да кажемо да је желео да врати показивач. Како тачно то радиш?
[Бовден] Повратак показивач као у нешто попут инт и = 3; повратак & и? >> [Ученик] Да.
[Боуден] Ок. Никада не треба да урадите ово. Ово је лоше.
Мислим да сам видео у овим предавањима слајдове сте почели видели цео овај дијаграм меморије
где се овде имаш меморијску адресу 0
а овде имате меморијску адресу 4 свирке или 2 на 32.
Па онда имаш неке ствари и неке ствари и онда имате гомилу
и ти имаш свој гомилу, који сте управо почели да уче о томе, одрастању.
[Ученик] Зар није гомила изнад стек?
>> Да. Гомиле је на врху, зар не? >> [Ученик] Па, ставио 0 на врху.
[Ученик] О, ставио 0 на врху. >> [Ученик] Ох, у реду.
Напомена: Било где са ЦС50 идете да видите да на овај начин. >> [Ученик] Ок.
То је само да када први пут видимо гомиле,
волим када помислите на гомилу мислите гомилања ствари на врху једне другима.
Зато смо склони да окренете ово око тако стек расте као стек иначе
уместо гомиле виси надоле. >> [Ученик] Не гомиле технички одрастају превише, иако?
То зависи од тога шта подразумевате под одрасту.
Штек и гомила увек расте у супротним правцима.
Стек се увек одраста у смислу да је то одрастање
ка вишим меморијске адресе и хеап расте доле
у томе што расте ка нижим меморијским адресама.
Дакле, на врху је 0, а доња је висок меморијске адресе.
Они обоје расте, само у супротстављању правце.
[Ученик] сам мислио зато што сте рекли да сте ставили штос на дну
јер изгледа више интуитивно, јер за стека да почне на врху гомиле,
Гомила је на врху себе превише, па то је - >> Да.
Такође мислим на гомилу као одрастање и већи, али је стек више.
Дакле, стек је онај који смо некако желим да покажем одрастања.
Али свуда другачије изгледају ће показати адресу 0 у врху
а највиша меморијска адреса на дну, тако да је ово ваш уобичајени приказ меморије.
>> Да ли имате неко питање?
[Ученик] Можете ли нам рећи нешто више о гомили?
Да. Ја ћу на то за тренутак.
Прво, да се вратимо на повратку зашто & И је лоша ствар,
на стек имате гомилу стека кадрова који представљају све функције
који су позвани.
Дакле игнорисање претходне ствари, врх вашег стека увек ће бити главна функција
пошто је то прва функција, а која се зове.
И онда када позовете другу функцију, стек ће расти доле.
Дакле, ако ја зовем неку функцију, Фоо, и добија своју стека оквир,
може да позове неку функцију, бар, она добија свој стек оквир.
А бар би могао да буде рекурзивна и могло се зовем,
и тако да други позив на траци ће добити свој оквир стека.
И шта се у тим оквирима стека су све од локалних променљивих
и све функције које аргумената -
Све ствари које су локално сцопед овој функцији иду у овим оквирима стека.
Значи, када сам рекао нешто као бара је функција,
Ја ћу само да прогласи цео број, а затим се вратите показивач на тај цео број.
Па одакле год живите?
[Ученик] год живи у бару. >> [Боуден] Да.
Негде у овом малом тргу меморије литтлер квадрат који има год у њему.
Када се вратим и и, ја враћам показивач на овом малом блоку меморије.
Али онда када функција враћа, њен оквир стек буде појавио ван штос.
И то је разлог зашто се то зове стек.
То је као структуре података стека, ако знате шта је то.
Или чак као гомилу каблова је увек пример,
Главни је да идем на дну, онда прва функција зовете ће ићи на врху тога,
и не могу да се вратим на главни док се не врати из свих функција које су позвали
који су постављени на врху.
>> [Ученик] Дакле, ако сте урадили урадите вратите & И, та вредност је подложни промени без најаве.
Да, то је - >> [ученик] То може бити замењена. >> Да.
У потпуности је - Ако покушате и -
То би такође бити инт * бар зато што се враћа показивач,
па његов тип повратак је инт *.
Ако покушате да користите повратну вредност ове функције, то је недефинисан понашање
јер показивач указује на лоше памћење. >> [Ученик] Ок.
Па шта ако је, на пример, изјавио инт * и = маллоц (сизеоф (инт))?
То је боље. Да.
[Ученик] Разговарали смо о томе како, када смо превуците ствари у нашу корпу за отпатке
Ниси они заправо избрисати, само смо изгубили показиваче.
Дакле, у овом случају не можемо заправо брише вредност или је то још увек постоји у меморији?
За највећи део, то ће и даље бити тамо.
Али, хајде да кажемо да се деси да позове неку другу функцију, Баз.
Баз ће добити свој оквир стека овде.
То ће бити брисе све ове ствари,
и онда ако касније покушате да користите показивач који сте добили раније,
то неће бити иста вредност.
То ће управо променио зато што се зове функција Баз.
[Ученик] Али да нисмо, да ли би ми и даље добити 3?
[Бовден] У свему судећи, ти би.
Али, не можете ослонити на то. Ц само каже недефинисано понашање.
>> [Ученик] Ох, не. Ок.
Дакле, када желите да се вратите показивач, ово је место где маллоц долази у употреби.
Ја сам заправо писао управо вратили маллоц (3 * сизеоф (инт)).
Ми ћемо ићи преко маллоц више у другом, али је идеја маллоц је све своје локалних променљивих
Увек идем на стек.
Све што је маллоцед иде на гомилу, и то ће заувек и увек бити на гомили
док јој експлицитно не ослободи.
Дакле, ово значи да, када маллоц нешто, то ће да преживе након функција враћа.
[Ученик] Хоће ли опстати после програм престаје да ради? Но >>
Ок, тако да ће ту бити све док програм је све тако урађено ради. >> Да.
Можемо ићи преко детаље о томе шта се дешава када програм престаје да ради.
Можда ћете морати да ме подсети, али то је потпуно одвојена ствар.
[Ученик] Дакле маллоц ствара показивач? >> Да.
Маллоц - >> [ученик] Мислим маллоц означава блок меморије која може да показивач користе.
[Бовден] Желим поново тај дијаграм. >> [Ученик] Дакле, ово функционише, иако?
[Ученик] Да, маллоц означава блок меморије коју можете да користите,
и онда враћа адресу првог блока те меморије.
>> [Боуден] Да. Дакле, када маллоц, ти си зграбио неки блок меморије
то је тренутно у гомили.
Ако гомила сувише мали, онда је само гомила ће расти, а расте у том правцу.
Па рецимо да гомила сувише мали.
Онда је требало да расте мало и вратити показивач на овом блоку који само расте.
Када бесплатне ствари, правите више простора у гомили,
па онда касније позове да се поново маллоц ту меморију коју сте раније ослободио.
Важна ствар о маллоц и фрее је да вам даје потпуну контролу
током животног века ових меморијских блокова.
Глобалне променљиве су увек жив.
Локалне променљиве су живи у свом делокругу.
Чим проћи у коврџаве браце су локалне променљиве су мртви.
Маллоцед меморија је жив када желите да буде жив
и онда је пуштен када га кажеш да буде ослобођен.
Они су заправо само 3 врсте меморије, стварно.
Ту је аутоматски управљање меморијом, што је стек.
Ствари се десити за вас аутоматски.
Када кажете инт к, меморија је намењена за инт.
Када к излази из оквира, меморија се повратила за к.
Затим, ту је динамичан и управљање меморијом, што је оно што је маллоц,
што је када имате контролу.
Ви одлучујете када треба динамички меморија и не би требало да буде додељена.
А онда је статичан, што само значи да је заувек живи,
што је оно што глобалне променљиве су.
Они су само увек у сећању.
>> Питања?
[Ученик] Можете ли дефинисати блок само помоћу витичасте заграде
али не морају да имају, ако изјави или док изјава или нешто слично томе?
Можете да дефинишете блок као у функцији, али да има и витичасте заграде.
[Ученик] Дакле, не можете само као случајни пар заграда у коду
које имају локалне променљиве? >> Да, можеш.
Унутар инт бар можемо да имамо {инт и = 3;}.
То би требало да буде овде.
Али, то у потпуности дефинише обим инт.
После тог другог коврџаве браце, и не могу се више користити.
Ви скоро никада то, ипак.
Да се ​​вратимо на оно што се дешава када се програм заврши,
постоји нека врста заблуда / пола лажи да дајемо како би само олакшати ствари.
Ми вам рећи да када доделите меморију
ви издвајање неки комад РАМ за ту променљиву.
Али ти ниси баш директно додирује РАМ икада у својим програмима.
Ако мислите о томе, како сам нацртао -
И заиста, ако идете кроз у ГДБ видећете исту ствар.
Без обзира на то колико сте пута покренете програм или који програм сте трчање,
стек се увек иде на почетак -
увек ћете видети променљиве око нечега адресу окбфффф.
Обично је негде у том региону.
Али како могу евентуално имати програми 2 тројке на истом меморије?
[Ученик] Има нека произвољна ознака где окбффф је требало да буде на РАМ
који заиста могу да буду у различитим местима у зависности од тога када функција је звали.
Да. Термин је виртуелна меморија.
Идеја је да сваки процес, сваки програм који је покренут на рачунару
има сопствени - претпоставимо 32 бита - потпуно независни адреса простора.
То је адреса простор.
Она има своје потпуно независна 4 гигабајта користити.
>> Дакле, ако наиђете истовремено 2 програма, овај програм види 4 гигабајта себи,
овај програм види 4 гигабајта себи,
и то је немогуће за овај програм да дереференце показивач
и завршити са меморијом од овог програма.
А шта виртуелна меморија је мапирање из процеса адресном простору
стварним стварима на РАМ.
Дакле, то је до вашег оперативног система да знају да,
хеј, када је овај момак дереференцес показивач окбффф, то заправо значи
да жели РАМ бајт 1000,
а ако овај програм дереференцес окбффф, он стварно жели РАМ бајт 10000.
Они могу бити произвољно далеко.
То је чак важи и за ствари у оквиру једног процеса адресног простора.
Дакле, као да види све 4 гигабајта себи, али хајде да кажемо -
[Ученик] Да ли сваки процес -
Рецимо да имате рачунар са само 4 гигабајта РАМ-а.
Да ли сваки процес види цела 4 гигабајта? >> Да.
Али 4 гигабајта то види је лаж.
То је само он мисли да је све ово сећање, јер не знам ништа друго процес не постоји.
То ће само користити као много меморије као што заиста треба.
Оперативни систем неће дати РАМ овом процесу
ако не користи никакву меморију у овом целом региону.
То неће да га дају за памћење тог региона.
Али идеја је да - Покушавам да смислим - Не могу да се сетим аналогије.
Аналогије су тешка.
Једно од питања виртуелне меморије или једна од ствари које су се решавају
је да процеси буду потпуно несвесни један другог.
И тако можете написати било који програм који само дереференцес било показивача,
волим само написати програм који каже * (ок1234)
и то је меморијска адреса дереференцинг 1234.
>> Али то је на оперативном систему онда преведем шта значи 1234.
Дакле, ако се деси да буде 1234 валидна меморијска адреса за овај процес,
као да је на стеку, или тако нешто, онда ће се вратити вредност тог меморијске адресе
колико процес зна.
Али ако 1234 није валидна адреса, као што се дешава да слети
у неком малом комаду меморије овде који је иза гомиле и изван гомиле
а нисте баш користио, онда је то када вам ствари попут сегфаултс
јер ти додиривања меморију која не би требало да додирује.
Ово је такође тачно -
32-битни систем, 32 бита значи да имају 32 бита дефинишу адресу меморије.
То је разлог зашто су показивачи 8 бајтова, јер 32 бита 8 бајтова - или 4 бајта.
Показивачи су 4 бајта.
Дакле, када видите показивач као окбффффф, то је -
У оквиру било ког програма можете само конструисати било произвољно показивача,
распону од ок0 до вола 8 ф'с - фффффффф.
[Ученик] Зар нисте рекли да су 4 бајта? >> Да.
[Ученик] Онда сваки бајт ће имати - >> [Боуден] Хексадецимални.
Хексадецимални - 5, 6, 7, 8. Дакле, тројке ћете увек видети у хексадецимални.
То је само како ћемо класификовати показиваче.
Сваке 2 цифре хексадецимални је 1 бајт.
Тако да ће бити 8 хексадецималних цифара за 4 бајта.
Дакле, сваки показивач на 32-битном систему ће бити 4 бајта,
што значи да је у вашем процесу можете изградити неке произвољне 4 бајта
и да показивач ван њега,
што значи да колико је познато, може да се обрати цео 2 на 32 бајтова меморије.
Иако то није заиста имају приступ да,
чак и ако ваш рачунар има само 512 мегабајта, она мисли да има толику меморију.
А оперативни систем је довољно паметан да се само издвојити оно што заиста треба.
То не само да иде, о, нови процес: 4 свирке.
>> Да. >> [Ученик] Шта вола значи? Зашто си то написао?
То је само симбол за хексадецимални.
Када видите број почни са вола, узастопни ствари хексадецимални.
[Ученик] Ти си објашњава шта се дешава када се завршава програм. >> Да.
Шта се дешава када се програм завршава се оперативни систем
само брише мапирањима да има за ове адресе, и то је то.
Оперативни систем сада може само да ту меморију на другом програму да користи.
[Ученик] Ок.
Дакле, када сте издвоји нешто на гомили или стека или глобално променљивих или било шта,
сви они само нестану чим програм се завршава
јер оперативни систем је сада слободан да дам тај сећање на било који други процес.
[Ученик] Иако вероватно још увек постоје вредности написане у? >> Да.
Вредности су вероватно још увек ту.
То је само да ће то бити тешко да се на њих.
То је много теже да се на њих него да се на избрисане датотеке
јер обрисани фајл врста седи тамо дуго и хард диск је много већи.
Дакле, то ће заменити различите делове меморије
пре него што се догоди да замените комад меморије која користи тај фајл да буде у.
Али главна меморија, РАМ меморије, ви циклус кроз много брже,
тако да ће врло брзо бити замењена.
Питања о овоме или било шта друго?
[Ученик] Имам питања у вези другу тему. >> Реду.
Да ли неко има питања на ово?
>> Ок. Различити тема. >> [Ученик] Ок.
Ја сам пролазио кроз неке праксе тестова,
ау једној од њих је говорио о сизеоф
а вредност која се враћа или различити типови променљивих. >> Да.
И то је рекао да су инт и дуго и повратак 4, па су оба дугачак 4 бајта.
Да ли постоји разлика између инт и дуже, или је то иста ствар?
Да, постоји разлика.
Ц стандардно -
Вероватно ћу да погрешиш.
Апарат Ц стандард баш као што је Ц, званични документација Ц.
То је оно што каже.
Дакле Ц стандардно само каже да ће знак заувек и увек бити 1 бајт.
Све после тога - кратко је увек само дефинисан као већи или једнак знак.
То може бити строго већи од, али не позитивно.
Инт је само дефинисан као већи или једнак кратко.
И док је само дефинисан као већи или једнак са инт.
И дуго дуго је већи или једнак дуго.
Дакле, једино што је Ц стандард дефинише је релативна наручивање свега.
Стварна количина меморије да се ствари заузимају је генерално до имплементације,
али је прилично добро дефинисан у овом тренутку. >> [Ученик] Ок.
Дакле, шортс су готово увек ће бити 2 бајта.
Интс су готово увек ће бити 4 бајта.
Дуги Лонгс су готово увек ће бити 8 бајтова.
И чезне, то зависи од тога да ли користите 32-битни или 64-битни систем.
Тако дуго ће да одговара типу система.
Ако користите 32-битни систем као Апплианце, то ће бити 4 бајта.
Ако користите 64-битну као много недавних рачунара, то ће бити 8 бајтова.
>> Интс су скоро увек 4 бајта у овом тренутку.
Дуги Лонгс су готово увек 8 бајтова.
У прошлости, ИНТС некада само 2 бајта.
Али приметите да је ово потпуно задовољава све ове односа већа и једнака.
Докле је савршено дозвољено да буду исте величине као цео број,
и то је такође дозвољено да буду исте величине као и дуго дуго.
И тако једноставно деси да буде да се у 99,999% од система, то ће да буде једнака
или инт или дуго дуго. То зависи од 32-бита или 64-битни. >> [Ученик] Ок.
У сплавова, како је децимална тачка одређен у смислу бита?
Као што бинарни? >> Да.
Не морате да знате да је за ЦС50.
Ти чак и не уче да у 61.
Ви не научи да заиста у сваком курсу.
То је само представа.
Заборавио сам тачне битне уношења.
Идеја пливајућег тренутку је да издвоји одређен број бита да заступају -
У суштини, све је у научној нотацији.
Дакле, доделити одређени број битова да заступа самог броја, као и 1,2345.
Ја никада не могу представљати број са више цифара него 5.
Тада сте такође доделити одређени број битова, тако да она тежи да буде као
можете само да иде и до одређеног броја, као да је највећи експонент можете имати,
и можете само да одете до одређеног експоненту,
као да је то најмања експонент можете имати.
>> Не сећам се тачно начин битови се додељују за све ове вредности,
али известан број бита су посвећени 1,2345,
један одређени број битова посвећена експонента,
и то је само могуће да представља експонент одређене величине.
[Ученик] И дупло? Да ли је то као додатни дуг пловка? >> Да.
То је иста ствар као флоат осим сад ви користите 8 бајтова уместо 4 бајта.
Сада ћете моћи да користите 9 цифара или 10 цифре,
и то ће бити у стању да иде до 300 уместо 100. >> [Ученик] Ок.
А пловци су такође 4 бајта. >> Да.
Па, опет, то вероватно зависи укупни о општој примени,
али пловци су 4 бајта, дубл су 8.
Дубл је двоструко зову јер су дупло величина сплавова.
[Ученик] Ок. А ту су дупло дупло? >> Не постоје.
Ја мислим - >> [ученик] Као дугих жуди? >> Да. Ја не мислим тако. Да.
[Ученик] На тесту прошле године било је питање о главној функцији
потребе да буду део вашег програма.
Одговор је био да то не мора да буде део вашег програма.
У којој ситуацији? То је оно што сам видео.
[Бовден] Изгледа - >> [ученик] Шта ситуација?
Да ли имате проблем? >> [Ученик] Да, дефинитивно сам да га подигне.
То не мора да буде, технички, али у суштини ће то бити.
[Ученик] видео сам једну на другачији овогодишњег.
То је било као Тачно или Нетачно: важи - >> О, в фајл.
. [Ученик] Свака в фајл мора имати - [како говоре одједном - неразумљив]
Ок. Дакле, то је посебна.
>> Ц фајл. Само треба да садржи функције.
Можете саставити фајл у машински код, бинарне, свеједно,
без тога што извршна још.
Важи извршна мора имати главну функцију.
Можете написати 100 функције у 1 фајл али нема основне
и онда саставити то доле у ​​бинарни,
онда написати још једну датотеку која има само основни већ зове гомила ових функција
У овом бинарног фајла овамо.
И тако, када правите извршну, то је оно што чини повезивач
се комбинује ове 2 бинарне фајлове у једном програму.
Дакле, ц фајл. Не треба да имају главну функцију уопште.
А на великим базама код видећете хиљаде ц датотека и датотека. 1 главни.
Још питања?
[Ученик] Било је друго питање.
Она каже да је преводилац. Тачно или нетачно?
А одговор је био лажан, а ја сам схватио зашто није као јека.
Али шта ми зовемо да ако то није?
Нека је у основи само - ја видим шта се то зове.
Али то је само ради команде.
Маке.
Ја могу повући ово. Да.
О, да. Нека се то ради.
То каже сврха марку корисности је аутоматски одредити
који делови великог програма треба да се компајлирали
и издаје команде да их рекомпајлирате.
Можете направити да датотеке које су апсолутно огроман.
Нека гледа временским печатима фајлова и, као што смо раније рекли,
можете саставити појединачне фајлове доле, и то није све док не дођете до Линкер
да они саставили у једну извршну.
Дакле, ако имате 10 различитих датотека и да направи промену на 1 од њих,
онда шта да учини јесте да уради само рекомпајлирање да 1 филе
а затим повежите све заједно.
Али то је много глупљи од тога.
То је на вама да се у потпуности дефинише да је то оно што треба да се ради.
Она по дефаулту има способност да препозна ове ствари време маркица,
али можете написати датотеку Направите да уради било шта.
Можете написати да фајл тако да када откуцате учинити само ЦД на други директоријум.
Је добијање сам фрустриран јер сам лепљивост све унутар моје Апплианце
а онда сам видите ПДФ од Мац-а.
>> Зато идем у Финдер и ја могу да урадим Иди, Цоннецт то Сервер,
и сервер да се повежем је мој апарат, а онда сам отвори ПДФ
које добија саставио ЛаТеКс.
Али ја сам био узимајући фрустриран јер сваки пут сам морао да освежите ПДФ,
Морао сам да га ископирате на одређени директоријум да би то могло приступити
и то је све нервира.
Зато сам написао Направите фајл који морате да дефинишете како то чини ствари.
Како сте направити у ово ПДФ ЛаТеКс.
Баш као и било који други фајл марку - или Претпостављам да нисте видели направити датотеке,
али имамо у Апплианце глобалну Направите фајл који само пише,
ако састављању Ц фајл, користите кланг.
И тако овде у мом марку фајлу који сам да кажем,
овај фајл ћете желети да саставе са ПДФ ЛаТеКс.
И тако је ПДФ ЛаТеКс да ради састављања.
Нека се не састављања. То је само ради ове команде у низу сам навели.
Тако то ради ПДФ латекса, он га копира у директоријум желим да се копирају,
је ЦД у именик и обавља друге ствари,
али све то ради се признаје када се фајл измени,
и ако се мења, онда ће покренути команде која је то требало да покрене
када се фајл измени. >> [Ученик] Ок.
Ја не знам где су глобални Направите фајлови су за мене да га проверимо.
Остала питања? Све из прошлости тестови? Било поинтер ствари?
Постоје суптилне ствари са показивачима попут -
Нећу бити у могућности да пронађе питање квиз на њему -
али само као овакве ствари.
Уверите се да сте разумели да када кажем инт * к * и -
Ово није баш ништа овде, претпостављам.
Али као * к * и, они су 2 променљиве које се налазе на стеку.
Када кажем к = маллоц (сизеоф (инт)), к је увек променљива на стек,
маллоц је неки блок преко у гомили, а имамо к указују на гомили.
>> Тако нешто на стек указује на гомили.
Кад год маллоц ништа, ви сте неминовно складишти унутар једног показивача.
Дакле показивач налази на стеку, маллоцед блок је на гомили.
Много људи се збунити и кажу инт * к = маллоц к; је на гомили.
Но Шта к указује на гомиле.
к је сама на стек, уколико из било ког разлога сте к бити глобална променљива,
у ком случају се деси да буде у неком другом региону меморије.
Дакле праћење, ове кутије и стрела дијаграми су прилично уобичајено за квизу.
Или ако није на квизу 0, то ће бити на квизу 1.
Требало би да знате све ово, кораке у састављању
пошто сте морали да одговорите на питања о њима. Да.
[Ученик] Можемо ићи преко тих корака - >> Наравно.
Пре корака и састављање имамо предобраде,
састављање, монтажу и повезивање.
Предобрада. Шта то радиш?
То је најлакши корак у - добро, не као -
то не значи да би требало да буде очигледно, али то је најлакши корак.
Ви би га спровести сами. Да.
[Ученик] Узмите оно што имате у вашој обухвата овако и она копира, а затим и дефинише.
Изгледа да ствари као што су # инцлуде и # дефине,
и то само копије и пасте шта они заправо значе.
Дакле, када кажете # инцлуде цс50.х, Претпроцесор се копирањем и лепљењем цс50.х
у тој линији.
Када кажете # дефине к да буде 4, Претпроцесор пролази кроз цео програм
и замењује све инстанце к са 4.
Дакле Претпроцесор узима важећу Ц датотеку и даје валидну Ц фајл
где ствари су копирали и налепили.
Тако сада састављања. Шта то радиш?
[Ученик] То иде из Ц у бинарни.
>> [Бовден] То не иде све у бинарни.
[Ученик] Да машинског кода онда? >> Није машински код.
[Ученик] Скупштина? >> Скупштина.
То иде у Скупштини пре него што оде скроз у Ц коду,
и већина језика уради овако нешто.
Пицк било језик високог нивоа, а ако ћеш да га састави,
то је вероватно да састави у корацима.
Прво ће да састави Питхон до Ц, онда ће саставити Ц Скупштини,
а онда Скупштина ће се превести у бинарни.
Дакле, састављање ће то донети из Ц Скупштини.
Састављања реч обично значи чиме је са вишег нивоа
на нижем нивоу језику програмирања.
Дакле, ово је само корак у изради где почнете са високом нивоу језика
и завршити у ниском нивоу језика, и то је разлог зашто се зове корак састављања.
[Ученик] Током компајлирања, рецимо да сте урадили # инцлуде цс50.х.
Хоће компилатор рекомпајлирање цс50.х, као функције које су унутра,
и превели у Скупштини, као и код,
или ће га копирате и налепите нешто што је било пре скупштина?
цс50.х ће прилично никада завршити у Скупштини.
Ствари као функција прототипова и ствари су само да будеш опрезан.
То гарантује да компајлер провери ствари као што зовете функције
са правим типовима и повратак правим аргументима и стварима.
>> Тако цс50.х ће бити претходно обрађују у фајлу, и онда када је то састављања
је у основи то баца након што осигурава да се све правилно зове.
Али функције дефинисане у ЦС50 библиотеци, које су одвојене од цс50.х,
они неће бити посебно састављен.
То ће заиста доћи доле у ​​повезује кораку, тако да ћемо се на то у секунди.
Али прво, шта је монтажа?
[Ученик] Скупштина у бинарни? >> Да.
Склапање.
Ми не зовемо састављања јер Скупштина је прилично чист превод бинарни.
Постоји врло мало логике у идући од Скупштине да бинарни.
То је као гледа у табели, ох, имамо ову инструкцију;
који одговара бинарни 01110.
И тако су датотеке које монтажу генерално резултати су. О датотека.
А о филес. Смо оно што смо говорили и раније,
Како датотека не треба да имају главну функцију.
Сваки фајл може бити састављена доле до о фајлу. Док је важећа Ц датотека.
Може се саставља до О..
Сада, повезујући је оно заправо доноси гомилу о фајлове и доводи их на извршну..
И шта ради линковање је можете мислити о ЦС50 библиотеке као о фајлу..
То је већ саставио бинарни фајл.
И тако када компајлирате датотеку, ваш хелло.ц, која тражи ГетСтринг,
хелло.ц добија саставио доле хелло.о,
хелло.о је сада у бинарном.
Она користи ГетСтринг, тако да мора да иде преко на цс50.о,
и линкер тхем смоосхес заједно и копира ГетСтринг у овом фајлу
и излази са извршну који има све функције су му потребни.
Дакле цс50.о заправо није о фајл, али је довољно близу да не постоји фундаментална разлика.
Дакле, повезивање само обједињује гомилу фајлова
да одвојено садржи све функције морам да користим
и ствара извршну који ће заправо покренути.
>> И то је такође оно што смо говорили раније
где можете имати 1000 Ц фајлове. можете саставити их све о фајлове.
који ће вероватно потрајати, онда промените 1 в фајл..
Потребно је само да компајлирате тај 1. Ц датотеку, а затим све остало, РЕЛИНК
повезати све назад заједно.
[Ученик] Када смо повезивању пишемо лцс50?
Да, тако лцс50. То застава сигнали повезивач да би требало да буде повезивање у тој библиотеци.
Питања?
Да ли смо прошли кроз бинарности, осим да је 5 секунди у првом предавању?
Ја не мислим тако.
Требало би да знате све велике ОС који смо отишли ​​преко,
и требало би да буде у стању да, ако ти је дао функцију,
треба да будете у стању да кажемо да је то велики О, отприлике. Или добро, велики је О груба.
Дакле, ако сте видели угнездио на петљи петље преко истог броја ствари,
као инт, и <н инт ј, ј <н - >> [ученик] н квадрат. >> Тежи да буде н квадрат.
Ако сте троструки угњеждени, она тежи да буде н куб.
Дакле, такве ствари би требало да буде у стању да укаже одмах.
Морате да знате какав уметања и балон сортирате и обједињавање врста и све од њих.
То је лакше разумети зашто су они н квадрат и н лог н и све то
јер мислим да је било на квизу годину, где смо у суштини ти дао
Имплементација буббле врсте и рекао: "Шта је време рада ове функције?"
Дакле, ако сте га препознају као балон врсте, онда одмах можемо рећи н квадрат.
Али, ако само погледате, ви ни не треба да схвате да је то врста балон;
можете само рећи ово ради ово и ово. Ово је н квадрат.
[Ученик] Да ли постоје неки опасни примера можете доћи до,
као сличном идејом схватите?
>> Ја не мислим да ће вам дати неке тешке примере.
Мехур врста ствар је отприлике онолико тешко колико би ми иде,
па чак и да, како год да схватите да сте итератинг преко низа
за сваки елемент у низу, која ће бити нешто што је н квадрат.
Постоје општа питања, као што овде имамо - Ох.
Баш пре неки дан, Даг је тврдио: "Ја сам измислио алгоритам који може сортирати низ
"Од н бројева у О (лог н) време!"
Па како да знамо да је то немогуће?
[Нечујан ученик одговор] >> Да.
У најмању руку, морате да додирнете сваки елемент у низу,
тако да је немогуће да сортирате низ -
Ако је све у некласификовани реду, онда ћемо да се додирује све у низу,
тако да је немогуће то урадити за мање од Ø н.
[Ученик] Ти си нам показао тај пример да буде у стању да то уради у О од н
ако користите пуно меморије. >> Да.
А то је - заборавио сам шта то је - Да ли је то бројање сортирање?
Хмм. То је цео сортирање алгоритам.
Ја сам у потрази за посебан назив за то да не могу да се сетим прошле недеље.
Да. Ово су типови сорти које могу да обављају ствари у великом О од н.
Али постоје ограничења, као што можете да користите само бројеве до одређеног броја.
Плус ако покушавате да сортирате тхат'с нешто -
Ако је ваш низ је 012, -12, 151, 4 милиона,
онда један елемент ће потпуно уништити целу сортирања.
>> Питања?
[Ученик] Ако имате рекурзивно функцију и то само чини Рекурзив позиве
у оквиру повратка изјави, то је реп рекурзивно,
па би да не користе више меморије током извршавања
или би бар користили сличну меморију као итеративни решење?
[Боуден] Да.
То би вероватно бити нешто спорији, али не баш.
Реп рекурзивног је прилично добар.
Гледајући поново стека рамовима, рецимо имамо главни
и имамо инт бар (инт) или тако нешто.
Ово није савршен рекурзивни функција, али повратак бар (к - 1).
Очигледно, ово је погрешна. Треба базу предмете и ствари.
Али идеја је да је ово реп рекурзивни,
што значи да када је главни позива бар што се дешава да се њен оквир стека.
У овом оквиру стека тамо ће бити мало блок меморије
који одговара његовом аргументу к.
И тако рецимо главни деси да позове бар (100);
Дакле, к ће да почне у 100.
Ако компајлер препознаје да је ово реп рекурзивни функција,
онда када бар чини његов рекурзивни позив да забрани,
уместо прављења новог стека оквир, где се стек почиње углавном расте,
на крају то ће наићи на гомилу и онда добијете сегфаултс
јер меморија почиње сударају.
>> Дакле, уместо да своју стек оквир, може реализовати,
хеј, ја стварно не треба да се врати на овај стек оквира,
па уместо да ћу заменити овај аргумент са 99 и онда почне бар свуда.
А онда ће то урадити поново и то ће достићи бар повратка (к - 1),
и уместо прављења новог стека оквир, само ће заменити свој тренутни аргумент са 98
и онда скочите назад на самом почетку бара.
Те операције, замена да је 1 вредност на стек и скакање назад на почетак,
су прилично ефикасан.
Дакле, не само да је ово иста употреба меморије као посебна функција која се итеративни
јер ви само користи 1 стек оквир, али не пате за негативне
потребе да се позове функција.
Позивање функције могу бити нешто скупљи, јер мора да уради све ово подешавање
и мировање и све ове ствари.
Дакле, ово реп рекурзије је добро.
[Ученик] Зашто не ствара нове кораке?
Јер схвата да не треба.
Позив на траци је само враћање рекурзивно позив.
Дакле, не морате ништа да радите са повратном вредношћу.
То ће га одмах врате.
Дакле, то је само ће да замени своју аргументацију и почети испочетка.
Такође, ако немате реп рекурзивно верзију,
онда се све те траке, где, када овај бар се враћа
она мора да врати своју вредност ове, онда бар одмах враћа
и враћа његову вредност ове, онда само ће да се одмах врате
и врати своју вредност овог.
Тако штедите ово искакање све ове ствари искључивање стека
јер повратна вредност је само ће бити донет скроз назад у сваком случају.
Па зашто не замени нашу аргументацију са ажурираним аргумент и испочетка?
Ако функција није реп рекурзивна, ако нешто слично -
[Ученик] ако бар (к + 1). >> Да.
>> Дакле, ако сте га ставили у стању, онда радите нешто са повратном вредношћу.
Или чак и ако само ради повратка 2 * Бар (к - 1).
Дакле, сада бар (к - 1) мора да се врати како би се израчунати 2 пута те вредности,
па сад не треба своју засебну оквир стека,
и сада, без обзира на то колико се ви трудили, ти ћеш морати да -
Ово није реп рекурзивна.
[Ученик] Да покушам да донесе рекурзија да циљ за репа рекурзије -
[Бовден] У идеалном свету, али у ЦС50 не морате.
Да би добили рекурзија реп, генерално, да подесите додатну аргументацију
где ће се бар инт и у
и и одговара крајњи ствар коју желите да се вратите.
Дакле, онда ћеш се вратити бар (к - 1), 2 * и.
Дакле, то је само на високом нивоу како трансформисати ствари буду реп рекурзивно.
Али екстра аргумент -
И онда на крају, када стигнете на базу случај, само вратите и
јер сте били гомилају све време повратну вредност коју желите.
Некако су га радили итеративно али коришћењем рекурзивног позива.
Питања?
[Ученик] Можда око показивача аритметици, као када користите жице. >> Наравно.
Показивач аритметика.
Када користите конце то је лако, јер су жице цхар звезде,
слова су заувек и увек један бајт,
па показивач аритметика је еквивалентно редовном аритметике, када имате посла са стринговима.
Рецимо цхар * с = "здраво".
Дакле, имамо блок у меморији.
Потребно је 6 бајта јер увек треба нулл Терминатор.
И цхар * с ће указати на почетку овог низа.
Тако је тамо поена.
Дакле, ово је у основи како било низ ради,
без обзира на то да ли је повратак тако маллоц или да ли је на стеку.
Било је у основи низ показивач на почетак низа,
и онда сваки низ операција, било индексирање, тек иде у том низу одређени офсет.
>> Дакле, када кажем нешто као с [3], а то ће се с бројањем и 3 знакова за
Дакле, с [3], имамо 0, 1, 2, 3, па с [3] ће да се односи на ову л.
[Ученик] И ми смо могли достићи исту вредност радећи с + 3, а затим заграде звезда?
Да.
Ово је еквивалентно * (с + 3);
и то је заувек и увек еквивалент без обзира шта радите.
Ви никада нећете морати да користите синтаксу носача.
Увек можете користити * (а + 3) синтакса.
Људи су склони да воле синтаксу носача, мада.
[Ученик] Дакле, сви низови су заправо само показивачи.
Постоји благи разлика када кажем инт [4]; >> [ученик] Да ли то створити памћење?
[Бовден] То ће створити 4 Интс на стек, тако да 16 бајтова укупно.
То ће створити 16 бајтова на стек.
к се не чувају нигде.
То је само симбол који се односи на почетак ствари.
Зато што је прогласио низ унутар ове функције,
шта компајлер ће да уради је само заменити све инстанце променљиве к
са којима се десило да изаберете да ове 16 бајтова.
Не могу то да урадим са цхар * с, јер је с стварна показивач.
Слободно је тада указати на друге ствари.
к је константа. Ви не можете да га тачку на други низ. >> [Ученик] Ок.
Али та идеја, та индексирање је иста, без обзира на то да ли је традиционална низ
или ако је показивач на нешто или ако је показивач на маллоцед низа.
А у ствари, то је тако да је еквивалентна је иста ствар.
То је само заправо претвара оно што је унутар заграда и шта је остало од заграда,
додаје их заједно, и дереференцес.
Дакле, ово је исто тако важи као * (а + 3), или с [3].
[Ученик] Да ли имате савете упућују на 2-димензионалним низовима?
>> То је теже. Традиционално, не.
2-димензионални низ је само 1-димензионални низ са неком погодном синтаксе
јер када сам рекао инт [3] [3], ово је стварно само 1 низ са 9 вредностима.
И тако, када сам индекс, компајлер зна шта мислим.
Ако кажем к [1] ​​[2], зна желим да идем у други ред, тако да ће прескочити прву 3,
а онда жели другу ствар у томе, тако да се дешава да се овај један.
Али још увек је само једна-димензионални низ.
И тако ако сам желео да додели показивач на том низу,
Ја бих рекао инт * п = к;
Тип Кс је само -
То је груба каже тип к јер је само симбол и то није стварна променљива,
али то је само инт *.
к је само показивач на почетак ове. >> [Ученик] Ок.
И тако сам неће моћи да приступи [1] [2].
Мислим да постоји посебна синтакса за декларисање показивач,
нешто смешно као инт (* п [-. нешто апсолутно смешно Ја чак и не знам.
Али постоји синтакса за декларисање тројки као и са заградама и ствари.
То не може ни да то урадиш.
Могао се осврнем на нешто што би ми рећи истину.
Ја ћу тражити касније, уколико постоји синтакса за тачку. Али никада нећете видети.
А чак и синтакса је толико архаично да ако га користите, људи ће бити збуњени.
Мултидимензионални низови су прилично ретки као што јесте.
Ти прилично -
Па, ако радите матрице ствари то неће бити ретки,
али у Ц ретко ћете се користи мултидимензионалне низове.
Да. >> [Ученик] Рецимо да имате стварно дугачку низ.
>> Дакле, у виртуелну меморију изгледа да се све узастопно,
као елемената право поред другог,
али у физичке меморије, да ли би било могуће да се то подели? >> Да.
Како виртуелна меморија ради се само раздваја -
Јединица алокације је страница, која тежи да буде 4 килобајта,
па кад процес, каже, хеј, желим да искористим ову меморију,
оперативни систем ће га издвојити 4 килобајта за тог малог блока меморије.
Чак и ако користите само један мали бајт у целом блоку меморије,
оперативни систем ће му дати пуну 4 килобајта.
Дакле, шта то значи, могао сам - хајде да кажем да је ово мој стек.
Овај стек може бити раздвојене. Мој стек може бити мегабајта и мегабајта.
Мој стек може бити огромна.
Али сама стек мора да буде подељен на појединачним страницама,
који ако се осврнемо на овамо рецимо ово је наша РАМ-а,
ако имам 2 гигабајта РАМ-а, ово је стварна адреса 0 попут нулте бајт моје меморије,
а то је 2 гигабајта скроз доле.
Дакле, ова страница може да одговарају овом блоку овамо.
Ова страница може да одговарају овом блоку овамо.
Ово би се могло одговарају ове овамо.
Дакле, оперативни систем је слободан да додели физичку меморију
на сваком појединачном страну произвољно.
А то значи да, ако та граница деси уракљити низ,
низа се дешава да се лево од овог и право тог поретка у страну,
онда низа ће бити подељен у физичкој меморији.
И онда када затворите програм, када се процес заврши,
ови мапирања се брише, а онда је слободан да користите ове мале блокове за друге ствари.
Још питања?
[Ученик] показивач аритметика. >> О, да.
Жице су биле лакше, али гледајући тако нешто Интс,
па назад на инт [4];
Да ли је ово низ или да ли је показивач на маллоцед низ целих бројева 4,
то ће бити третирани на исти начин.
[Ученик] Дакле низови су на гомили?
[Бовден] Низови нису на гомили. >> [Ученик] О.
>> [Бовден] Овај тип низа тежи да буде на стек
осим ако га проглашен на - игнорисање глобалне променљиве. Немојте користити глобалне променљиве.
Унутар функције кажем инт [4];
То ће створити 4-цео блок на стек за овај низ.
Али ово маллоц (4 * сизеоф (инт)); ће ићи на гомили.
Али после ове тачке могу користити к и п у скоро на исти начин,
осим изузетака сам рекао пре него што о томе можете распоредити стр.
Технички, њихове величине су нешто другачије, али то је потпуно ирелевантно.
Ти стварно никад не користи своје величине.
П Могу да кажем п [3] = 2; или к [3] = 2;
Можете их користити на потпуно исти начин.
Дакле показивач аритметика сада - Да.
[Ученик] Зар не треба да урадите п * ако имате заграде?
Заграде су имплицитни дереференце. >> Реду.
Заправо, и оно што ви говорите са можете добити мултидимензионалне низове
са показивачима, шта можете да урадите нешто као, рецимо, инт ** пп = маллоц (сизеоф (инт *) * 5);
Ја ћу написати све из прве.
Нисам хтео то.
Ок.
Оно што сам овде урадио је - То би требало да буде пп [и].
Дакле, ПП је показивач на показивач.
Ти маллоцинг ПП да укаже на низ од 5 инт звезда.
Дакле, у меморији имате на стек стр
То ће указати на низ од 5 блокова који су све сами показивачи.
И онда када сам маллоц овде доле, ја маллоц да свака од тих појединачних показивача
треба да укаже на посебном блоку 4 бајта на гомили.
Дакле, ово указује на 4 бајта.
А ово указује на неку другу 4 бајта.
>> И сви они указују на своје 4 бајта.
То ми даје начин рада мултидимензионалне ствари.
Могу да кажем ПП [3] [4], али сада ово није иста ствар као мултидимензионалне низове
јер вишедимензионе низови се преведе [3] [4] у један офсет у к низу.
Ово дереференцес п приступа треће индекса, онда дереференцес да
и пристапи - 4 ће бити неважећа - други индекс.
Док када смо имали инт [3] [4] пре као вишедимензионални низ
а када двапут носач то је заиста само један дереференце,
да сте пратили један показивач и онда офсет,
ово је стварно 2Д референце.
Ви пратите 2 одвојене показиваче.
Дакле, ово је такође технички омогућава вам да имате мултидимензионалне низове
где је сваки појединац низ је различите величине.
Тако да мислим да Јаггед вишедимензионе низови је оно што се зове
јер заиста прва ствар могла указати на нешто што има 10 елемената,
Друга ствар могла указати на нешто што има 100 елемената.
[Ученик] Да ли постоји ограничење броја показивача можете имати
указујући на друге тројке? Но >>
Можете имати инт ***** стр.
Назад на показивач аритметике - >> [ученик] О. >> Да.
[Ученик] Ако имам инт *** п, а онда радим дереференцинг и кажем п * једнака овој вредности,
је само да уради 1 степен дереференцинг? >> Да.
Дакле, ако желим да приступите ствар да је последњи показивач упућује на -
Онда ти *** п. >> Реду.
Дакле, ово је п указује на 1 блок, указује на још једног блока, указује на други блок.
Онда ако ти * п = нешто друго, онда се мењају ово
до сада указују на другом блоку. >> Реду.
>> [Бовден] А ако њих су маллоцед, онда сте сада су процуриле меморију
ако се деси да имају различите референце ових
јер не можете да се вратим на оне које сте управо бацио.
Показивач аритметика.
инт [4]; ће доделити низ целих бројева 4
где је к ће да укаже на почетак низа.
Дакле, када кажем нешто као Кс [1], а ја желим да то значи ићи на други цели број у низу,
што би био овај.
Али стварно, то је 4 бајта у низу јер цео заузима 4 бајта.
Дакле, оффсет оф 1 заиста значи оффсет оф 1
пута већи од било ког типа низа је.
То је низ целих бројева, тако да зна да уради 1 пута величину инт када жели да надокнади.
Друга синтакса. Запамтите да је ово еквивалент * (к + 1);
Када кажем показивач + 1, шта то враћа се адреса која показивач складиштење
плус 1 пута већи од типа показивача.
Дакле, ако је к = ок100, тада к + 1 = ок104.
И можете злоупотребљава ово и кажу нешто као цхар * ц = (цхар *) к;
и сада се ц ће бити иста адреса као и к.
ц ће бити једнака ок100,
али ц + 1 ће бити једнака ок101
јер показивач аритметика зависи од типа показивача који се додавањем.
Дакле, ц + 1, то изгледа на ц, то је знак показивач, па ће додати 1 пута величину цхар,
која ће увек бити 1, тако да ћете добити 101,
а ако урадим к, што је такође још 100, к + 1 ће бити 104.
[Ученик] Да ли користите Ц + + у циљу унапређења показивач за 1?
Да, можеш.
Не могу то да урадим са к, јер је к само симбол, то је константа, ви не можете да промените к.
>> Али, ц деси да буде само показивач, па ц + + је савршено важећа и да ће повећавати до 1.
Ако су само ц инт *, а затим ц + + бити 104.
+ + Не показивач аритметика као ц + 1 морати урадити показивача аритметике.
Ово је заправо колико много ствари попут стапања врсте -
Уместо стварања копије ствари, уместо тога можете проћи -
Као да сам хтео да прође ову половину низа - Идемо обришете неке од овога.
Рецимо да сам хтео да прође ову страну низа у функцију.
Оно што бих ја прећи на ту функцију?
Ако прођем к, ја сам пролазећи ову адресу.
Али ја желим да прође овај посебан адресу. Дакле, шта треба да прође?
[Ученик] Показивач + 2?
[Бовден] Дакле, к + 2. Да.
То ће бити ова адреса.
Такође ћете врло често га виде као к [2], а затим адресу тога.
Дакле, потребно је да се адресу томе, јер носач је имплицитна дереференце.
к [2] се односи на вредност која је у овом пољу, а затим желите адресу тој кутији,
тако кажеш & к [2].
Дакле, то је нешто у томе како стапања врсти где желите да прође пола листу нешто
само заиста проћи & к [2], а сада колико рекурзивни позив тиче,
мој нови низ почиње тамо.
Ласт минуте питања.
[Ученик] Ако ми не стављамо амперсанд или - шта је то зове? >> Звезда?
[Ученик] Звезда. >> Технички, дереференце оператера, али - >> [ученик] дереференце.
>> Ако ми не стављамо звезду или амперсанд, шта се дешава ако сам само да кажем и = к и к је показивач?
Шта је тип и? >> [Ученик] Ја ћу само рећи да је показивач 2.
Дакле, ако сте управо рекли и = к, сада Кс и И указује на исту ствар. >> [Ученик] указују на исту ствар.
А ако је к инт показивач? >> То би се жале зато што не можете доделити показиваче.
[Ученик] Ок.
Запамтите да показиваче, иако смо их извући као стрелице,
Стварно сви они продавница - инт * к - заиста све је к складиштење је нешто попут ок100,
који смо се деси да представљају указујући на блоку ускладиштене на 100.
Дакле, када кажем инт * и = к, ја сам само копирање ок100 у и,
који смо управо идемо да представљају и, такође указује на ок100.
А ако кажем инт = (инт) к онда сам се дешава да складишти обзира вредност ок100 је
унутар њега, али сада ће се тумачити као цео број уместо показивачем.
Али морате екипи или ће жалити.
[Ученик] Дакле, да ли мислите да се баци -
Да ли ће то бити кастинг за инт к или и ливење инт?
[Бовден] Шта?
[Ученик] Ок. Након ових заграда се тамо ће бити к или аи тамо?
>> [Боуден] Свеједно. к и и су еквивалентна. >> [Ученик] Ок.
Зато што су оба показивачи. >> Да.
[Ученик] Дакле, било би држати хексадецимални 100 у цео облику? >> [Боуден] Да.
Али не вредност без обзира на то указује на.
[Боуден] Да. >> [Ученик] Дакле, само адреса у цео облику. Ок.
[Бовден] Ако си хтео да се за неког бизарног разлога,
можете ексклузивно да се баве тројке и никад се баве целих
и само бити као инт * к = 0.
Онда ћеш да се заиста збуњени када показивач аритметичка почиње дешава.
Дакле, бројеви који су продавници су бесмислени.
То је само како се завршити тумаче их.
Тако да сам слободан да копирате ок100 из инт * на инт,
и ја сам слободан да додели - Ти вероватно ће се викао на за ливење не -
Ја сам слободан да додели нешто (инт *) ок1234 у овом произвољног инт *.
Дакле ок123 једнако валидна меморијска адреса, као што је и и.
& И дешава да се врати нешто што је прилично ок123.
[Ученик] Да ли је то било стварно супер начин да се иде од хексадецимални до децималном облику,
свиђа ако имате показивач и баци га као инт?
[Бовден] Можете заиста само штампање помоћу попут принтф.
Рецимо ја имам инт и = 100.
Дакле принтф (% д \ н - као што је већ требало да знате - да одштампате као цео број,% к.
Само ћемо одштампати као хексадецимални.
Дакле, показивач се не памти као хексадецимални,
и цео се не чува као децимални.
Све се чува као бинарни.
То је само да смо склони да покажемо показиваче као хексадецимални
јер мислимо да ствари у ових 4-бајта блока,
и меморијска адресе имају тенденцију да буду упознати.
Ми смо као, ако се почиње са бф, онда се деси да буде на стек.
Дакле, то је само наша интерпретација показивача као хексадецимални.
Ок. Било последње питање?
>> Ја ћу бити овде мало после, ако имате нешто друго.
И то је крај тога.
>> [Ученик] Ура! [Аплауз]
>> [ЦС50.ТВ]