Reklame
Uanset om du er klar over det eller ej, bruger det store flertal af de programmer, du har brugt, på nogle måder. Måske har du oplevet en NullPointerException på et tidspunkt. Som programmerer vil kode, du skriver, mere end sandsynligt bruge pointers, selvom du ikke selv har implementeret dem.
I dag viser jeg dig, hvordan pointer fungerer, så du måske ønsker at tjekke ud hvordan arrays og lister fungerer Sådan fungerer matriser og lister i PythonArrays og lister er nogle af de mest nyttige datastrukturer i programmeringen - selvom få mennesker bruger dem til deres fulde potentiale. Læs mere til en programmeringsgrunder. Denne artikel vil være mere teoribaseret end sædvanligt, men hold dig fast med den, pointere er meget komplekse!
Kompilering af kode
Før du graver i pegepinde, skal du forstå, hvordan kode bygges og udføres - måske ved du allerede dette. Dette afsnit har relativt generelle udsagn - ting, der gælder for flertal sprog, men ikke nødvendigvis alle dem.
Lad os tage ting tilbage til starten. Hver computer
bruger binær Hvad er binær? [Teknologi forklaret]I betragtning af at binære er så absolut grundlæggende for eksistensen af computere, synes det underligt, at vi aldrig har behandlet emnet før - så i dag havde jeg troet, jeg ville give et kort overblik over, hvad binært ... Læs mere , en serie af nuller og nuller, der udgør moderne teknologi, som vi kender den. Det er ekstremt vanskeligt at kode noget binært (filerne ville være meget forvirrende), da dette er de rå instruktioner, der kræves af din centralenhed eller CPU til at fungere Hvad er en CPU, og hvad gør den?Computing akronymer er forvirrende. Hvad er en CPU alligevel? Og har jeg brug for en quad- eller dual-core-processor? Hvad med AMD eller Intel? Vi er her for at hjælpe med at forklare forskellen! Læs mere . Dette er kendt som Maskinkode.Det næste trin op fra maskinkoden er montage. Dette er et noget menneskeligt læsbart format. Selvom det stadig er komplekst at programmere i, er det muligt. Samlingen består af en række enkle kommandoer til at udføre opgaver og er kendt som en lavt niveau programmeringssprog. Det er muligt at skrive komplekse programmer, men det er vanskeligt at udtrykke abstrakte begreber og kræver meget overvejelse.
Mange videospil og applikationer med høj ydeevne har nogle af de logikker, der er skrevet under samlingen, da nogle reelle hastighedsstigninger kan findes, hvis du ved, hvad du laver. For langt de fleste programmeringsprojekter behøver du ikke kende nogen samling overhovedet.
Så hvis maskinkode er for svær at skrive, og montering er for svært at programmere, hvad skriver du så kode med? Her er hvor højt niveau sprog kommer ind. Sprog på højt niveau gør programmer lette at skrive. Du kan programmere på noget, der ligner dit modersmål, og det er let at udtrykke komplekse algoritmer. Du har muligvis hørt om mange sprog på højt niveau (og du vil bestemt have brugt et program skrevet i dem):
- GRUNDLÆGGENDE
- C ++
- lisp
Disse sprog er meget gamle nu, og mange blev udviklet i de tidlige 1950'ere! Næsten hvert moderne programmeringssprog er et sprog på højt niveau, inklusive PHP og Python. Der opfindes flere sprog hver dag (selvom der sandsynligvis er nok nu), men hvordan præcist fungerer din kode stadig korrekt, hvis computere kræver maskinkode?
Her er hvor samlingen kommer ind. En compiler er et program, der konverterer din kode på højt niveau til en form, der kan udføres. Dette kan være et andet sprog på højt niveau, men det er normalt montering. Nogle sprog (såsom Python eller Java) konverterer din kode til et kaldet mellemstadium bytekode. Dette bliver nødt til at samles igen på et senere tidspunkt, hvilket normalt udføres efter behov, f.eks. Når programmet kører. Dette er kendt som lige til tiden samling, og det er ret populært.
Hukommelsesadministration
Nu hvor du ved, hvordan programmeringssprog fungerer, så lad os se på hukommelsesstyring på sprog på højt niveau. Til disse eksempler bruger jeg pseudokode - kode skrevet ikke på noget specifikt sprog, men bruges til at vise koncepter snarere end nøjagtig syntaks. I dag ligner dette for det meste C ++, da det er det bedste sprog på højt niveau (efter min mening).
I dette afsnit hjælper det, hvis du har forståelse for hvordan RAM fungerer En hurtig og beskidt guide til RAM: Hvad du skal videRAM er en vigtig komponent på enhver computer, men det kan være forvirrende. Vi fordeler det på let at forstå, du forstår. Læs mere .
De fleste sprog har variabler - containere, der gemmer nogle data. Du skal definere datatypen eksplicit. Nogle dynamisk indtastede sprog som Python eller PHP håndterer dette for dig, men de skal stadig gøre det.
Sig, at du har en variabel:
int myNumber;
Denne kode erklærer en kaldet variabel mit nummer, og giver den en datatype af heltal. Når den først er samlet, fortolker computeren denne kommando som:
“Find noget tom hukommelse, og reserver et mellemrum stort nok til at gemme et heltal”
Når denne kommando er udført, kan den hukommelse ikke bruges af et andet program. Det indeholder ikke nogen data endnu, men det er reserveret til din myNumber-variabel.
Tildel nu en værdi til din variabel:
myNumber = 10;
For at udføre denne opgave får din computer adgang til den reserverede hukommelsesplacering og ændrer den værdi, der er gemt der, til denne nye værdi.
Nu er alt godt og godt, men hvordan bliver hukommelsesplaceringer uforbeholdne? Hvis programmer reserverede al den hukommelse, de kan lide, ville RAM'en straks blive fyldt op - det ville give en meget langsomt system.
For at undgå dette potentielle problem implementerer mange sprog a skraldemand, brugt til at ødelægge variabler (og derfor frigive de reserverede hukommelsesplaceringer), der er gået ude af sigte.
Du spekulerer måske på, hvad rækkevidde er, og hvorfor det er så vigtigt. Scope definerer grænserne og levetiden for variabler eller hukommelse, der bruges af et program. En variabel er "uden for rækkevidde", når den ikke længere kan få adgang til nogen kode (det er når affaldsopsamleren træder ind). Her er et eksempel:
funktion matematik () {int firstNumber = 1; } int secondNumber = 2; print (firstNumber + secondNumber); // vil ikke virke
Dette eksempel kompileres ikke. Variablen firstNumber er inden for matematik funktion, så det er dets omfang. Det kan ikke fås adgang til det uden for den funktion, hvori den er blevet erklæret. Dette er et vigtigt programmeringskonceptog forståelse af det er afgørende for at arbejde med tips.
Denne måde at håndtere hukommelse kaldes stak. Det er sådan, at langt de fleste programmer fungerer. Du behøver ikke at forstå tips for at bruge det, og det er ret godt struktureret. Ulempen med stakken er hastigheden. Da computeren skal tildele hukommelse, holde styr på variabler og køre affaldssamlingen, er der en lille overhead. Dette er fint til mindre programmer, men hvad med højtydende opgaver eller datatunge applikationer?
Indtast: pointers.
pointers
På overfladen lyder pointere enkle. De refererer til (pege på) en placering i hukommelsen. Dette synes muligvis ikke anderledes end "almindelige" variabler på stakken, men tro mig, der er en enorm forskel. Pegere gemmes på bunke. Dette er det modsatte af stakken - den er mindre organiseret, men er meget hurtigere.
Lad os se på, hvordan variabler tildeles i stakken:
int-nummer En = 1; int nummerTo = antal En;
Dette er enkel syntaks; Variablen nummer to indeholder nummer et. Den værdi kopieres på tværs af tildelingen fra tildelingen nummer et variabel.
Hvis du ville få hukommelsesadresse af en variabel, i stedet for dets værdi, skal du bruge ampersand-tegnet (&). Dette kaldes adresse på operatør, og er en væsentlig del af dit markørværktøjssæt.
int-nummer En = 1; int numberTwo = & numberOne;
Nu nummer to variabel punkter til en hukommelsesplacering, snarere end at få nummer én, der er kopieret til dets egen, nye hukommelsesplacering. Hvis du skulle udsende denne variabel, ville det ikke være nummer én (selvom det er gemt i hukommelsesstedet). Det udsender dets hukommelsesplacering (sandsynligvis noget i retning af 2167, selvom det varierer afhængigt af systemet og tilgængelig RAM). For at få adgang til den værdi, der er gemt i en markør, skal du i stedet for hukommelsesplacering dereference markøren. Dette får direkte adgang til værdien, som ville være nummer et i dette tilfælde. Sådan ændrer du en markør:
int nummerTo = * antal En;
Det dereference-operatør er en stjerne (*).
Dette kan være et vanskeligt begreb at forstå, så lad os gå over det igen:
- Det adresse på operator (&) gemmer hukommelsesadressen.
- Det dereference-operatør (*) får adgang til værdien.
Syntaks ændres lidt, når du erklærer pegepunkter:
int * myPointer;
Datatypen af int her henviser til datatypen markøren punkter til, og ikke selve markøren.
Nu hvor du ved, hvad pointere er, kan du gøre nogle virkelig pæne tricks med dem! Når hukommelse bruges, starter dit operativsystem sekventielt. Du kan tænke på RAM som duehuller. Mange huller til opbevaring af noget, kun en kan bruges på én gang. Forskellen her er, at disse brevhuller er alle nummererede. Når du tildeler hukommelse, starter dit operativsystem med det laveste antal og fungerer op. Det hopper aldrig rundt mellem tilfældige tal.
Når du arbejder med pegere, hvis du har tildelt en matrix, kan du nemt navigere til det næste element ved blot at øge din markør.
Her bliver det interessant. Når du videregiver værdier til en funktion (ved hjælp af variabler, der er gemt på stakken), kopieres disse værdier til din funktion. Hvis dette er store variabler, lagrer du dem nu to gange. Når din funktion er færdig, har du muligvis brug for en måde at returnere disse værdier på. Funktioner kan generelt kun returnere en ting - så hvad nu hvis du ville returnere to, tre eller fire ting?
Hvis du videregiver en markør til din funktion, kopieres kun hukommelsesadressen (hvilket er lille). Dette sparer din CPU meget arbejde! Måske peger din markør på et stort billedarray - ikke kun kan din funktion arbejde nøjagtigt det samme data, der er gemt nøjagtigt den samme hukommelsesplacering, men når det først er gjort, er det ikke nødvendigt at vende tilbage hvad som helst. Neat!
Du skal dog være meget forsigtig. Henvisere kan stadig gå ud af rækkevidden og blive indsamlet af affaldsopsamleren. Værdierne, der er gemt i hukommelsen, indsamles dog ikke. Dette kaldes en hukommelseslækage. Du kan ikke længere få adgang til dataene (da pegerne er blevet ødelagt), men de bruger stadig op hukommelsen. Dette er en almindelig årsag til, at mange programmer går ned, og det kan mislykkes spektakulært, hvis der er en stor mængde data. Det meste af tiden dræber dit operativsystem dit program, hvis du har en stor lækage (bruger mere RAM, end systemet har), men det er ikke ønskeligt.
Fejlsøgningspunkter kan være et mareridt, især hvis du arbejder med store mængder data eller arbejder i sløjfer. Deres ulemper og vanskeligheder med at forstå er virkelig værd at udveksle, du får i ydeevnen. Selvom husk, er det muligvis ikke altid, at de er nødvendige.
Det er det i dag. Jeg håber, at du har lært noget nyttigt om et komplekst emne. Vi har selvfølgelig ikke dækket alt hvad der er at vide - det er et meget komplekst emne. Hvis du er interesseret i at lære mere, kan jeg varmt anbefale det C ++ inden for 24 timer.
Hvis dette var lidt kompliceret, så kig på vores guide til de nemmeste programmeringssprog 6 nemmeste programmeringssprog at lære for begyndereAt lære at programmere handler om at finde det rigtige sprog lige så meget som det handler om opbygningsprocessen. Her er de seks mest nemmeste programmeringssprog for begyndere. Læs mere .
Lærede du, hvordan pointer fungerer i dag? Har du nogle tip og tricks, du vil dele med andre programmerere? Spring ind i kommentarerne og del dine tanker nedenfor!
Joe er uddannet inden for datalogi fra University of Lincoln, UK. Han er en professionel softwareudvikler, og når han ikke flyver droner eller skriver musik, kan han ofte findes, når han tager billeder eller producerer videoer.