Aritmetica indicatorilor
Această intrare sau secțiune despre programare nu citează sursele necesare sau cei prezenți sunt insuficienți . |
În limbajele de programare , expresia aritmetică a indicatorilor se referă la un set de operații aritmetice aplicabile valorilor de tip pointer . Aceste operațiuni au scopul de a permite un nivel ridicat de flexibilitate în accesarea colecțiilor de date omogene stocate în locații de memorie adiacente (de exemplu, matrice ). Aritmetica indicatorilor este tipică limbajului C și a fost menținută în unele limbaje derivate (este prezentă de exemplu în C ++, dar nu în Java ).
Aritmetica indicatorilor în limbajul C.
Aritmetica indicatorilor C se bazează pe trei operatori fundamentali, însoțiți de un număr de alți operatori a căror semantică este derivată de cea a operatorilor principali:
-
+
: operator binar pentru suma unui pointer și a unui număr întreg- derivat:
++
: unară auto - incrementare operator al unui indicator - derivată:
+=
: operator de atribuire cu sumă
- derivat:
-
-
: operator diferență binară între doi indicatori -
-
: operator binar pentru scăderea unui număr întreg dintr-un pointer- derivată:
--
: operator unar autodecrementant al unui pointer - derivată:
-=
: operator de atribuire cu diferență
- derivată:
Operator sumă a unui pointer și a unui număr întreg
Definiție
Suma operatorului pointer și întreg necesită un operand de tip pointer și un operand de tip întreg . Rezultatul sumei este adresa dată de indicatorul incrementat cu rezultatul înmulțirii întregului specificat cu sizeof
tipului de bază al indicatorului exprimat în octeți . De exemplu, dacă p
este un pointer către tipul întreg int
( int *p
) cu valoarea 1000 ( p=1000
) și dacă dimensiunea unui int
este de doi octeți, p+1
este 1002, p+2
este 1004, și în general p+n
este 1000 + n * 2.
Sens
Operația de adăugare între indicator și întreg este semnificativă în cazul în care indicatorul conține adresa unei celule dintr-o matrice de date de tipul de bază al indicatorului. De fapt, dacă p
(pointer to integer) conține adresa primei celule dintr-o matrice de numere întregi, p+1
produce adresa celei de-a doua celule, p+2
adresa celei de-a treia și așa mai departe. Aritmetica indicatorului introduce, prin urmare, o sintaxă alternativă la cea tradițională (bazată pe indexare) pentru accesarea elementelor unui tablou.
Operator de diferență între doi indicatori
Definiție
Operatorul diferenței pointer necesită doi operanzi ambii de tip pointer, având un tip de bază omogen (de exemplu, doi indicatori întregi, doi indicatori de caractere și așa mai departe). Rezultatul diferenței este diferența aritmetică dintre cele două adrese specificate de indicatori, împărțită la dimensiunea tipului de bază. De exemplu, dacă p
conține 1002 și q
conține 1000 și ambele sunt indicatori către int
, iar dimensiunea int
este 2, atunci qp
este 1.
Sens
Funcționarea diferenței dintre indicatori este semnificativă dacă cei doi operanzi conțin adresele a două celule diferite ale aceluiași tablou și dacă tipul de bază al matricei coincide cu cel al celor doi indicatori. În acest caz, de fapt, diferența dintre cele două indicatoare corespunde numărului de celule din matrice care separă celula indicată de indicatorul de valoare mai mică de cel al indicatorului de valoare mai mare.
Operator de scădere a unui întreg dintr-un pointer
Definiție
Operația de scădere a unui întreg dintr-un pointer are un operand stâng de tip pointer și un operand drept de tip întreg. Rezultatul (similar cu cazul sumei) este valoarea indicatorului scăzută cu rezultatul înmulțirii întregului cu mărimea tipului de bază al indicatorului. De exemplu, dacă p
este un pointer către int
cu o valoare de 1000, iar dimensiunea unui int
este 2, p-1
este 998.
Sens
În aceleași condiții descrise mai sus pentru adunare, operația de scădere a unui număr întreg dintr-un pointer permite obținerea adresei unei celule dintr-o matrice care o precedă pe cea indicată de pointerul pe care se aplică scăderea.
Operator autoincrementat și autodecrementat al unui pointer
În limbajul C, operațiile de autoincrementare și autodecrementare ale unui pointer , cum ar fi cele ale numărurilor întregi de autoincrementare și auto-decrementare, reprezintă o formă particulară de adunare și scădere. Acestea sunt definite de următorul efect:
-
x++
creștex
cu 1 și produce valoarea luix
înainte de increment -
++x
creștex
cu 1 și produce valoareax
după increment -
x--
decrementsx
cu 1 și produce valoareax
înaintea decrementare -
--x
scadex
cu 1 și produce valoarea luix
după scădere
Menținând ferm aceste definiții, semnificația acestor operatori în cazul în care operandul lor este un pointer se obține din definiția adunării pointerului și întregului și a scăderii unui întreg dintr-un pointer.
Alți operatori
Regulile descrise mai sus se aplică, de asemenea, în C altor doi operatori, definiți în termenii operatorilor +
și -
:
-
p+=n
corespundep=p+n
-
p-=n
corespundep=pn
Notă privind supraîncărcarea
Toți operatorii descriși mai sus au, în C și în limbi derivate, o semnificație chiar dacă operanzii sunt date numerice care nu sunt de tip pointer. Faptul că același simbol capătă semnificații (ușor) diferite în funcție de tipul operanzilor săi poate fi considerat un caz de supraîncărcare a operatorului .