Реклама
Било да то схватите или не, велика већина програма које сте користили на неки начин користи показиваче. Можда сте искусили НуллПоинтерЕкцептион у једном тренутку. Као програмер, код који напишете више ће него вјероватно користити показиваче, чак и ако их сами нисте имплементирали.
Данас ћу вам показати како раде показивачи, па ћете можда желети да проверите како раде низови и спискови Како низови и спискови раде у ПитхонуНизови и листе неке су од најкориснијих структура података у програмирању - мада их мало људи користи у свом пуном потенцијалу. Опширније за програмски прајмер. Овај чланак ће се темељити више на теорији него иначе, али држи се тога, показивачи су врло сложени!
Састављање кода
Пре него што уђете у показиваче, морате да разумете како се шифра гради и извршава - можда то већ знате. Овај одељак садржи прилично опште изјаве - ствари које се односе на већина језика, али не нужно и свих њих.

Вратимо ствари на почетак Сваки рачунар користи бинарни Шта је бинарно? [Објашњена технологија] С обзиром на то да је бинарни систем тако апсолутно важан за постојање рачунара, чини се чудним да се никада раније нисмо бавили том темом - па бих данас мислио да ћу дати кратак преглед шта је бинарни ... Опширније , низ оних и нула које чине савремену технологију какву познајемо. Изузетно је тешко кодирати било шта у бинарном формату (датотеке би биле врло збуњујуће), јер су ово сирове упуте потребне за ваш Централна процесорска јединица или ЦПУ да функционише Шта је ЦПУ и шта ради?Рачунање акронима је збуњујуће. Шта је ЦПУ ионако? А да ли ми треба четворојезгарни или двојезгарни процесор? Шта кажете на АМД или Интел? Овде смо да помогнемо да објаснимо разлику! Опширније . То је познато као Машински код.
Следећи корак од машинског кода је Скупштина. То је помало читљив формат. Иако је програмирање још увек сложено, могуће је. Састављање је сачињено од низа једноставних команди за извршавање задатака, а познато је и као низак ниво програмски језик. Могуће је писати сложене програме, али тешко је изразити апстрактне концепте и захтева пуно разматрања.
Многе видео игре и апликације високих перформанси имају одређену логику записану у монтажи, јер се могу постићи одређена стварна повећања брзине ако знате шта радите. Међутим, за велику већину програмских пројеката уопште не требате знати ниједну монтажу.

Дакле, ако је машински код превише тежак за писање, а састављање је претешко за програмирање, са чим пишете код? Ево где висок ниво језици улазе. Језици на високом нивоу олакшавају писање програма. Можете програмирати на нешто што подсећа на ваш матерњи језик, и лако је изразити сложене алгоритме. Можда сте чули за многе језике високог нивоа (и сигурно ћете користити програм написан на њима):
- ОСНОВНИ
- Ц ++
- Лисп
Ови језици су сада веома стари, а многи су развијени почетком 1950-их! Скоро сваки модерни програмски језик је језик високог нивоа, укључујући ПХП и Питхон. Свакодневно се измишља више језика (мада их је вероватно сада довољно), али како тачно ваш код и даље правилно ради ако рачунарима треба машински код?
Ево одакле долази компилација. Компајлер је програм који ваш код високог нивоа претвара у облик који се може извршити. То би могао бити други језик високог нивоа, али то је обично састављање. Неки језици (као што су Питхон или Јава) претварају ваш код у средњу фазу која се зове бајт код. Ово ће требати поново саставити касније, што се обично врши на захтев, као на пример када се програм покреће. То је познато као тачно на време компилације, и прилично је популарна.
Управљање меморијом
Сада када знате како раде програмски језици, погледајмо управљање меморијом на језицима високог нивоа. За ове примере користићу псеудо код - код написан не на било ком одређеном језику, али се користи за приказивање концепата, а не тачне синтаксе. Данас ће то углавном подсећати на Ц ++ као најбољи језик на високом нивоу (по мом мишљењу).
У овом одељку ће вам помоћи ако имате разумевања за како ради РАМ Брзи и прљави водич за РАМ: Шта треба да знатеРАМ је битна компонента сваког рачунара, али може бити збуњујућа. Рашчлањујемо га на једноставан начин за разумевање. Опширније .
Већина језика има променљиве - контејнере који чувају неке податке. Морате изричито дефинисати врсту података. Неки динамички куцани језици као што су Питхон или ПХП то могу решити за вас, али то и даље морају да ураде.
Реците да имате променљиву:
инт миНумбер;
Овај код декларише променљиву која се зове мој број, и даје му тип података цијели број. Након састављања, рачунар тумачи ову наредбу као:
„Пронађите празну меморију и резервишите довољно велики простор да сместите цео број“
Једном када се изврши ова наредба, други мало меморије други програм не може користити. Још не садржи никакве податке, али резервисано је за вашу варијаблу миНумбер.
Сада доделите вредност променљивој:
миНумбер = 10;
Да бисте довршили овај задатак, рачунар приступа резервисаној меморијској локацији и мења сваку вредност која је тамо сачувана, у нову вредност.
Ово је све добро и добро, али како меморијске локације постају безрезервне? Ако програми резервишу сву меморију која им се свиђа, РАМ би се одмах напунио - то би учинило а врло спор систем.

Да би се избегло ово потенцијално питање, многи језици имплементирају Ђубретар, користи се за уништавање променљивих (и зато ослобађање резервисаних меморијских локација) које су отишле ван обима.
Можда се питате шта је опсег и зашто је то тако важно. Опсег дефинише границе и век трајања променљивих или било које меморије коју користи програм. Променљива је „ван опсега“ када јој више не може приступити ниједан код (то је када уђе сакупљач смећа). Ево примера:
функција матхс () {инт фирстНумбер = 1; } инт сецондНумбер = 2; штампа (фирстНумбер + сецондНумбер); // неће радити
Овај пример се неће компајлирати. Променљива фирстНумбер је унутар математике функцију, тако да је то у њеном обиму. Не може му се приступити изван функције у којој је декларисан. Ово је важан програмски концепти разумевање је од кључног значаја за рад са показатељима.
Овај начин руковања меморијом назива се гомила. На тај начин функционира велика већина програма. Не морате разумети показиваче да бисте га користили и прилично је добро структуиран. Недостатак стаке је брзина. Како рачунар мора доделити меморију, пратити променљиве и покренути сакупљање смећа, постоји мали режијски трошак. Ово је у реду за мање програме, али шта је са задацима високих перформанси или великим подацима?
Унесите: показивачи.
Показивачи
На површини, показивачи звуче једноставно. Они се позивају (показати на) локацију у меморији. Ово се можда не разликује од "регуларних" променљивих на снопу, али верујте ми, постоји огромна разлика. Показивачи се чувају на гомила. Ово је супротно од стака - мање је организовано, али је много брже.
Погледајмо како су променљиве додељене на снопу:
инт нумберОне = 1; инт нумберТво = бројОне;
Ово је једноставна синтакса; Променљива број два садржи број један. Вредност је копирана преко задатка из број један променљива.
Ако желите да добијете меморијска адреса променљиве, уместо вредности, морате да користите знак амперсанд (&). То се назива адреса оператора, и битан је део вашег алата за поинтер.
инт нумберОне = 1; инт нумберТво = & бројОне;
Сада број два променљива бодова на меморијску локацију, уместо да копирате број један на сопствену, нову меморијску локацију. Ако бисте испратили ову варијаблу, она не би била број један (иако је сачувана у меморији). Издат ће меморијска локација (вероватно нешто попут 2167, иако варира у зависности од система и доступне РАМ-а). Да бисте приступили вредности сачуваној у показивачу, уместо локације у меморији, морате дереференце показивач. Ово директно приступа вредности, која би у овом случају била број један. Ево како усмјерити показивач:
инт нумберТво = * бројОне;
Тхе дереференце оператор је звездица (*).
Ово може бити тежак концепт за разумевање, па размотримо поново:
- Тхе адреса оператор (&) чува меморијску адресу.
- Тхе дереференце оператор (*) приступа вредности.
Синтакса се лагано мења приликом проглашавања показивача:
инт * миПоинтер;
Тип података инт овде се односи на врсту података показивач бодова на, а не врсту самог показивача.
Сада када знате који су показивачи, можете направити неке заиста уредне трикове са њима! Када се користи меморија, покреће се ваш оперативни систем узастопно. О РАМ-у можете размишљати као о голубим рупама. Много рупа за чување нечега, а само једна се може користити одједном. Разлика је у томе што су ове рупице за голубове оштећене. Када додељујете меморију, ваш оперативни систем се покреће са најмањим бројем и покреће. Никада неће скакати између случајних бројева.

Ако радите са показивачима, ако сте одредили низ, лако можете прећи на следећи елемент једноставним повећањем показивача.
Ево где постаје занимљиво. Када проследите вредности функцији (користећи променљиве спремљене у скупу), ове вредности се копирају у вашу функцију. Ако су то велике варијабле, програм их сад чува два пута. Када је функција завршена, можда ће вам требати начин да вратите ове вредности. Функције могу вршити само једну ствар - па шта ако желите да вратите две, три или четири ствари?

Ако укажете показивач на своју функцију, копира се само меморијска адреса (што је сићушно). Ово штеди вашем ЦПУ-у доста посла! Можда ваш показивач указује на огроман низ слика - не само да ваша функција може радити на потпуно исти начин подаци похрањени на потпуно истој меморијској локацији, али након што то ураде, нема потребе да се враћају било шта. Уредан!
Морате бити веома опрезни. Показивачи и даље могу изаћи ван досега и прикупити их сакупљач смећа. Међутим, вредности сачуване у меморији се не сакупљају. То се назива цурење меморије. Не можете више приступати подацима (пошто су показивачи уништени), али то и даље троши меморију. Ово је чест разлог рушења многих програма и може спектакуларно да пропадне ако постоји велика количина података. Већину времена ваш оперативни систем ће убити ваш програм ако имате велико цурење (користећи више РАМ-а од система), али то није пожељно.

Отклањање погрешака може бити ноћна мора, посебно ако радите са великом количином података или радите у петљи. Њихови недостаци и потешкоће за разумевање заиста су вредни компромиса који ћете добити у учинку. Иако запамтите, можда их неће увек требати.
То је то за данас. Надам се да сте научили нешто корисно о сложеној теми. Наравно, нисмо обухватили све што се мора знати - то је веома сложена тема. Ако сте заинтересовани да сазнате више, топло препоручујем Ц ++ за 24 сата.
Ако је ово било мало сложено, погледајте наш водич за најлакше програмске језике 6 најлакших језика за програмирање за почетникеУчење програмирања подразумијева проналажење правог језика једнако колико и процес едификације. Ево првих шест најлакших програмских језика за почетнике. Опширније .
Да ли сте научили како данас раде показивачи? Имате ли неке савете и трикове које желите да поделите са другим програмерима? Ускочите у коментаре и поделите своја размишљања у наставку!
Јое је дипломирани професор информатике са Универзитета у Линцолну у Великој Британији. Он је професионални програмер софтвера, а када не лети дроновима или пише музику, често га могу наћи како снимају фотографије или снимају видео записе.