Pokazivači u C-u: Što je pokazivač u C programiranju? Vrste

⚡ Pametni sažetak

Pokazivači u C-u su varijable koje pohranjuju memorijsku adresu druge varijable. Omogućuju dinamičku alokaciju memorije, učinkovito rukovanje nizovima i stringovima te složene strukture podataka, koristeći operatore adrese i dereferenciranja za čitanje ili mijenjanje vrijednosti.

  • 📌 Definicija: Pokazivač sadrži memorijsku adresu druge varijable.
  • 🔧 Operatorovi: Operator & vraća adresu; operator * je dereferencira.
  • 🧷 Izjava: Napišite data_type *name, a zatim inicijalizirajte s adresom varijable.
  • 🏷️ vrste: Null, void i wild pokazivači ponašaju se drugačije i zahtijevaju oprez.
  • Aritmetika: Povećanje pokazivača pomiče ga za veličinu njegovog osnovnog tipa.
  • 🤖 AI pomoć: Alati umjetne inteligencije otklanjaju pogreške u segmentaciji i označavaju viseće pokazivače tijekom pregleda.

Pokazivači u C-u

Što je pokazivač u C-u?

A pokazivač U C-u je varijabla koja pohranjuje adresu druge varijable. Pokazivač se također može odnositi na drugi pokazivač ili na funkciju. Pokazivač se može povećavati ili smanjivati ​​kako bi pokazivao na sljedeću ili prethodnu lokaciju u memoriji. Svrha pokazivača je ušteda memorijskog prostora i postizanje bržeg vremena izvršavanja.

Kako koristiti pokazivače u C

Ako deklariramo varijablu v tipa int, v pohranjuje vrijednost. Svaka varijabla, osim svoje vrijednosti, ima i adresu, odnosno mjesto gdje se nalazi u memoriji. Adresa se može dohvatiti stavljanjem znaka & (&) ispred imena varijable. Ako ispišete adresu varijable, ona izgleda kao slučajni broj koji se može razlikovati od pokretanja do pokretanja.

Umjesto pohranjivanja vrijednosti, pokazivač pohranjuje adresu varijable. Na primjer:

int *y = &v;
PROMJENJIVOM POKAZIVAČ
A vrijednost pohranjeno u pod nazivom adresa pohrane/memorije. A varijabla tu pokazuje na adresa pohrane/memorije drugi promjenjiva.

Deklariranje pokazivača

Poput varijabli, pokazivači u C programiranje moraju se deklarirati prije nego što se mogu koristiti. Deklaracija pokazivača ima sljedeći oblik:

data_type *pointer_variable_name;

Ovdje, tip podataka je osnovni tip pokazivača i označava tip varijable na koju pokazivač pokazuje. Zvjezdica (*), isti simbol koji se koristi za množenje, je operator indirekcije koji deklarira pokazivač. Neke valjane deklaracije pokazivača su:

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 */

Inicijaliziraj pokazivač

Nakon što deklariramo pokazivač, inicijaliziramo ga adresom varijable. Ako pokazivač nije inicijaliziran i koristi se, rezultati mogu biti nepredvidivi i potencijalno katastrofalni. Da biste dobili adresu varijable, upotrijebite operator ampersand (&) ispred naziva varijable:

pointer = &variable;

Jednostavan program koji ilustrira pokazivač dan je u nastavku:

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

Izlaz:

Address stored in p is: 60ff08
Value stored in p is: 10
Operahumka Značenje
* Služi dvjema svrhama: deklarira pokazivač i vraća vrijednost referencirane varijable (dereferenciranje).
& Služi jednoj svrsi: vraća adresu varijable.

Vrste pokazivača u C-u

Nulti pokazivač

Null pokazivač stvaramo dodjeljivanjem vrijednosti NULL tijekom deklaracije. To je korisno kada pokazivaču još nije dodijeljena adresa. Null pokazivač uvijek sadrži vrijednost 0:

#include <stdio.h>
int main()
{
   int *p = NULL;     // null pointer
   printf("The value inside variable p is: %x", p);
   return 0;
}

Pokazivač praznine

Pokazivač praznog polja, također nazvan generički pokazivač, nema standardni tip podataka. Stvara se pomoću ključne riječi void i može pohraniti adresu bilo koje varijable:

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

Divlji pokazivač

Pokazivač se naziva wild pokazivač ako nije inicijaliziran ni na što. Ovi pokazivači nisu učinkoviti jer mogu pokazivati ​​na nepoznatu lokaciju u memoriji, što može uzrokovati probleme i rušenje programa. Uvijek budite oprezni s wild pokazivačima:

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

Druge vrste pokazivača u C-u uključuju viseći pokazivač, kompleksni pokazivač, bliski pokazivač, daleki pokazivač i ogromni pokazivač.

Izravni i neizravni pristupni pokazivači

U C-u postoje dva ekvivalentna načina pristupa i manipuliranja sadržajem varijable. Izravni pristup izravno koristi naziv varijable, dok neizravni pristup koristi pokazivač na varijablu:

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

Aritmetika pokazivača u C-u

Pri radu s pokazivačima, pridržavajte se ovih pravila prioriteta. Operatori * i & imaju isti prioritet kao i unarni operatori (negacija !, inkrement ++, dekrement –). U istom izrazu, unarni operatori *, &, !, ++ i — se procjenjuju s desna na lijevo. Ako pokazivač P pokazuje na varijablu X, tada se *P može koristiti gdje god se može napisati X. Sljedeći izrazi su ekvivalentni:

Izraz Ekvivalentni izraz
Y = *P + 1 Y = X + 1
*P = *P + 10 X = X + 10
*P + = 2 X + = 2
+++P ++X
(*P)++ X++

U posljednjem slučaju, zagrade su potrebne: budući da se unarni operatori * i ++ procjenjuju s desna na lijevo, bez zagrada bi se povećavao pokazivač P, a ne objekt na koji pokazuje. Aritmetičke operacije dostupne na pokazivačima su dodjeljivanje, povećanje i smanjenje te zbrajanje ili oduzimanje.traczadavanjem cjelobrojnog pomaka, koji pomiče pokazivač za toliko elemenata (svaki korak jednak je veličini osnovnog tipa u bajtovima).

C pokazivači i nizovi s primjerima

Tradicionalno, elementima niza pristupamo pomoću indeksa, ali pokazivači to također olakšavaju. Pokazivač postavljen na naziv niza pokazuje na prvi 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;
}

Dodavanje broja pokazivaču pomiče ga za toliko elemenata naprijed. Ako p pokazuje na memorijsku lokaciju 0, tada p + 1 čini da pokazivač pokazuje na memorijsku lokaciju 1.

C pokazivači i nizovi s primjerima

Niz znakova je niz objekata tipa char koji završava s null znakom '\0'. Nizovima znakova možemo manipulirati pomoću pokazivača:

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

Drugi način rada sa stringovima je pomoću niza pokazivača:

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

Prednosti pokazivača u C-u

  • Pokazivači su korisni za izravan pristup memorijskim lokacijama.
  • Oni pružaju učinkovit način pristupa elementima niza.
  • Koriste se za dinamičku alokaciju i dealokaciju memorije.
  • Koriste se za formiranje složenih struktura podataka kao što su povezane liste, grafovi i stabla.

Nedostaci pokazivača u C-u

  • Pokazivači su malo složeni za razumijevanje.
  • Mogu uzrokovati pogreške poput segmentacijskih grešaka ili pristupa neželjenoj memorijskoj lokaciji.
  • Netočna vrijednost dana pokazivaču može uzrokovati oštećenje memorije.
  • Pokazivači su također odgovorni za curenje memorije ako se memorija ne oslobodi.
  • Programerova je odgovornost pažljivo rukovati pokazivačem.

Pitanja i odgovori

Viseći pokazivač upućuje na memoriju koja je oslobođena ili je izvan dosega. Izbjegnite to postavljanjem pokazivača na NULL odmah nakon pozivanja funkcije free i provjerom NULL prije upotrebe.

Dereferenciranje NULL pokazivača uzrokuje segmentacijsku grešku i rušenje programa tijekom izvođenja. Uvijek provjerite da pokazivač nije NULL prije korištenja operatora * za čitanje ili pisanje.

Dvostruki pokazivač, deklariran kao int **pp, pohranjuje adresu drugog pokazivača. Koristi se za dinamičke 2D nizove i za modificiranje argumenta pokazivača unutar funkcije.

Pokazivač pohranjuje memorijsku adresu, a adrese su iste širine na određenoj platformi, obično 4 bajta na 32-bitnoj i 8 bajtova na 64-bitnoj, bez obzira na tip na koji pokazuje.

Pokazivač funkcije pohranjuje adresu funkcije tako da se može dinamički pozivati. Široko se koristi za povratne pozive i za izgradnju tablica funkcija odabranih tijekom izvođenja.

Funkcije poput malloc i calloc vraćaju pokazivač na memoriju alociranu na hrpi tijekom izvođenja. Toj memoriji pristupate putem pokazivača i oslobađate je s naredbom free kako biste izbjegli curenje.

Da. AI asistenti čitaju segmentacijsku grešku i okolni kod, zatim objašnjavaju vjerojatni uzrok, poput neinicijaliziranog ili oslobođenog pokazivača, te predlažu rješenje koje možete pregledati.

Analizatori pokretani umjetnom inteligencijom, uz alate poput Valgrinda, označavaju memoriju koja se nikada ne oslobađa i pokazivače koji se koriste nakon oslobađanja. Automatiziraju pregled i ističu rizične obrasce prije nego što se kod isporuči.

Sažmite ovu objavu uz: