Pokazatelji u programiranju na C: Što je pokazivač, tipovi & Primjeri

Sadržaj:

Anonim

Što je pokazivač u C?

Pointer u C, varijabla koja pohranjuje adresu drugoj varijabli. Pokazivač se također može koristiti za upućivanje na drugu funkciju pokazivača. Pokazivač se može povećavati / smanjivati, tj. Da usmjeri na sljedeće / prethodno memorijsko mjesto. Svrha pokazivača je uštedjeti prostor u memoriji i postići brže vrijeme izvršavanja.

Kako se koriste pokazivači u C

Ako proglasimo varijablu v tipa int, v će zapravo pohraniti vrijednost.

v je sada jednako nuli.

Međutim, svaka varijabla, osim vrijednosti, ima i svoju adresu (ili, jednostavno rečeno, gdje se nalazi u memoriji). Adresa se može dobiti stavljanjem znaka & (&) ispred imena varijable.

Ako na zaslonu ispišete adresu varijable, ona će izgledati kao potpuno slučajan broj (štoviše, može se razlikovati od trčanja do trčanja).

Pokušajmo to u praksi s pokazivačem u C primjeru

Rezultat ovog programa je -480613588.

Što je pokazivač? Umjesto pohrane vrijednosti, pokazivač će y pohraniti adresu varijable.

Varijabla pokazivača

Int * y = & v;

PROMJENJIVO

POKAZIVAČ

Vrijednost pohranjena u imenu pohranu / memorijsku adresu

Varijabilne da ukazuje na skladištenje / memorijske adrese drugom varijablom

Izjava pokazivača

Kao i varijable, pokazivači u programiranju na C moraju se deklarirati prije nego što se mogu koristiti u vašem programu. Pokazivači se mogu imenovati kako god želite ako se pridržavaju C-ovih pravila imenovanja. Deklaracija pokazivača ima sljedeći oblik.

data_type * pointer_variable_name;

Ovdje,

  • data_type je osnovni tip pokazivača tipova varijabli C i označava tip varijable na koju pokazivač pokazuje.
  • Zvjezdica (*: ista zvjezdica koja se koristi za množenje) koja je posredni operator, deklarira pokazivač.

Pogledajmo neke valjane deklaracije pokazivača u ovom vodiču C pokazivača:

int *ptr_thing; /* pointer to an integer */int *ptr1,thing;/* ptr1 is a pointer to type integer and thing is an integer variable */double *ptr2; /* pointer to a double */float *ptr3; /* pointer to a float */char *ch1 ; /* pointer to a character */float *ptr, variable;/*ptr is a pointer to type float and variable is an ordinary float variable */

Inicijalizirajte pokazivač

Nakon proglašenja pokazivača, inicijaliziramo ga poput standardnih varijabli s adresom varijable. Ako se pokazivači u programiranju na C ne inicijaliziraju i ne koriste u programu, rezultati su nepredvidljivi i potencijalno katastrofalni.

Da bismo dobili adresu varijable, koristimo operator ampersand (&), postavljen ispred imena varijable čija adresa nam treba. Inicijalizacija pokazivača vrši se sa sljedećom sintaksom.

Sintaksa pokazivača

 pointer = &variable; 

Jednostavan program za ilustraciju pokazivača dat je u nastavku:

#include int main(){int a=10; //variable declarationint *p; //pointer variable declarationp=&a; //store address of variable a in pointer pprintf("Address stored in a variable p is:%x\n",p); //accessing the addressprintf("Value stored in a variable p is:%d\n",*p); //accessing the valuereturn 0;}

Izlaz:

Address stored in a variable p is:60ff08Value stored in a variable p is:10
Operater Značenje
* Služi u dvije svrhe
  1. Izjava pokazivača
  2. Vraća vrijednost referencirane varijable
& Služi samo za jednu svrhu
  • Vraća adresu varijable

Vrste pokazivača u C

Slijede različite vrste pokazivača u C :

Nulti pokazivač

