Documente Academic
Documente Profesional
Documente Cultură
Limbajul C
CURS 6
Pointeri
Introducere
Definiie:
Un pointer este o variabil care pstreaz adresa
unei date, nu valoarea datei.
Un pointer poate fi utilizat pentru referirea
diferitelor date i structuri de date. Schimbnd
adresa memorat n pointer, pot fi manipulate
informaii situate la diferite locaii de memorie.
Programul i datele sale sunt pstrate n
memoria RAM ( Random Access Memory ) a
calculatorului.
Programarea calculatoarelor
Declarare i operatori
Declaraia unei variabile pointer
se folosete operatorul de indirectare *:
tip_referit * var_pointer;
Operatori
Spaiul ocupat de o variabil pointer:
sizeof(var_pointer)
valoarea expresiei este 2 (n modelul small),
oricare ar fi tip_referit
expresile de mai jos conduc la aceeai valoare 2:
sizeof(&var)
sizeof(tip_referit *)
Operatori
Adresa unei variabile pointer este un pointer,
la fel ca adresa unei variabile de orice alt tip:
&var_pointer
Programarea calculatoarelor
Exemplu
int *p, n=5, m;
p=&n;
m=*p;
m=*p+1;
int *a,**b,c=1,d;
a=&c;
b=&a;
d=**b;
//d=1
int *p;
float x=1.23, y;
p=&x;
y=*p; //valoare eronata pentru y
Programarea calculatoarelor
Operatii cu pointeri
Adunarea (scderea) unei constante la un pointer
tip*p;
p++;
p--;
p=p+c;
p=p-c;
p=p+sizeof(tip);
p=p-sizeof(tip);
p=p+c*sizeof(tip);
p=p-c*sizeof(tip);
Accesul la memorie
Pointerul 0 este predefinit ca NULL i
semnific faptul c nu indic nimic.
void * nseamna un pointer de tip neprecizat
Nu putem face operaii aritmetice asupra
acestor pointeri.
Pointerii void ne permit pstrarea gradului de
generalitate al unui program la maximum.
Programarea calculatoarelor
Pointeri i vectori
Numele unui tablou este un pointer constant
spre primul su element.
Expresiile de mai jos sunt echivalente:
nume_tablou
&nume_tablou
&nume_tablou[0]
i de asemenea:
*nume_tablou
nume_tablou[0]
Programarea calculatoarelor
Pointeri i vectori
Declaraii echivalente:
tip v[lim1][lim2][limn];
tip **v;
Exemplu:
int v[10]; /*echivalent cu:*/
int *v;
v=(int *)malloc(10*sizeof(int)); // cu alocare dinamic!!!
Referire elemente:
v[i]
*(v+i)
Programarea calculatoarelor
Pointeri i vectori
Exemplu:
int i;
double v[100], x, *p;
p=&v[0];
p=v;
x=v[5];
x=*(v+5);
v++;
p++;
->corect, neelegant
->incorect
->corect
Obs:
p[4]=2.5 ->corect sintactic, dar nu este alocat memorie pentru p!!!
Programarea calculatoarelor
}
void f(int a[10] , int n){
}
void f(int a[] , int n)
}
Programarea calculatoarelor
Sau:
void main(void)
{
int v[10], n;
f(v,n);
Programarea calculatoarelor
void main(void)
{
int *v, n;
f(v,n);
Exemplu
#include <stdio.h>
#include <stdlib.h>
#define N 5
int citire1(int tab[]){
/*citeste elementele lui tab prin accesarea indexata a elementelor */
int i=0;
printf("Introduceti elementele tabloului:\n");
while(scanf(%d,&tab[i]!=EOF) i++;
return i;
}
void tiparire1(int *tab, int n){
/* tipareste elementele tabloului prin accesarea indexata a elementelor */
int i;
printf("Elementele tabloului:\n");
for(i=0;i<n;i++)
printf("%d ",tab[i]);
printf(\n);
}
Programarea calculatoarelor
Exemplu
int citire2(int tab[]){
/* citeste elementele lui tab - accesarea fiecarui element se face printr-un pointer la
el */
int *pi;
pi=tab;
printf("Introduceti elementele tabloului:\n");
while(scanf(%d,pi)!=EOF) pi++;
return pi-tab;
}
void tiparire2 (int tab[], int n){
/* tipareste elementele lui tab prin accesare prn pointeri */
int *pi;
printf("Elementele tabloului:\n");
for (pi=tab; pi<tab+n; pi++)
printf("%d ",*pi);
printf(\n);
}
Programarea calculatoarelor
Exemplu
int main(){
int tab1[N], tab2[N], n, m;
system(cls);
n=citire1(tab1);
tiparire1(tab1,n);
m=citire2(tab2);
tiparire2(tab2,m);
getchar();
return 0;
}
Programarea calculatoarelor
Programarea calculatoarelor
Apel funcii:
int a[NMAX][NMAX], m, n;
..
if (minmax( a, m, n)){
...
}
Programarea calculatoarelor
2.
3.
// prototip funcie
int main() {
float a[30][30],am[30],min;
//am- vector cu minimul de pe fiecare linie
int i,nl,nc;
...
//nl=nr.linii, nc=nr.coloane
// citire date
for (i=0;i<n;i++)
am[i]=minim(a[i],nc);
min= minim(am,nl);
...
Programarea calculatoarelor
Programarea calculatoarelor
Transmiterea parametrilor
Transmiterea parametrilor se face prin valoare - valorile
parametrilor actuali sunt depuse pe stiva, la apelul unei funcii,
fiind prelucrate ca parametri formali de ctre funcie;
Modificarea parametrilor formali nu afecteaz deci parametrii
actuali!
Dac parametrul este un tablou, cum numele este echivalent cu
pointerul la tablou, funcia poate modifica valorile elementelor
tabloului, primind adresa lui. A se observa c trebuie s se
transmit ca parametri i dimensiunea/dimensiunile
tabloului/matricii.
Dac parametrul este ir de caractere, dimensiunea tabloului
de caractere nu trebuie s se transmit, sfritul irului fiind
indicat de caracterul terminator '\0'.
Programarea calculatoarelor
Pointeri i funcii
Transmiterea implicit a argumentelor se face prin valoare!
Parametrii nemodificabili!
Exemplu:
#include<stdio.h>
void schimbare(int x, int y) //se vor crea copii ale variabilelor x i y
{ int tmp;
tmp=x;
x=y;
y=tmp;
//n cadrul copiilor variabilelor se face inversarea
}
//dar la revenire copiile variabilelor x i y se distrug
Programarea calculatoarelor
Pointeri i funcii
continuare exemplu:
void main(void)
{
int x=5, y=7;
schimbare(x,y);
//transmitere prin valoare
printf(%d %d\n,x,y); /*valorile rmn
nemodificate adic se va afia 5 7*/
}
Programarea calculatoarelor
Programarea calculatoarelor
CONCLUZII
Pointerii permit:
s realizm modificarea unor valori trimise ca
parametrii unei funcii
s accesm mult mai eficient tablourile.
ofer mijlocul de a accesa indirect o valoare
a ununi tip de dat.
s lucrm cu zone de memorie alocate
dinamic
Programarea calculatoarelor
Programarea calculatoarelor
Programarea calculatoarelor
Observaie
// NU!!!
int main () {
float a[]={3,7,1,2,8,4};
float *a1, *a2;
minmax (a,6,a1,a2);
printf("%f %f \n",*a1,*a2);
getchar();
return 0;
}
Programarea calculatoarelor
Exerciii propuse
1. Se tipresc elementele a dou matrici de ntregi, cu
acelai numr de coloane.
Adugai cte o funcie pentru fiecare din
prelucrrile:
citete o matrice
returneaz suma elementelor unei matrici
nsumeaz dou matrici ntr-o a treia
nmulete dou matrici ntr-o a treia.
Exerciii propuse
3. S se scrie o funcie de desenare a unei bare
orizontale compuse din n caractere ch. S se
utilizeze aceast funcie pentru afiarea unei
histograme ale crei valori sunt memorate ntr-un
vector (se va crea o funcie). Program de testare a
funciilor scrise anterior.
4. S se scrie o funcie care calculeaz valorile
unghiurilor unui triunghi, n funcie de lungimile
laturilor. Funcia va fi scris n dou variante:
cu 6 argumente: 3 date i 3 rezultate
cu 2 argumente de tip vector.
Programarea calculatoarelor
Programarea calculatoarelor
Programarea calculatoarelor
Programarea calculatoarelor
Programarea calculatoarelor
Programarea calculatoarelor