Pekere i C: Hva er Peker i C-programmering? Typer

โšก Smart oppsummering

Pekere i C er variabler som lagrer minneadressen til en annen variabel. De muliggjรธr dynamisk minneallokering, effektiv hรฅndtering av arrayer og strenger, og komplekse datastrukturer, ved รฅ bruke operatorene address-of og dereferanse til รฅ lese eller endre verdier.

  • ๐Ÿ“Œ Definisjon: En peker inneholder minneadressen til en annen variabel.
  • ๐Ÿ”ง Operators: &-operatoren returnerer en adresse; *-operatoren dereferererer den.
  • ๐Ÿงท Erklรฆring: Skriv data_type *name, og initialiser deretter med adressen til en variabel.
  • ๐Ÿท๏ธ typer: Null-, void- og wild-pekere oppfรธrer seg forskjellig og trenger forsiktighet.
  • โž• Aritmetikk: ร… รธke en peker flytter den med stรธrrelsen pรฅ basistypen.
  • ๐Ÿค– AI-hjelp: AI-verktรธy feilsรธker segmenteringsfeil og flagger dinglende pekere under gjennomgang.

Pekere i C

Hva er en peker i C?

A pekeren I C er en variabel som lagrer adressen til en annen variabel. En peker kan ogsรฅ referere til en annen peker eller til en funksjon. En peker kan รธkes eller reduseres for รฅ peke til neste eller forrige minneplassering. Hensikten med en peker er รฅ spare minneplass og oppnรฅ raskere utfรธrelsestid.

Hvordan bruke pekere i C

Hvis vi deklarerer en variabel v av typen int, lagrer v en verdi. Hver variabel, i tillegg til verdien, har ogsรฅ en adresse, det vil si der den er plassert i minnet. Adressen kan hentes ved รฅ sette et &-tegn (&) foran variabelnavnet. Hvis du skriver ut adressen til en variabel, ser den ut som et tilfeldig tall som kan variere fra kjรธring til kjรธring.

I stedet for รฅ lagre en verdi, lagrer en peker adressen til en variabel. For eksempel:

int *y = &v;
VARIABEL PEKER
A verdi lagret i a navngitt lagrings-/minneadresse. A variabel Det poeng til lagrings-/minneadressen til en annen variabel.

Erklรฆrer en peker

Som variabler, pekere inn C programmering mรฅ deklareres fรธr de kan brukes. En pekerdeklarasjon har fรธlgende form:

data_type *pointer_variable_name;

Her data-type er pekerens basistype og indikerer typen variabel som pekeren peker til. Stjernen (*), det samme symbolet som brukes for multiplikasjon, er indirekteoperatoren som deklarerer en peker. Noen gyldige pekerdeklarasjoner 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 peker

Etter รฅ ha deklarert en peker, initialiserer vi den med en variabel adresse. Hvis en peker ikke initialiseres og brukes, kan resultatene vรฆre uforutsigbare og potensielt katastrofale. For รฅ fรฅ adressen til en variabel, bruk ampersand (&)-operatoren fรธr variabelnavnet:

pointer = &variable;

Et enkelt program som illustrerer en peker er gitt 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;
}

Utgang:

Address stored in p is: 60ff08
Value stored in p is: 10
Operator Betydning
* Tjener to formรฅl: deklarerer en peker og returnerer verdien til den refererte variabelen (dereferanse).
& Tjener ett formรฅl: returnerer adressen til en variabel.

Typer pekere i C

Null-peker

Vi oppretter en nullpeker ved รฅ tilordne verdien NULL under deklarasjonen. Dette er nyttig nรฅr ingen adresse er tilordnet pekeren ennรฅ. En nullpeker inneholder alltid verdien 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-peker, ogsรฅ kalt en generisk peker, har ingen standard datatype. Den opprettes ved hjelp av nรธkkelordet void og kan lagre adressen til en hvilken som helst variabel:

#include <stdio.h>
int main()
{
   void *p = NULL;    // void pointer
   printf("The size of pointer is: %d\n", sizeof(p));
   return 0;
}

Vill peker

En peker kalles en jokerpeker hvis den ikke er initialisert til noe. Disse pekerne er ikke effektive fordi de kan peke til en ukjent minneplassering, noe som kan forรฅrsake problemer og fรฅ programmet til รฅ krasje. Vรฆr alltid forsiktig med jokerpekere:

#include <stdio.h>
int main()
{
   int *p;          // wild pointer
   printf("%d", *p);
   return 0;
}

Andre typer pekere i C inkluderer dinglende peker, kompleks peker, nรฆrpeker, fjernpeker og stor peker.

Direkte og indirekte tilgangspekere

I C finnes det to likeverdige mรฅter รฅ fรฅ tilgang til og manipulere innholdet i en variabel pรฅ. Direkte tilgang bruker variabelnavnet direkte, mens indirekte tilgang bruker en peker til variabelen:

#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;
}

Pekeraritmetikk i C

