Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Informatica


Index » educatie » Informatica
» POINTERI SI TABLOURI. POINTERI SI SIRURI DE CARACTERE.


POINTERI SI TABLOURI. POINTERI SI SIRURI DE CARACTERE.


REFERAT DE LABORATOR

Tema laboratorului POINTERI

Pointerii sunt variabile care au ca valori adresele altor variabile (obiecte). Din punctul de vedere al continutului zonei de memorie adresate, se disting urmatoarele categorii de pointeri:

q      pointeri de date (obiecte) - contin adresa unei variabile din memorie;



q      pointeri generici (numiti si pointeri void) - contin adresa unui obiect oarecare, de tip neprecizat;

q      pointeri de functii (vor fi prezentati ulterior)- contin adresa codului executabil al unei functii.

Exemplu:

int x, y, ptr;

// ptr- variabila pointer catre un int; x,y-variabile predefinite, simple, de tip int

x=5; cout<<"Adresa variabilei x este:"<<&x<<'n';

cout<<"Valoarea lui x:"<<x<<'n';

ptr=&x;    // atribuire: variabila ptr contine adresa variabilei x

cout<<"Variabila pointer ptr are valoarea:"<<ptr;

cout<<" si adreseaza obiectul:"<< ptr<<'n';

y=ptr; cout<<"y="<<y<<'n'; // y=5

x=4; cout<<"x="<<x<<'n'; cout<<"ptr="<<ptr<<'n';

// x si ptr reprezinta acelasi obiect, un intreg cu valoarea 4

x=70; // echivalenta cu ptr=70;

y=x+10; // echivalenta cu y=ptr+10

Variabilele pointer, alaturi de operatorii de referentiere si de deferentiere, pot apare in expresii.

Exemple:

int x, y, q; q=&x;

q=8; // echivalenta cu x=8;

q=&5;    // invalida - constantele nu au adresa

x=9; // invalida - x nu este variabila pointer

x=&y; //invalida: x nu este variabila pointer, deci nu poate fi folosita cu operatorul de indirectare

y=q + 3; // echivalenta cu y=x+3;

q = 0; // seteaza x pe 0

q += 1; // echivalenta cu (q)++ sau cu x++

int r; r = q;

/* copiaza continutul lui q (adresa lui x) in r, deci r va pointa tot catre x (va contine tot adresa lui x)*/

double w, r = &w, r1, r2; r1= &w; r2=r1;

cout<<"r1="<<r1<<'n';    //afiseaza valoarea pointerului r1 (adresa lui w)

cout<<"&r1="<<&r1<<'n'; // afiseaza adresa variabilei r1

cout<<"r1= "<<r1<<'n';

double z=r1; // echivalenta cu z=w

cout<<"z="<<z<<'n';

Exemplu:

void v1, v2; int a, b, q1, q2;

q1 = &a; q2 = q1; v1 = q1;

q2 = v1; // eroare: unui pointer cu tip nu i se poate atribui un pointer generic

q2 = (int ) v1; double s, ps = &s;

int c, l; void sv;

l = (int ) sv; ps = (double ) sv;

(char ) sv = 'a'; /*Interpretare: adresa la care se gaseste valoarea lui sv este interpretata ca fiind adresa zonei de memorie care contine o data de tip char. */

Exemplu:

int a, pa, pb;

cout<<"&a="<<&a<<'n'; pa=&a; cout<<"pa="<<pa<<'n';

cout<<"pa+2"<<pa+2<<'n'; pb=pa++; cout<<"pb="<<pb<<'n';

int i=pa-pb; cout<<"i="<<i<<'n';

POINTERI SI TABLOURI. POINTERI SI SIRURI DE CARACTERE.

Exemplu:

int a[10], ptr; // a este definit ca &a[0]; a este pointer constant

a = a + 1; // ilegal

ptr = a ; // legal: ptr are aceeasi valoare ca si a, respectiv adresa elementului a[0]

// ptr este variabila pointer, a este constanta pointer.

int x = a[0]; // echivalent cu x = ptr; se atribuie lui x valoarea lui a[0]

Deoarece numele tabloului a este sinonim pentru adresa elementului de indice zero din tablou, asignarea ptr=&a[0] poate fi inlocuita, ca in exemplul anterior, cu ptr=a

Exemplu:

char sir[10]; char psir;

sir = "hello"; // ilegal

psir = "hello"; // legal

Operatia de indexare a elementelor unui tablou poate fi realizata cu ajutorul variabilelor pointer.

Exemplu:

int a[10], ptr; // a este pointer constant; ptr este variabila pointer

ptr = a; // ptr este adresa lui a[0]

ptr+i inseamna ptr+(isizeof(int)), deci: ptr + i & a[i]

