реклама

Независимо дали го осъзнавате или не, огромната част от програмите, които сте използвали, използват указатели по някакъв начин. Може би сте преживели a NullPointerException в някакъв момент. Като програмист, кодът, който пишете, повече от вероятно ще използва указатели, дори ако не сте ги реализирали сами.

Днес ще ви покажа как работят указателите, така че може да искате да проверите как работят масиви и списъци Как работят масиви и списъци в PythonМасивите и списъците са едни от най-полезните структури от данни в програмирането, въпреки че малко хора ги използват в пълния си потенциал. Прочетете още за програмен грунд. Тази статия ще се основава на повече теория от обикновено, но се придържайте към нея, показалците са много сложни!

Код за съставяне

Преди да ровите в указатели, трябва да разберете как се изгражда и изпълнява код - може би вече знаете това. В този раздел ще има доста общи изявления - неща, които се отнасят за мнозинство на езици, но не непременно всички.

показалки

Нека върнем нещата в началото. Всеки компютър

instagram viewer
използва двоичен Какво е двоичен? [Обяснена технология]Като се има предвид, че бинарният файл е толкова основен за съществуването на компютрите, изглежда странно, че никога досега не сме се занимавали с темата - затова днес смятах, че ще дам кратък преглед на това, което бинарно ... Прочетете още , поредица от такива и нули, които съставят съвременна технология, каквато я познаваме. Изключително трудно е да кодирате нещо в двоичен код (файловете биха били много объркващи), тъй като това са суровите инструкции, необходими на вашия централен процесор или CPU да функционира Какво е процесор и какво прави?Изчислителните съкращения са объркващи. Какво е CPU все пак? И имам ли нужда от четири или двуядрен процесор? Какво ще кажете за AMD или Intel? Тук сме, за да обясним разликата! Прочетете още . Това е известно като Машинен код.

Следващата стъпка от машинния код е монтаж. Това е донякъде човешки четим формат. Въпреки че все още е сложно да се програмира, е възможно. Сглобяването е съставено от поредица от прости команди за изпълнение на задачи и е известно като a ниско ниво програмен език. Възможно е да се пишат сложни програми, но е трудно да се изразят абстрактни понятия и се изисква много внимание.

Много видео игри и приложения с висока производителност имат част от логиката, написана в монтажа, тъй като можете да намерите някои реални увеличения на скоростта, ако знаете какво правите. За по-голямата част от програмните проекти обаче изобщо не е необходимо да знаете каквато и да е сглобка.

показалки

Така че, ако машинният код е твърде труден за писане и сглобяването е твърде трудно за програмиране, с какво пишете код? Ето къде високо ниво влизат езици. Езиците на високо ниво правят програмите лесни за писане. Можете да програмирате в нещо, което прилича на родния ви език, и е лесно да изразите сложни алгоритми. Може би сте чували за много езици на високо ниво (и определено ще използвате програма, написана на тях):

  • ОСНОВЕН
  • C ++
  • фъфлене

Сега тези езици са много стари и много от тях са разработени в началото на 50-те години! Почти всеки съвременен език за програмиране е език на високо ниво, включително PHP и Python. Всеки ден се измислят повече езици (макар че вероятно вече са достатъчно), но как точно вашият код все още работи правилно, ако компютрите изискват машинен код?

Ето къде идва компилацията. Компилаторът е програма, която превръща кода от високо ниво във форма, която може да бъде изпълнена. Това може да е друг език на високо ниво, но обикновено това е сглобяване. Някои езици (като Python или Java) преобразуват кода ви в междинен етап, наречен байткод. Това ще трябва да се компилира отново на по-късна дата, което обикновено се прави при поискване, например при стартиране на програмата. Това е известно като точно навреме компилация и е доста популярна.

Управление на паметта

Сега, когато знаете как работят езиците за програмиране, нека разгледаме управлението на паметта на езици на високо ниво. За тези примери ще използвам псевдо код - код, написан не на някакъв конкретен език, но използван за показване на концепции, а не на точен синтаксис. Днес това ще прилича най-вече на C ++, тъй като това е най-добрият език на високо ниво (според мен).

За този раздел ще ви помогне, ако разбирате как работи RAM Бързо и мръсно ръководство за RAM: Какво трябва да знаетеRAM е основен компонент на всеки компютър, но може да бъде объркващ. Разбиваме го по лесни за разбиране термини, които ще разберете. Прочетете още .

Повечето езици имат променливи - контейнери, които съхраняват някои данни. Трябва изрично да дефинирате типа данни. Някои динамично въведени езици като Python или PHP се справят с вас, но все пак трябва да го направят.

Кажете, че имате променлива:

int myNumber;

Този код декларира променлива, наречена моя номер, и му дава тип данни цяло число. Веднъж компилиран, компютърът интерпретира тази команда като:

„Намерете празна памет и запазете място, достатъчно голямо, за да съхраните цяло число“

След като тази команда се изпълни, този бит памет не може да бъде използван от друга програма. Все още не съдържа никакви данни, но е запазена за вашата променлива myNumber.

Сега присвойте стойност на променливата си:

myNumber = 10;

За да изпълни тази задача, вашият компютър има достъп до запазеното си място в паметта и променя каквато и стойност е запаметена в тази нова стойност.

Сега всичко това е добре и добре, но как местата на паметта се запазват безрезервно? Ако програмите запазиха цялата памет, която им харесва, оперативната памет би се запълнила веднага - това би направило a много бавна система.

показалки

За да се избегне този потенциален проблем, много езици прилагат a сметосъбирач, използван за унищожаване на променливи (и следователно освобождаване на запазените места в паметта), които са отишли извън обхвата.

Може би се чудите какъв е обхвата и защо е толкова важен. Обхватът определя границите и продължителността на променливите или паметта, използвана от програмата. Променлива е „извън обхвата“, когато вече не може да се получи достъп до който и да е код (това е когато стъпва събирачът за боклук). Ето пример:

функция maths () {int firstNumber = 1; } int secondNumber = 2; печат (firstNumber + secondNumber); // няма да работи

Този пример няма да се компилира. Променливата firstNumber е в рамките на математика функция, така че това е обхватът му. Не може да се получи достъп извън функцията, в която е деклариран. Това е важна концепция за програмиранеи разбирането му е от изключително значение за работата с указатели.

Този начин на работа с памет се нарича купчина. По този начин работят по-голямата част от програмите. Не е нужно да разбирате указатели, за да го използвате, и той е доста добре структуриран. Недостатъкът на стека е скоростта. Тъй като компютърът трябва да присвои памет, да следи променливите и да пусне сметта, има малка режийни разходи. Това е добре за по-малки програми, но какво ще кажете за задачи с висока производителност или за тежки приложения с данни?

Въведете: указатели.

показалки

На повърхността показалците звучат просто. Те се позовават (посочи към) място в паметта. Това може да не изглежда по различен начин от "регулярните" променливи в стека, но повярвайте ми, има огромна разлика. Показалките се съхраняват на купчина. Това е обратното на стека - той е по-малко организиран, но е много по-бърз.

Нека да разгледаме как се присвояват променливи в стека:

int numberOne = 1; int numberTwo = numberOne;

Това е прост синтаксис; Променливата номер две съдържа номер едно. Стойността му се копира по време на заданието от номер едно променлива.

Ако искате да получите адрес на паметта на променлива, вместо стойността й, трябва да използвате знака ampersand (&). Това се нарича адрес на оператор и е съществена част от инструментариума на вашите указатели.

int numberOne = 1; int numberTwo = & numberOne;