Nรฅr du arbeider med pekere, mรฅ du fรธlge disse prioritetsreglene. Operatorene * og & har samme prioritet som de unรฆre operatorene (negasjon !, รธkning ++, reduksjon โ€“). I samme uttrykk evalueres de unรฆre operatorene *, &, !, ++ og โ€” fra hรธyre mot venstre. Hvis en peker P peker pรฅ en variabel X, kan *P brukes overalt hvor X kan skrives. Fรธlgende uttrykk er likeverdige:

Uttrykk Ekvivalent uttrykk
Y = *P + 1 Y = X + 1
*P = *P + 10 X = X + 10
*P += 2 X += 2
++*P ++X
(*P)++ X ++

I det siste tilfellet kreves parenteser: fordi de unรฆre operatorene * og ++ evalueres fra hรธyre mot venstre, ville pekeren P bli inkrementert uten parenteser, ikke objektet den peker til. De aritmetiske operasjonene som er tilgjengelige pรฅ pekere er tildeling, inkrementering og dekrementering, og addisjon eller subtraksjon.tracet heltallsforskyvning, som flytter pekeren med det antallet elementer (hvert trinn tilsvarer stรธrrelsen i byte av basistypen).

C-pekere og -matriser med eksempler

Tradisjonelt sett bruker vi en indeks til รฅ fรฅ tilgang til array-elementer, men pekere gjรธr dette ogsรฅ enkelt. En peker satt til array-navnet peker til det fรธrste elementet:

#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;
}

ร… legge til et tall til en peker flytter den sรฅ mange elementer fremover. Hvis p peker pรฅ minneplassering 0, vil p + 1 fรฅ pekeren til รฅ peke pรฅ minneplassering 1.

C Pekere og strenger med eksempler

En streng er en matrise av char-objekter som slutter med nulltegnet '\0'. Vi kan manipulere strenger ved hjelp av pekere:

#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 annen mรฅte รฅ hรฅndtere strenger pรฅ er med en rekke pekere:

#include <stdio.h>
int main()
{
   char *materials[] = {"iron", "copper", "gold"};
   for (int i = 0; i < 3; i++)
      printf("%s\n", materials[i]);
   return 0;
}

Fordeler med Pointers i C

  • Pekere er nyttige for รฅ fรฅ direkte tilgang til minneplasseringer.
  • De gir en effektiv mรฅte รฅ fรฅ tilgang til elementene i en matrise.
  • De brukes til dynamisk minneallokering og deallokering.
  • De brukes til รฅ danne komplekse datastrukturer som koblede lister, grafer og trรฆr.

Ulemper med Pointers i C

  • Pekere er litt komplekse รฅ forstรฅ.
  • De kan forรฅrsake feil som segmenteringsfeil eller tilgang til en utilsiktet minneplassering.
  • En feil verdi gitt til en peker kan fรธre til minnefeil.
  • Pekere er ogsรฅ ansvarlige for minnelekkasjer hvis minne ikke frigjรธres.
  • Det er programmererens ansvar รฅ hรฅndtere en peker forsiktig.

Spรธrsmรฅl og svar

En dinglende peker peker pรฅ minne som er frigjort eller utenfor rekkevidde. Unngรฅ dette ved รฅ sette pekeren til NULL umiddelbart etter at ledig funksjon er aktivert, og sjekke for NULL fรธr bruk.

Dereferering av en NULL-peker forรฅrsaker en segmenteringsfeil og krasjer programmet under kjรธring. Sjekk alltid at en peker ikke er NULL fรธr du bruker *-operatoren til รฅ lese eller skrive.

En dobbelpeker, deklarert som int **pp, lagrer adressen til en annen peker. Den brukes for dynamiske 2D-matriser og for รฅ endre et pekerargument i en funksjon.

En peker lagrer en minneadresse, og adressene har samme bredde pรฅ en gitt plattform, vanligvis 4 byte pรฅ 32-bit og 8 byte pรฅ 64-bit, uavhengig av hvilken type den peker til.

En funksjonspeker lagrer adressen til en funksjon slik at den kan kalles dynamisk. Den brukes mye til tilbakeringinger og for รฅ bygge tabeller over funksjoner som er valgt under kjรธretid.

Funksjoner som malloc og calloc returnerer en peker til minne som er allokert pรฅ heapen under kjรธretid. Du fรฅr tilgang til minnet gjennom pekeren og frigjรธr det med ledig plass for รฅ unngรฅ lekkasjer.

Ja. AI-assistenter leser en segmenteringsfeil og den omkringliggende koden, forklarer deretter den sannsynlige รฅrsaken, for eksempel en uinitialisert eller frigjort peker, og foreslรฅr en lรธsning du kan gjennomgรฅ.

AI-drevne analysatorer, sammen med verktรธy som Valgrind, flagger minne som aldri frigjรธres og pekere som brukes etter at det er frigjort. De automatiserer gjennomgang og fremhever risikable mรธnstre fรธr koden sendes.

Oppsummer dette innlegget med: