Análisis y Diseño de Algoritmos
Prof:
Ing. Victor Garro
Asistente: Marco Elizondo
Vargas
Punteros
Punteros
a Punteros
Un puntero a puntero es…
un puntero que contiene la dirección de memoria de otro puntero int
main ()
{
int a = 5;
int *p; // Puntero a entero
int **q; // Puntero a puntero
p = &a;
q = &p;
}
Para acceder al valor de la variable a podemos escribir
a (forma habitual)
*p (a través del puntero p)
**q (a través del puntero a puntero q)
q contiene la dirección de p, que contiene la dirección de a
Aritmética
de punteros
Correspondencia
entre punteros y vectores
Cuando declaramos un vector
<tipo> <identificador> [<dim>]
en realidad
1. Reservamos memoria para almacenar <dim> elementos de tipo <tipo>.
2. Creamos un puntero <identificador> que apunta a la primera
posición de la memoria reservada para almacenar los componentes del vector.
Por
tanto, el identificador del vector es un puntero.
int v[3];
int *ptr;
...
ptr = v; // Equivale
a ptr = &v[0]
v[0] = 6; // ≡ *v = 6; ≡ *(&v[0]) = 6;
Aritmética
de punteros
<tipo> *ptr;
ptr + <desplazamiento> devuelve un puntero a la posición de memoria
sizeof(<tipo>)*<desplazamiento> bytes por encima de ptr.
int v[];
int *ptr = v;
ptr+i apunta a v[i]
*(ptr+i) ≡ v[i]
NOTA: La suma de punteros no tiene sentido y no está permitida. La resta sólo
tiene sentido cuando ambos apuntan al mismo vector y nos da la “distancia”
entre las posiciones del vector (en número de elementos).
Ejemplo:
Distintas formas de sumar los elementos de un vector
int suma ( int v[], int N)
{
int i,
suma;
int *ptr,
*ptrfin;
/*
Alternativa 1 */
suma = 0;
for (i=0
; i<N ; i++)
suma =
suma + v[i];
/* Alternativa
2 */
suma = 0;
for (i=0
; i<N ; i++)
suma =
suma + (*(v+i));
/*
Alternativa 3 */
suma = 0;
ptrfin = ptr + N-1;
for (ptr=v ; ptr<=ptrfin ; ptr++)
suma = suma + *ptr;
return suma;
}
Punteros
y matrices
<tipo> mat [<dimF>][<dimC>];
dirección(i,j) = dirección(0,0) + i*dimC + j
Ejemplo:
Intercambio de valores
void Cambia(int
*a, int *b)
{
int aux;
aux = *a;
*a = *b;
*b = aux;
}
int main()
{
int x=0, y=1;
…
Cambia(&x,&y);
…
return 0;
}