CATEGORII DOCUMENTE |
Pointeri la structuri
Limbajul C recunoaste pointerii la structuri in acelasi mod in care se recunoaste pointerii la orice alt tip de variabila.
Declararea unui pointer la structura se face plasand operatorul * in fata numelui unei variabile structura. De exemplu, pentru structura addr definita mai inainte, urmatoarea instructiune declara pe addr_pointer ca pointer la o data de acest tip :
struct addr *addr_pointer;
O utilizare importanta a pointerilor la structura consta in realizarea apelului prin adresa intr-o functie.
Cand unei functii i se transmite ca argument un pointer la o structura, calculatorul va salva si va reface din stiva numai adresa structurii, conducand astfel la cresterea vitezei de executare a programului.
Pentru a gasi adresa unei variabile structura, se plaseaza operatorul & inaintea numelui variabilei structura. De exemplu, dandu-se urmatorul fragment :
struct balanta person;
struct balanta *p;
/* se declara un pointer la structura */
atunci:
p = &person;
plaseaza adresa lui person in pointerul p. Pentru a referi elementul balance, se va scrie:
(*p).balance
Deoarece operatorul punct are prioritate mai mare decat operatorul *, pentru o referire corecta a elementelor unei structuri utilizand pointerii sunt necesare paranteze.
Actualmente, pentru referirea unui element al unei variabile structura dandu-se un pointer la acea variabila, exista doua metode: Prima metoda utilizeaza referirea explicita a pointerului nume-structura si este considerata o metoda invechita (obsolete), iar a doua metoda, moderna, utilizeaza operatorul sageata -> (minus urmat de mai mare).
Exemplu: Pentru a vedea cum se utilizeaza un pointer-struct, examinam urmatorul program care afiseaza ora, minutul si secunda utilizand un timer software.
# include <stdio.h>
void actualizeaza();
void afiseaza(), delay();
struct tm ;
void main()
void actualizeaza(t)
/*Versiunea 1- referirea explicita prin pointeri */
struct tm *t;
if ((*t).minute == 60)
if ((*t).ore == 24) (*t).ore = 0;
delay();}
void afiseaza(t) // Se defineste functia afiseaza()
struct tm *t;
void delay() /* Se defineste functia delay() */
Pentru ajustarea duratei intarzierii se poate modifica valoarea contorului t al buclei.
Se vede ca programul defineste o structura globala numita tm, dar nu declara variabilele. In interiorul functiei main() se declara structura 'time' si se initializeaza cu 00:00:00. Programul transmite adresa lui time functiilor actualizeaza() si afiseaza(). In ambele functii, argumentul acestora este declarat a fi un pointer-structura de tip 'tm'. Referirea fiecarui element se face prin intermediul acestui pointer. Elementele unei structuri pot fi referite utilizand in locul operatorului '.', operatorul '->'. De exemplu :
(*t).ore
este echivalent cu
t -> ore
Atunci programul de mai sus se poate rescrie sub forma:
# include <stdio.h>
void actualizeaza();
void afiseaza(), delay();
struct tm ;
void main()
void actualizeaza(t)
/*Versiunea 1- referirea explicita prin pointeri */
struct tm *t;
if (t->minute == 60)
if (t->ore == 24) t->ore = 0;
delay();}
void afiseaza(t) // Se defineste functia afiseaza()
struct tm *t;
void delay() /* Se defineste functia delay() */
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2097
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved