Documente Academic
Documente Profesional
Documente Cultură
Limbajul de programare C
• 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!
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) */
Declaratie:
void *name;
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 */
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
array:0
1
Solutie: 2
.
Exista mai multe solutii cu grad diferit de reutilizare! .
.
L-1
function.c
Pointeri si tablouri
Remember:
0 1 2 3 4 … i … N-1
p:
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=…;
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 */