Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

POINTERI SI TABLOURI

calculatoare



+ Font mai mare | - Font mai mic



POINTERI SI TABLOURI



In limbajele C/C++ exista o stransa legatura intre pointeri si tablouri, deoarece numele unui
tablou este un pointer (constant!) si are ca intotdeauna, ca valoare, adresa primului element
din tablou. Diferenta dintre pointerul - nume al unui tablou si o variabila pointer "obisnuita este aceea ca unei variabile de tip pointer i se pot atribui valori la executie, lucru imposibil
pentru numele unui tablou (acesta are tot timpul, ca valoare, adresa primului s
au element). De
aceea, se spune ca numele unui tablou este un pointer constant (valoarea lui nu poate fi
schimbat
a Numele unui tablou este considerat ca fiind un rvalue (right value-valoare

dreapta), deci nu poate apare decat in partea dreapta a unei expresii de atribuire. Numele unui pointer (in exemplul urmator, ptr) este considerat ca fiind un lvalue (left value-valoare stanga), deci poate fi folosit atat pentru a obtine valoarea obiectului, cat si pentru a o modifica printr-o operatie de atribuire.

Exemplul 5.9.:

int a[10], * ptr; // a este &a[0], deci 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, atribuirea ptr=&a[0 poate fi inlocuita, ca in exemplul anterior, cu ptr=a

1. POINTERI SI TABLOURI UNIDIMENSIONALE

Deoarece numele unui tablou este un pointer (constant), putem concluziona (figura 5.2):
a+i Û & a[i]

a[i] Û * (a+i)

a[0] a[1] a[9]

a

a=&a[0] a+1=&a[1] a+9=&a[9]

a=a[0] * (a+1)=a[1] (a+9)=a[9]

ptr  Figura 5.2. Legatura dintre pointeri si tablouri

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

pointer.

Exemplul 5.10.:

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

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

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

Exercitiul 5.2.: Sa se scrie urmatorul program - care ilustreaza legatura dintre pointeri si vectori - si sa se urmareasca rezultatele executiei acestuia.

#include <iostream.h>

#include <conio.h>
int 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

int *pt1,*pt2,*pt3; int v1[2]=; int v2[2]=; pt1 = pt2 = v1; pt3 = v2;

cout<<'Op.*si ++ au aceeasi priorit, asociat.de la dr.la stn'; cout<<'*pt1 pointeaza spre val'<<*pt1<<' de la adr'<<pt1<<'n'; cout<<'*pt2 pointeaza spre val'<<*pt2<<' de la adr'<<pt2<<'n'; cout<<'&v1[0]='<<&v1[0]<<'v1='<<v1<<'Val v1[0]='<< v1[0]<<'n'; cout<<'*++pt1 pointeaza catre val'<<*++pt1;

cout<<' de la adr incrementata '<<pt1+1<<'n';
cout<<'Noua valoare a lui pt1='<<pt1<<'n';

cout<<'*pt3 pointeaza spre val'<<*pt3<<' de la adr'<<pt3<<'n';

cout<<'(*pt3)++ pointeaza catre valoarea '<<(*pt3)++<<'n'; cout<<'pt3='<<pt3<<' *pt3='<<*pt3<<' v2[0]='<<v2[0]<<'n'; getch(); textmode(3); return 0; }

Exercitiul : 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; // citirea valorii de inlocuire

(a+indice)=val; //inlocuirea propriu-zisa

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).*/

POINTERI SI SIRURI DE CARACTERE

Asa cum s-a aratat in capitolul 4, un sir de caractere este un caz particular al unui vector de
caractere. Spre deosebire de celelalte constante, constantele
sir de caractere nu au o lungime
fix
a, deci numarul de octeti alocati la compilare pentru memorarea sirului, variaza. Deoarece
valoarea variabilelor pointer poate fi schimbata in orice moment, cu multa usurinta, este
preferabil
a utilizarea acestora, in locul tablourilor de caractere (vezi exemplul urmator).

Exemplul 5.11.:

char sir[10];  char * psir;

sir = "hello"; // ilegal

psir = "hello"; // legal

Exercitiul 5.4.: Sa se scrie urmatorul program - care ilustreaza legatura dintre pointeri si sirurile de caractere - si sa se urmareasca rezultatele executiei acestuia.

#include <iostream.h>

void main(void)



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1703
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved