Professional Documents
Culture Documents
Limbajul de programare C
Comments:
- Operations 3 and 4 only make sense (shall only be performed) if the pointer
points to an element of an array!
- Operations 5 and 6 only make sense (shall only be performed) if both pointers
point to elements of the same array!
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 */
Lucian Cucu - The C Programming Language
06.02.18 5
Universitatea deVest Timisoara
Facultatea de Matematica si Informatica Programare I
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
ret. context
Problema: t:
addr.
array:0
1
Solutie: 2
.
.
Exista mai multe solutii cu grad diferit de reutilizare! .
L-1
function.c
TYPE1 function(TYPE2 t[ ], int n)
{
int i;
...
for(i=0; i < n ; i++)
... t[i] ...; /*process t[i] */
...
}
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=…;
Lucian Cucu - The C Programming Language
06.02.18 12
Universitatea deVest Timisoara
Facultatea de Matematica si Informatica Programare I
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 */