Pointere i C: Hvad er Pointer i C-programmering? Typer
โก Smart opsummering
Pointere i C er variabler, der lagrer hukommelsesadressen for en anden variabel. De muliggรธr dynamisk hukommelsesallokering, effektiv hรฅndtering af arrays og strenge samt komplekse datastrukturer ved hjรฆlp af operatorerne address-of og dereference til at lรฆse eller รฆndre vรฆrdier.

Hvad er en pointer i C?
A pointer I C er en variabel, der lagrer adressen pรฅ en anden variabel. En pointer kan ogsรฅ referere til en anden pointer eller til en funktion. En pointer kan รธges eller dekrementeres for at pege pรฅ den nรฆste eller forrige hukommelsesplacering. Formรฅlet med en pointer er at spare hukommelsesplads og opnรฅ hurtigere udfรธrelsestid.
Sรฅdan bruges pointere i C
Hvis vi deklarerer en variabel v af typen int, gemmer v en vรฆrdi. Hver variabel har, udover dens vรฆrdi, ogsรฅ en adresse, det vil sige der, hvor den er placeret i hukommelsen. Adressen kan hentes ved at sรฆtte et og-tegn (&) foran variabelnavnet. Hvis du skriver adressen pรฅ en variabel, ser den ud som et tilfรฆldigt tal, der kan variere fra kรธrsel til kรธrsel.
I stedet for at gemme en vรฆrdi, gemmer en pointer adressen pรฅ en variabel. For eksempel:
int *y = &v;
| VARIABEL | POINTER |
|---|---|
| A vรฆrdi opbevaret i en som hedder lager-/hukommelsesadresse. | A variabel at peger pรฅ lager-/hukommelsesadressen pรฅ en variabel. |
Erklรฆrer en pointer
Ligesom variabler, peger ind C programmering skal deklareres, fรธr de kan bruges. En pointerdeklaration har fรธlgende form:
data_type *pointer_variable_name;
Her, datatype er pointerens basistype og angiver typen af โโden variabel, som pointeren peger pรฅ. Stjernen (*), det samme symbol, der bruges til multiplikation, er den indirekte operator, der deklarerer en pointer. Nogle gyldige pointeredeklarationer er:
int *ptr_thing; /* pointer to an integer */ int *ptr1, thing; /* ptr1 points to an int; thing is an int */ double *ptr2; /* pointer to a double */ float *ptr3; /* pointer to a float */ char *ch1; /* pointer to a character */
Initialiser en pointer
Efter at have deklareret en pointer, initialiserer vi den med en variabel adresse. Hvis en pointer ikke initialiseres og bruges, kan resultaterne vรฆre uforudsigelige og potentielt katastrofale. For at fรฅ adressen pรฅ en variabel skal du bruge ampersand (&)-operatoren fรธr variabelnavnet:
pointer = &variable;
Et simpelt program, der illustrerer en pointer, er givet nedenfor:
#include <stdio.h> int main() { int a = 10; // variable declaration int *p; // pointer variable declaration p = &a; // store address of a in pointer p printf("Address stored in p is: %x\n", p); // access the address printf("Value stored in p is: %d\n", *p); // access the value return 0; }
Output:
Address stored in p is: 60ff08 Value stored in p is: 10
| OperaTor | Betydning |
|---|---|
| * | Tjener to formรฅl: deklarerer en pointer og returnerer vรฆrdien af โโden refererede variabel (dereference). |
| & | Tjener รฉt formรฅl: returnerer adressen pรฅ en variabel. |
Typer af pointere i C
Nul Pointer
Vi opretter en null-pointer ved at tildele vรฆrdien NULL under deklarationen. Dette er nyttigt, nรฅr der endnu ikke er tildelt nogen adresse til pointeren. En null-pointer indeholder altid vรฆrdien 0:
#include <stdio.h> int main() { int *p = NULL; // null pointer printf("The value inside variable p is: %x", p); return 0; }
Void Pointer
En void-pointer, ogsรฅ kaldet en generisk pointer, har ingen standard datatype. Den oprettes ved hjรฆlp af nรธgleordet void og kan gemme adressen pรฅ enhver variabel:
#include <stdio.h> int main() { void *p = NULL; // void pointer printf("The size of pointer is: %d\n", sizeof(p)); return 0; }
Vild pointer
En pointer kaldes en wild-pointer, hvis den ikke er initialiseret til noget. Disse pointere er ikke effektive, fordi de kan pege pรฅ en ukendt hukommelsesplacering, hvilket kan forรฅrsage problemer og fรฅ programmet til at gรฅ ned. Vรฆr altid forsigtig med wild-pointere:
#include <stdio.h> int main() { int *p; // wild pointer printf("%d", *p); return 0; }
Andre typer pegere i C inkluderer den dinglende peger, den kompleks peger, den nรฆre peger, den fjerne peger og den enorme peger.
Direkte og indirekte adgangsmarkรธrer
I C er der to รฆkvivalente mรฅder at tilgรฅ og manipulere en variabels indhold pรฅ. Direkte adgang bruger variabelnavnet direkte, mens indirekte adgang bruger en pointer til variablen:
#include <stdio.h> int var = 1; /* declare and initialize an int variable */ int *ptr; /* declare a pointer to int */ int main(void) { ptr = &var; /* point ptr to var */ printf("\nDirect access, var = %d", var); printf("\nIndirect access, var = %d", *ptr); *ptr = 48; /* change var through the pointer */ printf("\nIndirect access, var = %d", *ptr); return 0; }
Pointer-aritmetik i C
Nรฅr du arbejder med pointere, skal du overholde disse prioritetsregler. Operatorerne * og & har samme prioritet som de unรฆre operatorer (negation !, increment ++, decrement โ). I det samme udtryk evalueres de unรฆre operatorer *, &, !, ++ og โ fra hรธjre mod venstre. Hvis en pointer P peger pรฅ en variabel X, kan *P bruges overalt, hvor X kan skrives. Fรธlgende udtryk er รฆkvivalente:
| Udtryk | Tilsvarende udtryk |
|---|---|
| Y = *P + 1 | Y = X + 1 |
| *P = *P + 10 | X = X + 10 |
| *P += 2 | X += 2 |
| ++*P | ++X |
| (*P)++ | X++ |
I sidste tilfรฆlde krรฆves parenteser: fordi de unรฆre operatorer * og ++ evalueres fra hรธjre mod venstre, ville pointeren P blive forรธget uden parenteser, ikke det objekt, den peger pรฅ. De aritmetiske operationer, der er tilgรฆngelige pรฅ pointere, er tildeling, forรธgelse og formindskelse samt addition eller subtraktion.tracat indtaste et heltalsforskydning, som flytter markรธren med det pรฅgรฆldende antal elementer (hvert trin er lig med stรธrrelsen i bytes af basistypen).
C-pointere og -arrays med eksempler
Traditionelt tilgรฅr vi array-elementer ved hjรฆlp af et indeks, men pointere gรธr dette ogsรฅ nemt. En pointer, der er sat til array-navnet, peger pรฅ det fรธrste element:
#include <stdio.h> int main() { int a[5] = {1, 2, 3, 4, 5}; // array initialization int *p; // pointer declaration p = a; // p points to the first element; same as &a[0] for (int i = 0; i < 5; i++) { printf("%d\n", *p); // print element p++; // move to the next element } return 0; }
Hvis man tilfรธjer et tal til en pointer, flyttes den det antal elementer fremad. Hvis p peger pรฅ hukommelseslokation 0, sรฅ fรฅr p + 1 pointeren til at pege pรฅ hukommelseslokation 1.
C Pointer og strenge med eksempler
En streng er et array af char-objekter, der slutter med et null-tegn '\0'. Vi kan manipulere strenge ved hjรฆlp af pointere:
#include <stdio.h> #include <string.h> int main() { char str[] = "Hello Guru99!"; char *p; p = str; printf("First character is: %c\n", *p); p = p + 1; printf("Next character is: %c\n", *p); p = str; // reset the pointer for (int i = 0; i < strlen(str); i++) { printf("%c\n", *p); p++; } return 0; }
En anden mรฅde at hรฅndtere strenge pรฅ er med et array af pointere:
#include <stdio.h> int main() { char *materials[] = {"iron", "copper", "gold"}; for (int i = 0; i < 3; i++) printf("%s\n", materials[i]); return 0; }
Fordele ved pointere i C
- Pointere er nyttige til at fรฅ direkte adgang til hukommelsesplaceringer.
- De giver en effektiv mรฅde at fรฅ adgang til elementerne i et array.
- De bruges til dynamisk hukommelsesallokering og deallokering.
- De bruges til at danne komplekse datastrukturer sรฅsom sammenkรฆdede lister, grafer og trรฆer.
Ulemper ved pointere i C
- Pointers er lidt komplekse at forstรฅ.
- De kan forรฅrsage fejl sรฅsom segmenteringsfejl eller adgang til en utilsigtet hukommelsesplacering.
- En forkert vรฆrdi givet til en pointer kan forรฅrsage hukommelseskorruption.
- Pointere er ogsรฅ ansvarlige for hukommelseslรฆkager, hvis hukommelse ikke frigรธres.
- Det er programmรธrens ansvar at hรฅndtere en pointer omhyggeligt.
