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

Što je pokazivač u C-u?

The Pokazivač u C, je varijabla koja pohranjuje adresu druge varijable. Pokazivač se također može koristiti za upućivanje na drugu funkciju pokazivača. Pokazivač se može povećati/smanjiti, tj. pokazivati ​​na sljedeću/prethodnu memorijsku lokaciju. Svrha pokazivača je uštedjeti memorijski prostor i postići brže vrijeme izvršenja.

Kako koristiti pokazivače u C

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

Kako koristiti pokazivače u C

v je sada jednak nuli.

No, svaka varijabla, osim vrijednosti, ima i svoju adresu (ili, jednostavno rečeno, gdje se nalazi u memoriji). Adresa se može dohvatiti stavljanjem znaka & (&) ispred naziva varijable.

Kako koristiti pokazivače u C

Ispišete li adresu varijable na ekranu, ona će izgledati kao potpuno slučajan broj (štoviše, može se razlikovati od runde do runde).

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

Kako koristiti pokazivače u C

Izlaz ovog programa je -480613588.

Sada, što je pokazivač? Umjesto pohranjivanja vrijednosti, pokazivač će pohraniti adresu varijable.


Varijabla pokazivača

Int *y = &v;

PROMJENJIVOM POKAZIVAČ
A vrijednost pohranjeno u pod nazivom adresa za pohranu/memoriju A varijabla tu pokazuje na adresa pohrane/memorije drugi varijabla

Deklariranje pokazivača

Poput varijabli, pokazivači u C programiranje moraju biti deklarirani prije nego što se mogu koristiti u vašem programu. Pokazivači se mogu imenovati kako god želite sve dok poštuju C-ova pravila imenovanja. Deklaracija pokazivača ima sljedeći oblik.

data_type * pointer_variable_name;

Ovdje,

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

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

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

Inicijalizirati pokazivač

Nakon deklaracije pokazivača, inicijaliziramo ga kao standardne varijable s adresom varijable. Ako se pokazivači u C programiranju neinicijaliziraju i koriste u programu, rezultati mogu biti nepredvidivi i potencijalno katastrofalni.

Da bismo dobili adresu varijable, koristimo operator (&) ispred imena varijable čiju adresu trebamo. Inicijalizacija pokazivača vrši se sljedećom sintaksom.

Sintaksa pokazivača

 pointer = &variable;

Dolje je dan jednostavan program za ilustraciju pokazivača:

#include <stdio.h>
int main()
{
   int a=10;    //variable declaration
   int *p;      //pointer variable declaration
   p=&a;        //store address of variable a in pointer p
   printf("Address stored in a variable p is:%x\n",p);  //accessing the address
   printf("Value stored in a variable p is:%d\n",*p);   //accessing the value
   return 0;
}

Izlaz:

Address stored in a variable p is:60ff08
Value stored in a variable p is:10
Operahumka Značenje
* Služi u 2 svrhe

  1. Deklaracija pokazivača
  2. Vraća vrijednost referencirane varijable
& Služi samo za 1 svrhu

  • Vraća adresu varijable

Vrste pokazivača u C-u

Slijede različiti Vrste pokazivača u C-u:

Nulti pokazivač

Možemo stvoriti nulti pokazivač dodjeljivanjem nulte vrijednosti tijekom deklaracije pokazivača. Ova metoda je korisna kada nemate nijednu adresu dodijeljenu pokazivaču. Nulti pokazivač uvijek sadrži vrijednost 0.

Sljedeći program ilustrira korištenje nultog pokazivača:

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

Izlaz:

The value inside variable p is:
0

Pokazivač praznine

In C programiranje, void pokazivač se također naziva i generički pokazivač. Nema standardnu ​​vrstu podataka. Pokazivač void kreira se korištenjem ključne riječi void. Može se koristiti za pohranu adrese bilo koje varijable.

Sljedeći program ilustrira korištenje void pokazivača:

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

Izlaz:

The size of pointer is:4

Divlji ptičar

Za pokazivač se kaže da je divlji pokazivač ako nije inicijaliziran ni na što. Ove vrste C pokazivača nisu učinkovite jer mogu upućivati ​​na neku nepoznatu memorijsku lokaciju što može uzrokovati probleme u našem programu i može dovesti do pada programa. Uvijek treba biti oprezan pri radu s divljim ptičarima.

Sljedeći program ilustrira upotrebu divljeg pokazivača:

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

Izlaz:

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

Ostale vrste pokazivača u 'c' su sljedeće:

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

Izravni i neizravni pristupni pokazivači

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

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

Shvatimo ovo uz pomoć donjeg programa

#include <stdio.h>
/* 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 prevođenja programa bez grešaka, rezultat je:

Direct access, var = 1
Indirect access, var = 1

The address of var = 4202496
The address of var = 4202496

Indirect access, var = 48

Aritmetika pokazivača u C-u

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

Aritmetika pokazivača u C-u
Pokazivač Operama

Prioritetna operacija (prioritet)

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

  • Operatori * i & imaju isti prioritet kao i unarni operatori (negacija!, inkrementacija++, dekrement–).
  • U istom izrazu, unarni operatori *, &,!, ++, – procjenjuju se s desna na lijevo.

Ako P pokazivač 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;
For the above code, below expressions are true
Izraz Ekvivalentni izraz
Y=*P+1

*P=*P+10

*P+=2

+++P

(*P)++

Y=X+1

X=X+10

X+=2

++X

X++

U potonjem slučaju potrebne su zagrade: kako se unarni operatori * i ++ vrednuju s desna na lijevo, bez zagrada bi se povećao pokazivač P, a ne objekt na koji P pokazuje.

Donja tablica prikazuje aritmetičke i osnovne operacije koje se mogu koristiti pri radu s C pokazivačima

OperaANJE Objašnjenje
Raspored int *P1,*P2
P1=P2;
P1 i P2 pokazuju na istu cjelobrojnu varijablu
Inkrementacija i dekrementacija Int *P1;
P1++;P1– ;
Dodavanje pomaka (konstanta) To omogućuje pokazivaču da pomakne N elemenata u tablici.
Pokazivač će se povećati ili smanjiti za N puta broj bajtova tipa varijable.
P1+5;

C pokazivači i nizovi s primjerima

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

#include <stdio.h>
int main()
{
    int a[5]={1,2,3,4,5};   //array initialization
    int *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 elements
        	p++;    //incrementing to the next element, you can also write p=p+1
    }
    return 0;
}

Izlaz:

1
2
3
4
5

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

C pokazivači i nizovi

Dodavanje/povećanje pokazivača

Budući da p trenutno pokazuje na lokaciju 0 nakon dodavanja 1, vrijednost će postati 1, pa će stoga pokazivač pokazivati ​​na memorijsku lokaciju 1.

C pokazivači i nizovi s primjerima

Niz je niz char objekata koji završava nultim znakom '\ 0'. Možemo manipulirati nizovima pomoću pokazivača. Ovaj pokazivač u C primjeru objašnjava ovaj odjeljak

#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);
printf("Printing all the characters in a string\n");
p=str;  //reset the pointer
for(int i=0;i<strlen(str);i++)
{
printf("%c\n",*p);
p++;
}
return 0;
}

Izlaz:

First character is:H
Next character is:e
Printing all the characters in a string
H
e
l
l
o

G
u
r
u
9
9
!

Drugi način za rukovanje nizovima je s nizom pokazivača kao u sljedećem programu:

#include <stdio.h>
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:
iron
copper
gold

Prednosti pokazivača u C-u

  • Pokazivači su korisni za pristup memorijskim lokacijama.
  • Pokazivači pružaju učinkovit način za pristup elementima strukture polja.
  • Pokazivači se koriste za dinamičku dodjelu memorije kao i za dealokaciju.
  • Pokazivači se koriste za formiranje složenih struktura podataka kao što su povezani popisi, grafikoni, stabla itd.

Nedostaci pokazivača u C-u

  • Pokazivači su malo složeni za razumijevanje.
  • Pokazivači mogu dovesti do različitih pogrešaka kao što su pogreške u segmentaciji ili mogu pristupiti memorijskoj lokaciji koja uopće nije potrebna.
  • Ako se pokazivaču pruži 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 pokazivača varijabli.
  • Programerima je vrlo teško raditi s pokazivačima; stoga je odgovornost programera pažljivo manipulirati pokazivačem.

Rezime

  • Pokazivač nije ništa drugo nego memorijsko mjesto gdje se pohranjuju podaci.
  • Za pristup memorijskoj lokaciji koristi se pokazivač.
  • Postoje različite vrste pokazivača kao što su nulti pokazivač, divlji pokazivač, void pokazivač i druge vrste pokazivača.
  • Pokazivači se mogu koristiti s nizom i nizom za učinkovitiji pristup elementima.
  • Možemo stvoriti pokazivače funkcija za dinamički poziv funkcije.
  • Aritmetičke operacije se mogu izvoditi na pokazivaču što je poznato kao aritmetika pokazivača.
  • Pokazivači također mogu pokazivati ​​na funkciju što olakšava pozivanje različitih funkcija u slučaju definiranja niza pokazivača.
  • Kada želite raditi s različitim varijabilnim tipovima podataka, možete upotrijebiti void pointer za prikazivanje tipa.