Tuesday, November 14, 2017

Lucru cu variabile pointer

Istoria informaticii românești ar comite o mare greșeală dacră ar consemna faptul că variabilele pointer au venit în programare să zicem cu limbajul PASCAL sau cu limbajul C. S-a lucrat cu variabile pointer masiv în limbajele de asamblare, căci mai toate limbajele de asamblare au avut modul de adresare indirectă și posibilitatea de a încărca în diferite zone de memorie deplasări ale variabilelor, așa-zisele adrese chiar la definirea de variabile. Ceea ce se numește acum aritmetica pointerilor, exista și în programarea în limbaje de asamblare, numai că programatorii erau obligați să respecte regulile pentru a face referiri corecte de variabile, știută fiind obligativitatea ca adresele operanzilor să fie niște numere divizibile prin niște constante, funcție de tipul operației care se executa, căci una este să lucrezi cu operanzi pe 2 baiți, alta este ca operandul să fie definit pe 4 baiți și tot așa.
Definirea și referirea variabilelor pointer elementare se realizează prin instrucțiunile de forma:
tip_variabilă_elementară  *nume_variabilă_pointer, nume variabilă_elementară;
........................
nume_variabilă_pointer=&nume variabilă_elementară;
......................................
*nume_variabilă_pointer=valoare;
...............................
Exemplu:
#include <stdio.h>

void main()
{
    int *pa, *pb, *pc, *pe, a=5, b=7, c=12, e;
    pa=&a;
    pb=&b;
    pc=&c;
    pe=&e;
   *pe=*pa+*pb+*pc;
    printf("e = %d",*pe);
}
Programatorul are la dispoziție posibilitatea de a defini variabile pointer și de a le inițializa la definire prin construcții de forma:
int a=5, b=7, c=12, e, *pa=&a, *pb=&b, *pc=&c, *pe=&e ;
Dacă nu s-ar lucra cu variabile pointeri exemplud de mai sus ar arăta astfel:
void main()
{
    int  a=5, b=7, c-12, e;
    e=a+b+c;
   printf("e = %d",e);
}
ceea ce este cu mult mai simplu. Numai că rolul variabilelor pointer este să permită evaluarea unei aceleiași expresii cu alți operanzi și scrierea să fie în forme cu mult mai concentrate.
void main()
{
    int *pa, *pb, *pc, *pe, a=5, b=7, c=12, e;
    int *px, *py, *pz, *pw, x=5, y=7, z=12, w;
    pa=&a; px=&x;
    pb=&b; py=&y;
    pc=&c; px=&z;
    pe=&e;pw=&w;
   *pe=*pa+*pb+*pc;
   *pw=*px+*py+*pz;
    printf("e = %d",*pe);
    printf("w = %d",*pw);
}
Cei ce au venit din programarea în limbaj de asamblare au înțeles marile avantaje oferite de variabilele pointer mai ales atunci când lucrează cu proceduri și trebuie să returneze nu o singură valoare. Ei concentrează acea mulțime de rezultate ce trebuie returnate într-o variabilă agregată și procedura returnează un rezultat care este de fapt o variabilă pointer. Deci inseamnă că funcția returnează un ponter spre un vector sau spre o matrice sau returnează un pointer spre o variabilă de tip struct.
Funcția care inițializează un vector cu date de la tastatură este:
int *initvector (int n).
{
int v[100], i;
for(i=0; i<n; i++)
   {
    printf("componenta  v[ %d] ",i);
    scanf("%d ",&v[i]);
    }
    return (v);
}
O funcție care returnează și valoarea lui n dar și vectorul va impune definirea unei variavile de structură:
struct alfa {
                 int n;
                 int v[100];
                 }, *palfa;
Pentru a simplifica lucrurile cu typedef se definește un tip beta de dată struct și apoi se face fix orice cu el, inclusiv se impune ca funcția să returneze un pointer spre o variabilă pointer de acel tip structurat.
* beta initvector()
          {
           beta *prezult;
           ............
           return (rezult);
           }

(15 noiembrie 2017)

No comments:

Post a Comment