Hvad er pointer i C?
Markøren i C er en variabel, der gemmer adressen på en anden variabel. En markør kan også bruges til at henvise til en anden markørfunktion. En markør kan forøges / dekrementeres, dvs. for at pege på den næste / forrige hukommelsesplacering. Pointerens formål er at spare hukommelsesplads og opnå hurtigere udførelsestid.
Sådan bruges markører i C
Hvis vi erklærer en variabel v af typen int, gemmer v faktisk en værdi.
v er lig med nul nu.
Hver variabel har dog bortset fra værdi også sin adresse (eller, ganske enkelt, hvor den er placeret i hukommelsen). Adressen kan hentes ved at sætte et ampersand (&) foran variabelnavnet.
Hvis du udskriver adressen på en variabel på skærmen, ser den ud som et helt tilfældigt tal (desuden kan det være forskelligt fra løb til løb).
Lad os prøve dette i praksis med markør i C eksempel
Resultatet af dette program er -480613588.
Hvad er en markør nu? I stedet for at gemme en værdi vil en markør y gemme adressen på en variabel.
Markørvariabel
Int * y = & v;
VARIABEL |
POINTER |
En værdi gemt i en navngivet lager- / hukommelsesadresse |
En variabel, der peger på lager- / hukommelsesadressen for en anden variabel |
Erklæring om en pointer
Ligesom variabler, markører i C progra mming skal erklæres, før de kan bruges i dit program. Markører kan navngives alt, hvad du vil, så længe de overholder C’s navngivningsregler. En markørerklæring har følgende form.
data_type * pointer_variable_name;
Her,
- data_type er markørens basistype af C’s variabeltyper og angiver typen af variablen, som markøren peger på.
- Stjernen (*: den samme stjerne, der blev brugt til multiplikation), som er indirection operator, erklærer en pointer.
Lad os se nogle gyldige pointerdeklarationer i denne C-pointer-tutorial:
Initialiser en pointer
Efter at have erklæret en markør initialiserer vi den som standardvariabler med en variabel adresse. Hvis markører i C-programmering ikke er uinitialiseret og bruges i programmet, er resultaterne uforudsigelige og potentielt katastrofale.
For at få adressen på en variabel bruger vi ampersand-operatøren (&), placeret foran navnet på en variabel, hvis adresse vi har brug for. Pointerinitialisering udføres med følgende syntaks.
Pointer Syntax
pointer = &variable;
Et simpelt program til pointerillustration er angivet nedenfor:
Output:
Address stored in a variable p is:60ff08Value stored in a variable p is:10
Operatør | Betydning |
* | Serverer 2 formål
|
& | Serverer kun 1 formål
|
Typer af markører i C
Følgende er de forskellige typer markører i C:
Null Pointer
Vi kan oprette en nulpointer ved at tildele nulværdi under pointerdeklarationen. Denne metode er nyttig, når du ikke har tildelt nogen adresse til markøren. En nul pointer indeholder altid værdien 0.
Følgende program illustrerer brugen af en nul pointer:
#include <stdio.h>int main(){int *p = NULL; //null pointerprintf("The value inside variable p is:\n%x”,p);return 0;}
Output:
The value inside variable p is:0
Void Pointer
I C-programmering kaldes en ugyldig pointer også som en generisk pointer. Den har ikke nogen standard datatype. En ugyldig markør oprettes ved hjælp af nøgleordet ugyldigt. Den kan bruges til at gemme en adresse på enhver variabel.
Følgende program illustrerer brugen af en ugyldig markør:
#include <stdio.h>int main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}
Output:
The size of pointer is:4
Vilde markører
En markør siges at være en vildmarkør, hvis den ikke initialiseres til noget. Disse typer C-markører er ikke effektive, fordi de kan pege på en ukendt hukommelsesplacering, som kan forårsage problemer i vores program, og det kan føre til nedbrud på programmet. Man skal altid være forsigtig, når man arbejder med vilde pegepinde.
Følgende program illustrerer brugen af vildmarkør:
#include <stdio.h>int main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}
Output
timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main
Andre typer markører i “c” er som følger:
- Hængende markør
- Kompleks markør
- Nær markør
- Fjern markør
- Stor markør
Direkte og indirekte adgangspegere
I C er der to ækvivalente måder for at få adgang til og manipulere et variabelt indhold
- Direkte adgang: vi bruger direkte variabelnavnet
- Indirekte adgang: vi bruger en markør til variablen
Lad os forstå dette ved hjælp af programmet nedenfor
Efter kompilering af programmet uden fejl er resultatet:
Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48
Markøraritmetik i C
Markøroperationerne er opsummeret i følgende figur
Prioritetshandling (forrang)
Når vi arbejder med C-pegere, skal vi overholde følgende prioritetsregler:
Hvis en P-markør peger på en X-variabel, kan * P bruges hvor som helst X kan skrives.
Følgende udtryk er ækvivalente:
I sidstnævnte tilfælde er parenteser nødvendige: da de unære operatorer * og ++ vurderes fra højre til venstre uden parentes markøren P ville blive forøget, ikke det objekt, som P peger på.
Nedenstående tabel viser den aritmetiske og grundlæggende handling, der kan bruges, når der behandles C-pegere
Drift | Forklaring |
Opgave | int * P1, * P2 P1 = P2; P1 og P2 peger på den samme heltalsvariabel |
Incrementation and decrementation | Int * P1; P1 ++; P1–; |
Tilføjelse af en forskydning (konstant) | Dette gør det muligt for markøren at flytte N-elementer i en tabel. Markøren øges eller formindskes med N gange antallet af byte (r) af typen af variablen. P1 + 5; |
C markører & Arrays med eksempler
Traditionelt har vi få adgang til arrayelementerne ved hjælp af dets indeks, men denne metode kan elimineres ved hjælp af pegepinde. Markører gør det let at få adgang til hvert array-element.
Output
12345
Tilføjelse af et bestemt tal til en markør flytter markørens placering til den værdi, der opnås ved en tilføjelsesoperation. Antag at p er en markør, der i øjeblikket peger på hukommelsesplaceringen 0, hvis vi udfører følgende additionsoperation, p + 1, så udføres den på denne måde:
Da p i øjeblikket peger på placeringen 0 efter tilføjelse af 1, bliver værdien 1, og markøren vil derfor pege på hukommelsesplaceringen 1.
C Pointer og strenge med eksempler
En streng er en matrix af char-objekter, der slutter med et nulltegn “\ 0”. Vi kan manipulere strenge ved hjælp af pegepinde. Denne markør i C-eksemplet forklarer dette afsnit
Output
First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!
En anden måde at håndtere strenge på er med en række markører som i det følgende program:
Output:
Please remember these materials:ironcoppergold
Fordele ved markører i C
- Markører er nyttige for adgang hukommelsesplaceringer.
- Pointere giver en effektiv måde at få adgang til elementerne i en array-struktur.
- Pointere bruges til dynamisk hukommelsesallokering samt deallocation.
- Markører bruges til at danne komplekse datastrukturer såsom linket liste, graf, træ osv.
Ulemper ved markører i C
- Markører er lidt komplekse at forstå.
- Markører kan føre til forskellige fejl såsom segmenteringsfejl eller kan få adgang til en hukommelsesplacering, der slet ikke er påkrævet.
- Hvis der vises en forkert værdi til en markør, det kan forårsage hukommelseskorruption.
- Markører er også ansvarlige for hukommelseslækage.
- Markører er forholdsvis langsommere end variablerne.
- Programmører finder det meget vanskeligt at arbejde med markørerne; derfor er det programmørens ansvar at manipulere en markør omhyggeligt.
Resumé
- En markør er intet andet end en hukommelsesplacering, hvor data lagres.
- En markør bruges til at få adgang til hukommelsesplaceringen.
- Der findes forskellige typer markører, såsom en nulmarkør, vildmarkør, ugyldig markør og andre typer markører.
- Pointer kan bruges med array og streng for at få adgang til elementer mere effektivt.
- Vi kan oprette funktionspegere til at påkalde en funktion dynamisk.
- Aritmetiske operationer kan udføres på en markør, der er kendt som pointer aritmetik.
- Markører kan også pege på funktion, der gør det let at kalde forskellige funktioner i tilfælde af at definere en række markører.
- Når du vil håndtere forskellige variable datatyper, kan du brug en typecast ugyldig markør.