Nulti pokazivač možemo stvoriti dodjeljivanjem null vrijednosti tijekom deklaracije pokazivača. Ova je metoda korisna kada pokazivaču nije dodijeljena nijedna adresa. Nulti pokazivač uvijek sadrži vrijednost 0.

Sljedeći program ilustrira upotrebu null pokazivača:

#include int main(){int *p = NULL; //null pointerprintf(“The value inside variable p is:\n%x”,p);return 0;}

Izlaz:

The value inside variable p is:0

Prazni pokazivač

U programiranju na C, void pokazivač naziva se i generičkim pokazivačem. Nema nijedan standardni tip podataka. Pokazatelj za prazninu stvara se pomoću ključne riječi void. Može se koristiti za pohranu adrese bilo koje varijable.

Sljedeći program ilustrira upotrebu praznog pokazivača:

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

Izlaz:

The size of pointer is:4

Divlji pokazivač

Kaže se da je pokazivač divlji pokazivač ako se ne inicijalizira ni na što. Ove vrste pokazivača C nisu učinkovite jer mogu ukazivati ​​na neko nepoznato memorijsko mjesto što može uzrokovati probleme u našem programu i može dovesti do pada programa. Uvijek treba biti oprezan dok radite s divljim kazaljkama.

Sljedeći program ilustrira upotrebu divljeg pokazivača:

#include int main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}

Izlaz

timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main

Ostale vrste pokazivača u 'c' su kako slijedi:

  • Viseći pokazivač
  • Složeni pokazivač
  • Blizu pokazivača
  • Daleki pokazivač
  • Ogroman pokazivač

Pokazatelji izravnog i neizravnog pristupa

U C-u postoje dva ekvivalentna načina za pristup i manipuliranje promjenjivim sadržajem

  • Izravni pristup: koristimo izravno ime varijable
  • Neizravni pristup: koristimo pokazivač na varijablu

Shvatimo to uz pomoć programa u nastavku

#include /* Declare and initialize an int variable */int var = 1;/* Declare a pointer to int */int *ptr;int main( void ){/* Initialize ptr to point to var */ptr = &var;/* Access var directly and indirectly */printf("\nDirect access, var = %d", var);printf("\nIndirect access, var = %d", *ptr);/* Display the address of var two ways */printf("\n\nThe address of var = %d", &var);printf("\nThe address of var = %d\n", ptr);/*change the content of var through the pointer*/*ptr=48;printf("\nIndirect access, var = %d", *ptr);return 0;}

Nakon sastavljanja programa bez grešaka, rezultat je:

Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48

Aritmetika pokazivača u C

Operacije pokazivača sažete su na sljedećoj slici

Operacije pokazivača

Prioritetna operacija (prioritet)

Kada radimo s pokazivačima C, moramo poštivati ​​sljedeća pravila prioriteta:

  • Operatori * i & imaju isti prioritet kao i unarni operatori (negacija !, priraštaj ++, dekrement--).
  • U istom izrazu, unarni operatori *, &,!, ++, - vrednuju se zdesna ulijevo.

Ako pokazivač P pokazuje na X varijablu, tada se * P može koristiti gdje god se X može napisati.

Sljedeći izrazi su ekvivalentni:

int X = 10 int * P = & Y; Za gornji kod vrijede donji izrazi
Izraz Ekvivalentno izražavanje
Y = * P + 1 * P = * P + 10 * P + = 2 ++ * P (* P) ​​++ Y = X + 1 X = X + 10 X + = 2 ++ X X ++

U potonjem su slučaju potrebne zagrade: budući da se unarni operateri * i ++ procjenjuju zdesna nalijevo, bez zagrada povećao bi se pokazivač P, a ne objekt na koji usmjerava P.

Ispod tablice prikazana je aritmetička i osnovna operacija koja se može koristiti u radu s C pokazivačima

Operacija Obrazloženje
Zadatak int * P1, * P2 P1 = P2; P1 i P2 upućuju na istu cjelobrojnu varijablu
Inkrementacija i dekrementacija Int * P1; P1 ++; P1--;
Dodavanje odstupanja (konstantno) To omogućuje da pokazivač pomiče N elemenata u tablici. Pokazivač će se povećati ili smanjiti za N puta broj bajtova (vrsta) varijable. P1 + 5;

C Pokazivači i nizovi s primjerima

Tradicionalno elementima niza pristupamo pomoću njegovog indeksa, ali ovu metodu možemo eliminirati pomoću pokazivača. Pokazivači olakšavaju pristup svakom elementu niza.

#include int main(){int a[5]={1,2,3,4,5}; //array initializationint *p; //pointer declaration/*the ptr points to the first element of the array*/p=a; /*We can also type simply ptr==&a[0] */printf("Printing the array elements using pointer\n");for(int i=0;i<5;i++) //loop for traversing array elements{printf("\n%x",*p); //printing array elementsp++; //incrementing to the next element, you can also write p=p+1}return 0;}

Izlaz

12345

Dodavanjem određenog broja u pokazivač pomaknut će se mjesto pokazivača na vrijednost dobivenu operacijom zbrajanja. Pretpostavimo da je p pokazivač koji trenutno pokazuje na memorijsko mjesto 0 ako izvršimo slijedeću operaciju zbrajanja, p + 1, tada će se izvršiti na ovaj način:

Dodavanje / uvećanje pokazivača

Budući da p trenutno dodaje mjesto 0 nakon dodavanja 1, vrijednost će postati 1, a time će i pokazivač pokazati mjesto memorije 1.

C Pokazivači i žice s primjerima

Niz je niz objekata sa znakovima koji završavaju nulom znaka '\ 0'. Pomoću pokazivača možemo manipulirati žicama. Ovaj pokazivač u primjeru C objašnjava ovaj odjeljak

#include #include 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);printf("Printing all the characters in a string\n");p=str; //reset the pointerfor(int i=0;i

Izlaz

First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!

Drugi način rješavanja nizova je niz niza pokazivača kao u sljedećem programu:

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

Izlaz:

Please remember these materials:ironcoppergold

Prednosti pokazivača u C

  • Pokazivači su korisni za pristup memorijskim mjestima.
  • Pokazivači pružaju učinkovit način pristupa elementima strukture niza.
  • Pokazivači se koriste za dinamičko dodjeljivanje memorije, kao i za oslobađanje.
  • Pokazivači se koriste za oblikovanje složenih struktura podataka kao što su povezani popis, graf, stablo itd.

Mane pokazivača u C

  • Pokazivači su malo složeni za razumijevanje.
  • Pokazivači mogu dovesti do različitih pogrešaka, poput grešaka u segmentaciji, ili mogu pristupiti memorijskom mjestu koje uopće nije potrebno.
  • Ako se pokazivaču prikaže netočna vrijednost, to može uzrokovati oštećenje memorije.
  • Pokazivači su također odgovorni za curenje memorije.
  • Pokazivači su relativno sporiji od onih varijabli.
  • Programerima je vrlo teško raditi s pokazivačima; stoga je odgovornost programera pažljivo manipulirati pokazivačem.

Sažetak

  • Pokazivač nije ništa drugo do memorijsko mjesto na kojem se pohranjuju podaci.
  • Pokazivač se koristi za pristup memorijskom mjestu.
  • Postoje razne vrste pokazivača kao što su null pokazivač, divlji pokazivač, poništavač i druge vrste pokazivača.
  • Pokazivači se mogu koristiti s nizom i nizom za učinkovitiji pristup elementima.
  • Možemo stvoriti pokazivače na funkcije za dinamičko pozivanje funkcije.
  • Aritmetičke operacije mogu se izvoditi na pokazivaču koji je poznat pod nazivom aritmetika pokazivača.
  • Pokazivači također mogu usmjeriti na funkciju koja olakšavaju pozivanje različitih funkcija u slučaju definiranja niza pokazivača.
  • Kada želite obrađivati ​​različite vrste podataka s varijablama, možete upotrijebiti typecast void pokazivač.