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.

  • ๐Ÿ“Œ Definition: En pointer indeholder hukommelsesadressen for en anden variabel.
  • ๐Ÿ”ง Operators: &-operatoren returnerer en adresse; *-operatoren derefererer den.
  • ๐Ÿงท Erklรฆring: Skriv data_type *name, og initialiser derefter med adressen pรฅ en variabel.
  • ๐Ÿท๏ธ typer: Null-, void- og wild-pointere opfรธrer sig forskelligt og krรฆver pleje.
  • โž• Aritmetik: Ved at รธge stรธrrelsen pรฅ en pointer flyttes den med stรธrrelsen af โ€‹โ€‹dens basistype.
  • ๐Ÿค– AI Assistance: AI-vรฆrktรธjer fejlsรธger segmenteringsfejl og markerer ustabile pointere under gennemgang.

Pointer i C

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.

Ofte Stillede Spรธrgsmรฅl

En dinglende pointer peger pรฅ hukommelse, der er blevet frigjort eller er uden for rรฆkkevidde. Undgรฅ det ved at sรฆtte pointeren til NULL umiddelbart efter kald af fri, og kontrollere for NULL fรธr brug.

Dereferering af en NULL-pointer forรฅrsager en segmenteringsfejl og fรฅr programmet til at gรฅ ned under kรธrsel. Kontroller altid, at en pointer ikke er NULL, fรธr du bruger *-operatoren til at lรฆse eller skrive.

En dobbeltpointer, deklareret som int **pp, gemmer adressen pรฅ en anden pointer. Den bruges til dynamiske 2D-arrays og til at รฆndre et pointerargument i en funktion.

En pointer lagrer en hukommelsesadresse, og adresser har den samme bredde pรฅ en given platform, typisk 4 bytes pรฅ 32-bit og 8 bytes pรฅ 64-bit, uanset hvilken type den peger pรฅ.

En funktionspointer gemmer adressen pรฅ en funktion, sรฅ den kan kaldes dynamisk. Den bruges i vid udstrรฆkning til tilbagekald og til at opbygge tabeller over funktioner, der er valgt under kรธrsel.

Funktioner som malloc og calloc returnerer en pointer til hukommelse allokeret pรฅ heapen under kรธrsel. Du tilgรฅr hukommelsen via pointeren og frigiver den med ledig plads for at undgรฅ lรฆkager.

Ja. AI-assistenter lรฆser en segmenteringsfejl og den omgivende kode, forklarer derefter den sandsynlige รฅrsag, f.eks. en uinitialiseret eller frigjort pointer, og foreslรฅr en lรธsning, som du kan gennemgรฅ.

AI-drevne analysatorer, sammen med vรฆrktรธjer som Valgrind, markerer hukommelse, der aldrig frigรธres, og pointere, der bruges efter frigรธrelse. De automatiserer gennemgang og fremhรฆver risikable mรธnstre, fรธr koden sendes.

Opsummer dette indlรฆg med: