Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Pointeri si adrese

c



+ Font mai mare | - Font mai mic



Pointeri si adrese

Exista doi operatori unari care permit utilizarea variabilelor pointer:



q       & - operatorul adresa (de referentiere) - pentru aflarea adresei din memorie a unei variabile;

q       - operatorul de indirectare (de deferentiere) - care furnizeaza valoarea din zona de memorie spre care pointeaza pointerul operand.

Sintaxa declaratiei unui pointer de date este:

tip *identificator_pointer;

Simbolul * precizeaza ca identificator_pointer este numele unei variabile pointer de date, iar tip este tipul obiectelor a caror adresa o va contine.

Exemplu:

int u, v, *p, *q; // *p, *q sunt pointeri de date (catre int)

double a, b, *p1, *q1; // *p1, *q1 sunt pointeri catre date de tip double

Operatorul '*' se numeste operatorul de referentiere si este aplicat unei adrese, intorcand valoarea memorata la acea adresa.

De exemplu, in declaratia:

int *n;

n este adresa unei variabile de tip intreg, iar *n este valoarea memorata la adresa n.

OBSERVATIE: Orice adresa este memorata sub forma unui numar intreg, pe 2, 4 sau 8 octeti (in mod implicit 2)

Operatorul invers se noteaza '&' si se numeste operatorul de dereferentiere (operatorul adresa)

De exemplu instructiunea: &x=y are semnificatia: adresa lui x ia valoarea y.

OBSERVATIE Valoarea parametrilor de intrare ai unei functii nu se modifica decat daca se transmite prin referinta (prin adresa)

OBSERVATIE: De la regula de mai sus fac exceptie parametrii de tip tablou (vector) deoarece orice tablou este o adresa la valoarea primului sau element.

Exemple

Programul transmite valoarea variabilei sursa catre variabila dest prin intermediul unui pointer.

Programul contine si o functie ce schimba intre ele valorile a doua variabile prin schimbarea adreselor lor; daca functia schimb ar fi operat cu valorile variabilelor si nu cu adresele lor, schimbarea nu ar fi avut efect in functia principala main.

Pointeri

//Pointeri - exemple

#include<iostream.h>

void main()

Legatura pointeri - siruri de caractere

Sa se scrie urmatorul program si sa se urmareasca rezultatele executiei acestuia.

//Pointeri si sirurie de caractere

#include <iostream.h>

#include<conio.h>

void main(void)

Pointer la vector - exemplul 1

In limbajul C, cazul parametrilor tablou constituie o exceptie de la regula transferului parametrilor prin valoare. Numele unui tablou reprezinta, de fapt, adresa tabloului, deci a primului element din tablou.

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++; // x = *pi1 = a[0] = 0, iar apoi *pi1= a[1] = 1

cout<<'x='<<x<<'n';

x=(*pi1)++; /* x = 1: intai atribuirea, apoi incrementarea valorii spre care indica pi1.

In urma incrementarii, valoarea lui a[1] devine 2

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

Pointer la vector - exemplul 2

//Pointer la vector

#include <iostream.h>

#define DIM 3

float cere_element(int i)

void afis_tablou(float *ptablou)

void main()

Pointer la matrice - exemplul 1

#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 (int i=0; i<3; i++)

Pointer la matrice - exemplul 2

//Pointer la matrice

#include <iostream.h>

#define DIM1 3

#define DIM2 2

float cere_element(int i,int j)

void afis_tablou(float **ptablou)

void main()

Probleme teoretice

In ce consta operatia de incrementare a pointerilor ?

Tablouri de pointeri.

Ce sunt pointerii generici ?

Ce operatii se pot realiza asupra variabilelor pointer ?

De ce numele unui pointer este rvalue ?

Ce fel de variabile pot constitui operandul operatorului de deferentiere ?

Operatorul de referentiere.

Unui pointer generic i se poate atribui valoarea unui pointer cu tip ?

Care este legatura intre tablouri si pointeri ?

De ce numele unui tablou este lvalue ?

Probleme practice

Sa se implementeze programele cu exemplele prezentate.

Sa se scrie programele pentru exercitiile rezolvate care au fost prezentate.

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';



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1032
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