Title | Aritmética de punteros 16-17 |
---|---|
Course | Fundamentos de programación |
Institution | Universidad Europea de Madrid |
Pages | 4 |
File Size | 108.7 KB |
File Type | |
Total Downloads | 92 |
Total Views | 150 |
teoria...
Aritmética de punteros Cuando declaramos un vector, por ejemplo:
#defineN5 intv[N];/*vectorde50componentesenteras*/ int*pt; Provoca lo siguiente: 1. Se reserva un bloque de memoria suficientemente grande para almacenar N componentes enteras, si el tamaño de un entero es 2 bytes, se reservan 100 bytes consecutivos para almacenar las componentes del vector 2. Por otro lado, se crea una constante puntero con el nombre del vector que apunta al inicio del bloque anterior
v[0] 10
v[1] 20
v[2] 30
v[3] 40
v[4] 50
v Como v es un puntero su valor se puede asignar a cualquier otro puntero compatible, por ejemplo pt que también es puntero a entero: pt=v; También podríamos haber conseguido que pt apunte al comienzo del vector con la siguiente asignación: pt=&v[0]; v[0] 10 v
v[1] 20
v[2] 30
v[3] 40
v[4] 50
pt
Ahora podríamos acceder a la primera componente del vector mediante índices o mediante el puntero: v[0]= 27; //equivalente a *v= 27; *pt= 27; Sin embargo el puntero v no se puede modificar, es constante, siempre apunta a la primera componente del vector. v=pt; ARITMÉTICA DE PUNTEROS: Se permiten operaciones aritméticas con punteros: − Incremento, decremento: los valores de tipo puntero se pueden incrementar y decrementar, siempre en valores enteros. Se admiten los operadores ’+’, ’−’, ’++’ y ’− −’ Esto implica un desplazamiento del puntero, equivalente a (valor incrementado)*(tamaño en bytes del tipo apuntado), por ejemplo: v[0] 10 v
v[1] 20
v[2] 30
v[3] 40
v[4] 50
pt
pt=pt+2;//Desplazaporencimaenelbloquedememoriadelvector
Desplaza por encima el puntero 2*(tamaño de un entero), es decir las dos componentes siguientes del vector: v[0] 10
v[1] 20
v
v[2] 30
v[3] 40
v[4] 50
pt
pt=pt‐1;//Desplazahaciaatrásenelbloquedememoriadelvector v[0] v[1] v[2] v[3] v[4] 10 20 30 40 50 v
pt
− La suma de punteros no está permitida. La resta de punteros está permitida cuando ambos punteros apuntan al mismo vector y da como resultado el número de componentes del vector que hay entre ambos punteros Por tanto:
v
0 10
1 20
2 30
3 40
4 50
pt pt+1pt+2pt+3pt+4 Así *ptesequivalenteav[0] *(pt+1)esequivalenteav[1] *(pt+2)esequivalenteav[2] … pt=&v[0];equivalea pt=v; v[i] equivalea*(v+i) &v[i]equivaleav+i
RECORRIDO de un vector con punteros:
#defineN5 intv[N];/*vectorde50componentesenteras*/ inti,*pt; //Recorridousandoelpunterovylaarirmeticadepunteros printf("\nEscribelas%dcomponentesdelvector:",N); for(i=0;i...