Sunteți pe pagina 1din 14

Universitatea de Vest Timisoara

Facultatea de Matematica si Informatica Programare I

Limbajul de programare C

Lucian Cucu - The C Programming Langu 1


27.11.1
Universitatea de Vest Timisoara
Facultatea de Matematica si Informatica Programare I

Pointeri: operatii legale cu pointeri– sumar si comentarii

• Initializare si atribuire
• De-referentiere
• Adunarea/scaderea unui intreg la/de la un pointer
• Incrementarea/decrementarea
• Scaderea unui pointer dintr-un alt pointer
• Compararea a doi pointeri

Comentarii:
- Operatiile 3 si 4 au sens (trebuie realizate) doar daca pointerul pointeaza catre
un element al unui tablou!
- Operatiile 5 si 6 au sens (trebuie realizate) doar daca ambii pointeri pointeaza
catre elemente ale aceluiasi tablou!

Lucian Cucu - The C Programming Langu 2


27.11.1
Universitatea de Vest Timisoara
Facultatea de Matematica si Informatica Programare I

Pointeri: aritmetica pointerilor

Toate operatiile cu/asupra pointerilor iau in considerare dimensiunea


obiectelor de tipul declarat al pointerului! (aritmetica pointerilor)

int n;
TYPE t[N], *p, *q;
p=&t[0]; /* p=t */
q=&t[4];
...
...*p... /*value starting at address p and stored on sizeof(TYPE) bytes as data of type TYPE */
...p+n... /* compiles to p+n*sizeof(TYPE) */
...p++... /* compiles to p=p+1*sizeof(TYPE) */
...n=q-p... /* compiles to n=(q-p)/sizeof(TYPE) */

Lucian Cucu - The C Programming Langu 3


27.11.1
Universitatea de Vest Timisoara
Facultatea de Matematica si Informatica Programare I

Pointeri: pointeri void

Declaratie:
void *name;

Singura operatie legala cu pointeri void este atribuirea:


ex.
void *p;
TYPE1 *p1;
TYPE2 *p2;
...
p=p1;
...
p2=p;
...

Pointerii void pot fi folositi doar pentru “depozitarea” de adrese!

Lucian Cucu - The C Programming Langu 4


27.11.1
Universitatea de Vest Timisoara
Facultatea de Matematica si Informatica Programare I

Pointeri si functii
Functiile pot:
a) sa primeasca pointeri ca parametri
b) sa returneze pointeri
/* a) */
/* function prototype */
TYPE1 *function(TYPE2 *ptr);
...
TYPE2 v, *pv=&v;
...
function(&v); /*function call*/
function(p); /*function call*/
...

/* b) */
TYPE1 *q;
...
q=function(p);
*q=... /* wrong! q may be NULL! */

if((q=function(p)) == NULL)
handle_error();
*q=... /* right! q is not NULL */

Lucian Cucu - The C Programming Langu 5


27.11.1
Universitatea de Vest Timisoara
Facultatea de Matematica si Informatica Programare I

Pointeri: functii cu parametri de tip tablou

E.g.
TYPE1 function(TYPE2 t[]); /* t este in realitate un pointer! */
...
TYPE2 array[L];
...
function(array); /* &array[0] se transmite ca argument catre function */
...
.
.
. call
Problema: t:
ret.
addr.
context

In functie nu se cunoaste numarul de elemente ale tabloului! .


.
.

array:0
1
Solutie: 2
.
Exista mai multe solutii cu grad diferit de reutilizare! .
.
L-1

Lucian Cucu - The C Programming Langu 6


27.11.1
Universitatea de Vest Timisoara
Facultatea de Matematica si Informatica Programare I

Pointeri: functii cu parametri de tip tablou (1)


file.c

TYPE1 function(TYPE2 t[]);


#define L 100
#define M 1000
...
TYPE2 array1[L],
array1[L]; array2[M];
...
function(array1);
...
function(array2); /* wrong! array2 has a different
... number of elements! */
function.c
#define L 100
TYPE1 function(TYPE2 t[ ])
{
int i;
...
for(i=0; i < L ; i++)
... t[i] ...; /*process t[i] */
...
}

Lucian Cucu - The C Programming Langu 7


27.11.1
Universitatea de Vest Timisoara
Facultatea de Matematica si Informatica Programare I

Pointeri: functii cu parametri de tip tablou (2)


file.c

TYPE1 function(TYPE2 t[], int n);


#define L 100
#define M 1000
...
TYPE2 array1[L], array2[M];
...
function(array1, L);
...
function(array2, M);
...

function.c

TYPE1 function(TYPE2 t[ ], int n)


{
int i;
...
for(i=0; i < n ; i++)
... t[i] ...; /*process t[i] */
...
}

Lucian Cucu - The C Programming Langu 8


27.11.1
Universitatea de Vest Timisoara
Facultatea de Matematica si Informatica Programare I

Pointeri: functii cu parametri de tip tablou (2)


Caz special: tablouri cu elemente de tipul char.
Daca tabloul se utilizeaza pentru stocarea:
de intregi “mici” unui sir de caractere

TYPE1 function(char t[], int n); TYPE1 function(char t[]);


#define L 100 #define L 100
#define M 1000 #define M 1000
... ...
char array1[L], array2[M]; char array1[L]="Arad", array2[M]="Timisoara";
... ...
function(array1, L); function(array1);
... ...
function(array2, M); function(array2);
... ...

TYPE1 function(char t[ ], int n) TYPE1 function(char t[ ])


{ {
int i; int i=0;
... ...
for(i=0; i < n ; i++) while(t[i] != '\0')
... t[i] ...; /*process t[i] */ ... t[i] ...; /*process t[i] */
... ...
} }

Lucian Cucu - The C Programming Langu 9


27.11.1
Universitatea de Vest Timisoara
Facultatea de Matematica si Informatica Programare I

Pointeri si tablouri

Pointerii se utilizeaza cel mai adesea in contextul prelucrarii tablourilor!

Remember:

- adunarea/scaderea unui intreg la/de la un pointer


- incrementarea/decrementarea
- scaderea unui pointer dintr-un alt pointer
- compararea a doi pointeri

au sens doar daca pointerii implicati pointeaza spre elemente de tablou!

Lucian Cucu - The C Programming Langu 10


27.11.1
Universitatea de Vest Timisoara
Facultatea de Matematica si Informatica Programare I

Pointeri si tablouri: echivalenta notatiei cu pointeri si respectiv cu indecsi


Remember: numele unui tablou este un sinonim pentru adresa primului sau element si este o
constanta!
TYPE t[N], *p=t;
t:

0 1 2 3 4 … i … N-1
p:

p este egal cu t si ambele valori sunt adrese (adresa elementului t[0])


Atunci
p+0 este egal cu t+0
p+i este egal cu t+i
*p este egal cu *t
*(p+i) este egal cu *(t+i)
dar
p++ nu este egal cu t++ ! (t este o constanta si nu poate fi modificata!)
Si
t[0] este egal cu p[0]
t[i] este egal cu p[i]
Un pointer poate fi utilizat ca nume de tablou (poate fi indexat) si
numele de tablou poate fi utilizat ca pointer (daca aceasta nu implica modificarea valorii sale, care
este constanta!)
Lucian Cucu - The C Programming Langu 11
27.11.1
Universitatea de Vest Timisoara
Facultatea de Matematica si Informatica Programare I

Pointeri si tablouri: eficienta utilizarii pointerilor

Nu orice utilizare a pointerilor aduce eficienta sporita!


TYPE t[N], *p=t;
t[i] inseamna *(t+i) care e echivalent cu *(p+i)
for(i=0; i<N; i++)
Dar, atat p cat si t sunt adrese, deci li se aplica aritmetica
t[i]=…; pointerilor,
ceea ce inseamna ca are loc o inmultire (ascunsa)

este echivalent cu *(t+i*sizeof(TYPE))

Sumar al operatiilor:
for(i=0; i<N; i++) 1 adunare, 1 inmultire si 1 de-referentiere / iteratie
*(p+i)=…;
Echivaland incrementarea cu o adunare
Sumar al operatiilor:
si ambele variante 1 adunare si 1 de-referentiere / iteratie
sunt mai lente decat: Avantaj: 1 inmultire / iteratie mai putin!
for(i=0; i<N; i++, p++)
*p=…;

Lucian Cucu - The C Programming Langu 12


27.11.1
Universitatea de Vest Timisoara
Facultatea de Matematica si Informatica Programare I

Pointeri: prelucrarea de siruri de caractere

/* strcpy: copy t to s; array subscript version */ /* strcpy: copy t to s; pointer version */


void strcpy(char *s, char *t) void strcpy(char *s, char *t)
{
{
int i;
int i; i = 0;
i = 0; while ((*s = *t) != '\0')
while ((s[i] = t[i]) != '\0') { s++; t++; }
i++; } }

/* strcpy: copy t to s; pointer version 2 */


void strcpy(char *s, char *t)
{
while ((*s++ = *t++) != '\0')
;
}

Lucian Cucu - The C Programming Langu 13


27.11.1
Universitatea de Vest Timisoara
Facultatea de Matematica si Informatica Programare I

Pointeri: pointeri const vs pointeri la obiecte const


Modificatorul const
Sintaxa: const type_name variable_name;
or
type_name const variable_name;
Utilizare: modificator de declaratie utilizat pt a interzice modificari ale valorii initiale a variabilei
Ex.
const int a, b; /* identic cu: int const a, b; */
a=0; b=1; /* eronat: nu se pot modifica valorile constantelor a and b, care trebui initializate!

De aceea
const int a=0, b=1; /* identic cu: int const a, b; */
a=++b; /* gresit, dar a si b au fost initializati */

Pointer la const:
const int a=0, b=1, *p=&a; /* identic cu: int const a=0, b=1, *p=&b; */
*p=100; /*eronat: nu se poate modifica valoarea constanta a lui a */
p=&b; /* OK! P nu e constant! */

Pointer const :
int a=0, b=1;
int * const p=&a; /* identic cu: int a=0, b=1, * const p=&a; */
*p=a+b; /* OK! Identic cu a=a+b; */
p=&b; /* eronat: nu se poate modifica valoarea constanta a lui p */

Lucian Cucu - The C Programming Langu 14


27.11.1

S-ar putea să vă placă și