Documente Academic
Documente Profesional
Documente Cultură
Pointeri
CUPRINS
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Noiuni introductive
Operatori specifici pentru pointeri
Operaii cu pointeri
Apelul prin adres utiliznd pointeri
Pointeri i referine
Indirectarea multipl
Pointeri constani i pointeri ctre constante
Tablouri i pointeri
Funcii pentru lucrul cu iruri de caractere
Pointeri spre funcii
Transferarea de argumente ctre funcia main( )
Alocarea dinamic a memoriei
Funcii pentru manipularea zonelor de memorie
1. NOIUNI INTRODUCTIVE
Tipuri de pointeri:
pointeri de date:
pointeri de funcii:
pointeri de obiecte:
NOIUNI INTRODUCTIVE
Exemplu:
void main(void)
{
int i=10, *ptri;
ptri = &i;
printf("Valoare var : %d \nLa adresa var : %d" , i, *ptri);
*ptri = 20;
printf("Valoare var : %d \nLa adresa var : %d" , i, *ptri);
sau
int *p;
double q, temp;
temp=20.5;
p=&temp;
q=*p;
//iau doar cat e specific unui int
printf (\nprin pointer int luat de la un
double: %lf,q);
10
int x;
float y;
void *p;
...
p=&x;
// lui p i se atribuie adresa de memorie
unde pot fi intregi
*(int*)p = 10;
p=&y;
12
3. OPERAII CU POINTERI
OPERAII CU POINTERI
Atribuirea
Dac:
tip1 *id_ptr1;
tip2 *id_ptr2;
id_ptr1 = id_ptr2;
OPERAII CU POINTERI
#include <iostream>
using namespace std;
#include <conio.h>
void main(){
void *pg;
int *pi;
double *pd;
int nota=10;
double media=9.97;
pi=¬a;
pg=pi;
15
cout <<"\nNota prin pointer generic e:"<<*(int*)pg<<endl;//10
OPERAII CU POINTERI
pd=&media;
pg=pd;
cout <<"\nMedia prin pointer generic
e:"<<*(double*)pg<<endl;//9.97
pi=(int*)pg;
cout <<"\nMedia prin pointer intreg e:"<<*pi<<endl;
//valoarea nu e corecta:-687194767
pd=(double*)pg;
cout <<"\nMedia prin pointer double
e:"<<*pd<<endl;//valoarea e corecta:9.97
getch();
}
16
OPERAII CU POINTERI
Exemplu:
int *p1, *p2, i, j;
...
p1=&i;
p2=&j;
if (p1 < p2)
printf ("p1= %n p2 = %n\n", p1, p2);
17
OPERAII CU POINTERI
OPERAII CU POINTERI
tip *id_ptr;
id_ptr + n, id_ptr - n
OPERAII CU POINTERI
20
OPERAII CU POINTERI
Exemplu:
float *fp1, *fp2, tf[10];
// sizeof (float) = 4
double *dp, td[10[;
// sizeof (double) = 8
...
fp1 = &tf[0];
//tf
dp = &td[9];
// adresa celui de-al 10-lea element
fp2 = fp1+5;
dp = dp-2;
fp1++;
dp--;
21
OPERAII CU POINTERI
22
OPERAII CU POINTERI
. (programul de la slide-ul 15)
res=(*pd)++;
cout <<"\nMedia prin res e:"<<res<<endl;
//valoarea e corecta:9.97
//dupa, *pd se va incrementa ca si valoare double
cout<<"\nAdresa pd e = "<<pd<<endl;//0077FC08
res=*pd++;//res incrementat anterior:10.97, adresa se
va incrementa
cout <<"\nMedia prin res incrementata
e:"<<res<<endl;//valoarea e corecta:10.97
cout<<"\nAdresa pd incrementata e =
"<<pd<<endl;//0077FC10
23
OPERAII CU POINTERI
#include <iostream>
using namespace std;
#include <conio.h>
void main(){
int l=1, j=5,k, *p;
p=&l;
*p=2;//modific l, operatie asupra continut
cout << "\nl= "<< l << " j= " << j << " Pointer adresa lui l (e p) = "
<< p << " Adresa lui j = " << &j << endl;
k=*(p=&j)++;
//modific in final pointerul p de la adresa lui j
cout << "\nk (j)= "<< k << " Valoarea lui j = " << j << " Adresa lui
j = " << &j << " Adresa lui p (oper. pointer) = " << p<<endl;
24
OPERAII CU POINTERI
p=&l;
cout << "*p=l = " <<l <<" adresa data de p e: " << p << endl;
k=(*p)++;
//oper continut
cout << "k=l = " <<k <<" adresa data de p e aceiasi: " << p
<< endl;
cout <<"l se va incrementa: " <<l << endl;
k=*p++;
cout << "k=l = " <<k <<" adresa data de p e: (incrementata)
" << p << endl;
const int const kk=7;
int k_var= *(int*)&kk;
k_var++;
cout <<"\n const kk = " << kk <<" k_var = " << k_var;
getch(); }//main
25
26
OPERAII CU POINTERI
27
28
Apel:
Apelul:
schimba1(x, y);
schimba2(&x, &y);
29
Variante:
31
5. POINTERI I REFERINE
32
POINTERI I REFERINE
int i;
int &r = i;
r = 1000; // i = 1000
33
POINTERI I REFERINE
POINTERI I REFERINE
Restricii:
nu sunt permise referine la referine, pointeri la
referine, referine la cmpuri de bii, tablouri de
referine, dar putem avea referine la pointeri
o referin nu poate avea valoarea NULL
o referin nu poate fi asociat unei alte variabile
Utilizare:
se folosesc rar variabile referine simple
uzual se folosesc la transmiterea parametrilor prin
referin, caz n care indirectarea este ascuns i nu
este necesar dereferenierea n funcie (utilizarea
operatorului *)
35
POINTERI I REFERINE
// varianta cu pointeri
void schimba2(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
apelul :
schimba2(&i, &j);
// varianta cu referine
void schimba3(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
apelul :
schimba3(i, j);
36
POINTERI I REFERINE
6. INDIRECTAREA MULTIPL
38
// incorect
// ok
pointeri constani
char *const str2 = "pointer constant ";
//str2 = "ptr const";
str2[0] = 'P';
// incorect
// ok
39
41
42
Exemplul 1:
#include <stdio.h>
void main(void)
{
int n, *pn;
float r, *pr;
44
Exemplul 2:
#include <stdio.h>
schimba1(x, y);
printf("\nNoile valori sunt: x = %d, y = %d", x, y);
schimba2(&x, &y);
printf("\nNoile valori sunt: x = %d, y = %d", x, y);
schimba3(x, y);
printf("\nNoile valori sunt: x = %d, y = %d\n", x, y);
}
46
47
Exemplul 3:
#include <stdio.h>
#include <conio.h>
void main(void){
int n, *p;
int tab[ ] = {1, 3, 5, 7, 9};
n = sizeof(tab)/sizeof(int);
p = &tab[0];
printf("\nElementele tabloului cu ++ de la inceput sunt: ");
for(int i=0; i<n; i++)
printf("\t%d", *p++);
p = &tab[n-1];
printf("\nElementele tabloului cu -- de la sfarsit sunt: ");
for(int i=0; i<n; i++)
printf("\t%d", *p--);
48
p = &tab[0];
printf("\nElementele tabloului de la inceput sunt: ");
for(int i=0; i<n; i++)
printf("\t%d", *(p+i));
p = &tab[n-1];
printf("\nElementele tabloului de la sfarsit sunt: ");
for(int i=0; i<n; i++)
printf("\t%d", *(p-i));
int *p1, *p2;
p1 = &tab[0]; p2 = p;
printf("\n\nDistanta intre ultimul si primul element: %d\n", p2-p1);
printf("\n\nCompararea pointerilor: ");
for(int i=0; i<n; i++){
if(p1 == p2)
printf("\n\tPentru i=%d, pointerii indica acelasi element\n", i);
p1++;
p2--;
}
49
getch();
}