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;

}

 

Free Web Hosting