Ce este Pointer în C?
Pointerul în C este o variabilă care stochează adresa unei alte variabile. Un pointer poate fi, de asemenea, utilizat pentru a se referi la o altă funcție de pointer. Un indicator poate fi incrementat / decrementat, adică pentru a indica către locația de memorie următoare / anterioară. Scopul indicatorului este de a economisi spațiu de memorie și de a obține un timp de execuție mai rapid.
Cum se utilizează indicatoarele în C
Dacă declarăm o variabilă v de tip int, v va stoca de fapt o valoare.
v este egal cu zero acum.
Cu toate acestea, fiecare variabilă, în afară de valoare, are și adresa sa (sau, pur și simplu, unde se află în memorie). Adresa poate fi recuperată prin plasarea unui semn cu semn (&) înaintea numelui variabilei.
Dacă imprimați adresa unei variabile pe ecran, aceasta va arăta ca un număr total aleatoriu (în plus, poate fi diferit de la rulare la rulare).
Să încercăm acest lucru în practică cu pointerul în C exemplu
Rezultatul acestui program este -480613588.
Acum, ce este un pointer? În loc să stocheze o valoare, un pointer va stoca adresa unei variabile.
Pointer Variable
Int * y = & v;
VARIABILĂ |
POINTER |
O valoare stocată într-o adresă de stocare / memorie numită |
O variabilă care indică adresa de stocare / memorie a altei variabile |
Declararea unui pointer
La fel ca variabilele, pointeri în programe C mming trebuie să fie declarate înainte de a putea fi utilizate în programul dvs. Pointerii pot fi numiți orice doriți, atâta timp cât respectă regulile de numire ale lui C. O declarație de pointer are următoarea formă.
data_type * pointer_variable_name;
Aici,
- data_type este tipul de bază al indicatorului pentru tipul de variabilă C și indică tipul variabilei către care indică indicatorul.
- Asteriscul (*: același asterisc utilizat pentru multiplicare) care este operator de indirecție, declară un pointer.
Să vedem câteva declarații de pointer valide în acest tutorial de indicatori C:
Inițializați un pointer
După declararea unui pointer, îl inițializăm ca variabile standard cu o adresă variabilă. Dacă indicii în programarea C nu sunt inițializați și folosiți în program, rezultatele sunt imprevizibile și potențial dezastruoase.
Pentru a obține adresa unei variabile, folosim operatorul ampersand (&), plasat înaintea numelui unei variabile a cărei adresă avem nevoie. Inițializarea indicatorului se face cu următoarea sintaxă.
Sintaxa indicatorului
pointer = &variable;
Un program simplu pentru ilustrarea indicatorului este dat mai jos:
Ieșire:
Address stored in a variable p is:60ff08Value stored in a variable p is:10
Operator | Înțeles |
* | servește 2 scopuri
|
& | Servește doar pentru un scop
|
Tipuri de indicatori în C
Următoarele sunt diferitele tipuri de indicatoare în C:
Pointer nul
Putem crea un pointer nul atribuind valoare nulă în timpul declarației indicatorului. Această metodă este utilă atunci când nu aveți nicio adresă atribuită indicatorului. Un indicator nul conține întotdeauna valoarea 0.
Următorul program ilustrează utilizarea unui indicator nul:
#include <stdio.h>int main(){int *p = NULL; //null pointerprintf("The value inside variable p is:\n%x”,p);return 0;}
Ieșire:
The value inside variable p is:0
Pointer Void
În programarea C, un pointer gol este, de asemenea, numit ca un pointer generic. Nu are niciun tip de date standard. Un pointer gol este creat utilizând cuvântul cheie gol. Poate fi folosit pentru a stoca o adresă a oricărei variabile.
Programul următor ilustrează utilizarea unui pointer gol:
#include <stdio.h>int main(){void *p = NULL; //void pointerprintf("The size of pointer is:%d\n",sizeof(p));return 0;}
Ieșire:
The size of pointer is:4
Pointer sălbatic
Se spune că un pointer este un pointer sălbatic dacă nu este inițializat la nimic. Aceste tipuri de indicatoare C nu sunt eficiente, deoarece pot indica o locație de memorie necunoscută, care poate provoca probleme în programul nostru și poate duce la blocarea programului. Ar trebui să fii întotdeauna atent în timp ce lucrezi cu indicatori sălbatici.
Programul următor ilustrează utilizarea pointerului sălbatic:
#include <stdio.h>int main(){int *p; //wild pointerprintf("\n%d",*p);return 0;}
Ieșire
timeout: the monitored command dumped coresh: line 1: 95298 Segmentation fault timeout 10s main
Alte tipuri de pointeri în „c” sunt după cum urmează:
- Pointer suspendat
- Pointer complex
- Pointer apropiat
- Pointer îndepărtat
- Pointer imens
Pointeri de acces direct și indirect
În C, există două moduri echivalente pentru a accesa și manipula un conținut variabil
- Acces direct: folosim direct numele variabilei
- Acces indirect: folosim un pointer către variabila
Să „înțelegem acest lucru cu ajutorul programului de mai jos
După compilarea programului fără erori, rezultatul este:
Direct access, var = 1Indirect access, var = 1The address of var = 4202496The address of var = 4202496Indirect access, var = 48
Aritmetica indicatorului în C
Operațiile indicatorului sunt rezumate în figura următoare
Operație prioritară (prioritate)
Atunci când lucrăm cu pointeri C, trebuie să respectăm următoarele reguli de prioritate:
Dacă un indicator P indică o variabilă X, atunci * P poate fi folosit oriunde se poate scrie X.
Următoarele expresii sunt echivalente:
În acest din urmă caz, sunt necesare paranteze: deoarece operatorii unari * și ++ sunt evaluați de la dreapta la stânga, fără paranteze indicatorul P ar fi incrementat, nu obiectul pe care indică P.
Tabelul de mai jos prezintă operația aritmetică și de bază care poate fi utilizată atunci când se tratează indicii C
Operațiune | Explicație |
Atribuire | int * P1, * P2 P1 = P2; P1 și P2 indică aceeași variabilă întreagă |
Incrementare și decrementare | Int * P1; P1 ++; P1–; |
Adăugarea unui offset (constant) | Aceasta permite indicatorului să deplaseze N elemente într-un tabel. Pointerul va fi mărit sau micșorat de N ori numărul de octeți de tipul variabilei. P1 + 5; |
C Pointer & Matrice cu exemple
În mod tradițional, noi accesați elementele matricei folosind indexul său, dar această metodă poate fi eliminată folosind pointeri. Pointerii facilitează accesul la fiecare element de matrice.
Ieșire
12345
Adăugarea unui anumit număr la un pointer va muta locația indicatorului la valoarea obținută printr-o operație de adăugare. Să presupunem că p este un indicator care indică în prezent locația memoriei 0 dacă efectuăm următoarea operație de adăugare, p + 1, atunci se va executa în acest mod:
Deoarece p indică în prezent locația 0 după adăugarea 1, valoarea va deveni 1 și, prin urmare, indicatorul va indica poziția de memorie 1.
C Pointeri și șiruri cu exemple
Un șir este o matrice de obiecte char, care se termină cu un caracter nul „\ 0”. Putem manipula șirurile folosind pointeri. Acest indicator din exemplul C explică această secțiune
Ieșire
First character is:HNext character is:ePrinting all the characters in a stringHelloGuru99!
Un alt mod de a trata șirurile este cu o matrice de indicatori, cum ar fi în cele ce urmează program:
Ieșire:
Please remember these materials:ironcoppergold
Avantajele pointerelor în C
- Pointerele sunt utile pentru accesarea locații de memorie.
- Pointerele oferă un mod eficient de accesare a elementelor unei structuri matrice.
- Pointerele sunt utilizate pentru alocarea dinamică a memoriei, precum și pentru alocare.
- Indicatoarele sunt folosite pentru a forma structuri de date complexe, cum ar fi lista legată, graficul, arborele etc.
Dezavantajele indicatoarelor în C
- Indicatoarele sunt puțin complexe pentru a înțelege.
- Pointerii pot duce la diverse erori, cum ar fi erori de segmentare sau pot accesa o locație de memorie care nu este deloc necesară.
- Dacă un indicator este furnizat unei valori incorecte, poate provoca corupția memoriei.
- Pointerii sunt, de asemenea, responsabili pentru scurgerile de memorie.
- Pointerele sunt relativ mai lente decât cele ale variabilelor.
- Programatorilor le este foarte greu să lucreze cu pointerele; prin urmare, este responsabilitatea programatorului să manipuleze cu atenție un indicator.
Rezumat
- Un indicator nu este altceva decât o locație de memorie în care sunt stocate datele.
- Un pointer este utilizat pentru a accesa locația memoriei.
- Există diferite tipuri de pointeri, cum ar fi un pointer nul, un pointer sălbatic, un pointer gol și alte tipuri de pointeri.
- Pointerii pot fi folosiți cu matrice și șiruri pentru a accesa elementele mai eficient.
- Putem crea pointeri de funcții pentru a invoca o funcție dinamic.
- Operațiile aritmetice pot fi efectuate pe un pointer care este cunoscut sub numele de pointer aritmetic.
- Pointerii pot indica, de asemenea, spre funcție, ceea ce face ușor să apelați diferite funcții în cazul definirii unei matrice de pointeri.
- Când doriți să tratați diferite tipuri de date variabile, puteți utilizați un pointer gol tipografiat.