Сега на номер две променлив точки до място в паметта, а не да се копира номер едно в собственото, ново място в паметта. Ако извеждате тази променлива, тя няма да е номер едно (въпреки че е запаметено в паметта). Той ще изведе местоположението на паметта (вероятно нещо като 2167, въпреки че варира в зависимост от системата и наличната RAM памет). За да получите достъп до стойността, съхранена в указател, вместо мястото на паметта, трябва да сочен показалеца. Това осъществява директно достъп до стойността, която в този случай би била номер едно. Ето как пренасочвате указател:

int numberTwo = * numberOne;

Най- оператор за отписване е звездичка (*).

Това може да бъде трудно за разбиране понятие, така че нека да го прегледаме отново:

  • Най- адрес на operator (&) съхранява адреса на паметта.
  • Най- оператор за отписване (*) осъществява достъп до стойността.

Синтаксисът се променя леко при деклариране на указатели:

int * myPointer;

Типът данни на инт тук се отнася до типа данни указателят точки към, а не вида на самия показалец.

Сега, когато знаете какви са указателите, можете да направите някои наистина спретнати трикове с тях! Когато се използва памет, вашата операционна система се стартира последователно. Можете да мислите за RAM като дупки за гълъби. Много дупки за съхраняване на нещо, само един може да се използва наведнъж. Разликата тук е, че всички тези дупки за гълъби са номерирани. Когато присвоявате памет, вашата операционна система се стартира с най-ниското число и работи. Никога няма да прескача между произволни числа.

показалки

Когато работите с указатели, ако сте назначили масив, можете лесно да преминете към следващия елемент, като просто увеличите показалеца си.

Ето къде става интересно. Когато предавате стойности на функция (използвайки променливи, съхранявани в стека), тези стойности се копират във вашата функция. Ако това са големи променливи, сега програмата ги съхранява два пъти. Когато вашата функция приключи, може да ви е необходим начин да върнете тези стойности. Функциите обикновено могат да върнат само едно - така че какво бихте искали да върнете две, три или четири неща?

показалки

Ако предадете указател на вашата функция, копира се само адресът на паметта (което е мъничко). Това спестява на вашия процесор много работа! Може би показалецът ви сочи огромен масив от изображения - не само функцията ви може да работи точно по същия начин данни, съхранени на точно същото място в паметта, но след като е направено, няма нужда да се връщат нищо. Neat!

Трябва да бъдете много внимателни. Указателите все още могат да излязат извън обхвата и да се събират от боклука. Стойностите, съхранени в паметта, обаче не се събират. Това се нарича изтичане на памет. Вече не можете да получите достъп до данните (тъй като указателите са унищожени), но тя все още използва памет. Това е често срещана причина за сриване на много програми и може да се провали зрелищно, ако има голямо количество данни. През повечето време операционната ви система ще убие програмата ви, ако имате голям теч (използва повече RAM, отколкото системата), но това не е желателно.

показалки

Отстраняването на указатели може да бъде кошмар, особено ако работите с големи количества данни или работите в контури. Техните недостатъци и трудности за разбиране наистина си струват компромиси, които печелите при изпълнение. Въпреки че помнете, те невинаги могат да се изискват.

Това е днес. Надявам се, че сте научили нещо полезно по сложна тема. Разбира се, не сме обхванали всичко, което трябва да знаем - това е много сложна тема. Ако се интересувате да научите повече, горещо препоръчвам C ++ за 24 часа.

Ако това беше малко сложно, погледнете нашето ръководство за най-лесните езици за програмиране 6 най-лесни езика за програмиране, които да научите за начинаещиДа се ​​научим да програмираме, е да намерите правилния език точно толкова, колкото и за процеса на назидание. Ето първите шест най-лесни езика за програмиране за начинаещи. Прочетете още .

Научихте ли как работят указателите днес? Имате ли някакви съвети и трикове, които искате да споделите с други програмисти? Направете коментарите и споделете мислите си по-долу!

Джо е завършил компютърни науки от университета в Линкълн, Великобритания. Той е професионален разработчик на софтуер и когато не лети дронове или пише музика, често може да бъде намерен да прави снимки или да прави видео.