Scrigroup - Documente si articole

Username / Parola inexistente      

Home Documente Upload Resurse Alte limbi doc  

CATEGORII DOCUMENTE





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







DOCUMENTE SIMILARE

Trimite pe Messenger
Porturi
Problema repartizarii (Assignment)
Copieri de fisiere si foldere
Problema deciziei (Decision Analysis)
LIMBAJE DE PROGRAMARE - Scurta prezentare a limbajelor de programare
PROIECT TD - DISPOZITIV DE TRANSMITERE A DATELOR
Administrarea indecsilor Oracle9I
Schimbarea dimensiunii unui proces
Sistemul de operare MS-DOS
Mediul de programare SCILAB

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

}

2.  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

DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 657
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 2019 . All rights reserved

Distribuie URL

Adauga cod HTML in site