Deoarece numele unui tablou este un pointer (constant), putem concluziona:

a+i & a[i]

a[i]

(a+i)

Exercitiu Sa se scrie urmatorul program (care ilustreaza legatura dintre pointeri si vectori) si sa se urmareasca rezultatele executiei acestuia.

#include <iostream.h>

void main(void)

; int pi1 = a ;

int pi2 = &a[0]; int pi3;

cout<<"a="<<a<<"&a="<<&a<<"a="<<a<<'n';

cout<<"a+1="<<(a+1)<< " &a[1]="<< &a[1]<<'n';

cout<<"a[1]="<<a[1]<< " (a+1)="<< (a+1)<<'n';

cout<<"pi1="<<pi1<<"pi2="<<pi2<<'n'; int x=pi1;

x primeste valoarea locatiei a carei adresa se afla in variabila pointer pi1, deci valoarea lui a[0] */

cout<<"x="<<x<<'n'; x=pi1++; // echivalent cu (pi1++) x=1

cout<<"x="<<x<<'n'; x=(pi1)++;

/* x=0: intai atribuirea, apoi incrementarea valorii spre care pointeaza pi1. In urma incrementarii, valoarea lui a[0] devine 1 */

cout<<"x="<<x<<'n'; cout<<pi1<<'n';x=++pi1; //echivalent cu (++pi1)

cout<<"x="<<x<<'n'; x=++(pi1); cout<<"x="<<x<<'n'; pi1=a;

pi3=pi1+3;

cout<<"pi1="<<pi1<<"pi1="<<pi1<<"&pi1="<<&pi1<<'n';

cout<<"pi3="<<pi3<<"pi3="<<pi3<<"&pi3="<<&pi3<<'n';

cout<<"pi3-pi1="<<(pi3-pi1)<<'n'; //pi3-pi1=3

Exercitiu Sa se scrie urmatorul program (legatura pointeri-siruri de caractere) si sa se urmareasca rezultatele executiei acestuia.

#include <iostream.h>

void main(void)

Exercitiu: Sa se scrie un program care citeste elementele unui vector de intregi, cu maxim 20 elemente si inlocuieste elementul maxim din vector cu o valoare introdusa de la tastatura. Se va folosi aritmetica pointerilor.

#include <iostream.h>

void main()

// citirea elementelor vectorului

max=a; indice=0;

for (i=0; i<n; i++)

if (max<=(a+i))

// aflarea valorii elementului maxim din vector si a pozitiei acestuia

int val;

cout<<"Valoare de inlocuire:"; cin >> val;

(a+indice)=val;

// citirea valorii cu care se va inlocui elementul maxim

for (i=0; i<n; i++)

cout<<(a+i);<<'t';

cout<<'n';

// afisarea noului vector

/* in acest mod de implementare, in situatia in care in vector exista mai multe elemente a caror valoare este egala cu valoarea elementului maxim, va fi inlocuit doar ultimul dintre acestea (cel de indice maxim).*/

Exercitiu Sa se testeze programul urmator, urmarind cu atentie rezultatele obtinute.

#include <iostream.h>

#include <conio.h>

void main()

clrscr();

cout<<'a='<<a<<' &a='<<&a<<' &a[0]='<<&a[0]<<'n';

cout<<'Pointeri catre vectorii liniin';

for (int i=0; i<3; i++)

// afisarea matricii

for (i=0; i<3; i++)

PROBLEME PROPUSE:

Analizati urmatoarele secvente de instructiuni. Identificati secventele incorecte (acolo unde este cazul) si sursele erorilor:

q      int a,b,*c; a=7; b=90; c=a;

q      double y, z, *x=&z;    z=&y;

q      char x, **p, *q; x = 'A'; q = &x; p = &q; cout<<"x="<<x<<'n';

cout<<"**p="<<**p<<'n'; cout<<"*q="<<*q<<'n';

cout<<"p="<<p<<" q="<<q<<"*p="<<*p<<'n';

q      char *p, x[3] = ; int i, *q, y[3] = ;

p = &x[0];

for (i = 0; i < 3; i++)

q = &y[0];

for (i = 0; i < 3; i++)

q      const char *sirul="sa programam"; *(sirul)++;

q      double a, *s; s=&(a+89); cout<<"s="s<<'n';

q      double a1, *a2, *a3; a2=&a1; a2+=7.8; a3=a2; a3++;

q      int m[10], *p;p=m;

for (int i=0; i<10; i++)

cout<<*m++;

q      void *p1; int *p2; int x; p2=&x; p2=p1;

q      char c='A'; char *cc=&c; cout<<(*cc)++<<'n';

Reimplementati problemele din capitolul 'Tablouri', folosind aritmetica pointerilor.





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate