La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Estructuras de Datos Punteros y algo más.

Presentaciones similares


Presentación del tema: "Estructuras de Datos Punteros y algo más."— Transcripción de la presentación:

1 Estructuras de Datos Punteros y algo más

2 Un puntero es una variable que almacena la dirección de memoria de otra variable
Para obtener la dirección de una variable se utiliza el operador de referencia: &nombre_variable Veamos un ejemplo:

3 int A; A=50; cout<<"La dirección de A es: "<< &A; cout<<" El valor de A es: "<<A; Esto imprimirá algo como: La dirección de A es: 0x0012FF7C El valor de A es: 50

4 Para declarar un puntero a una variable de un tipo dado se usa la siguiente sintaxis:
tipo_var *nombre_puntero; Ejemplo: int A=50; int *P; P=&A; Se declara un puntero (a entero) P, se le asigna la dirección del entero A, por tanto P queda apuntando a A

5 El operador de indirección
El operador de indirección * permite acceder a la variable cuya dirección se encuentra guardada en un puntero (ya sea para acceder al valor almacenado en la variable o para modificarlo) El operador de indirección usa la siguiente sintaxis: *nombre_puntero Veamos un ejemplo:

6 int A=50; int *P; P=&A; cout<< *P; // Imprime 50 *P=100; cout<< *P; // Imprime 100 cout<< A; // Imprime 100

7 Paso de argumentos por referencia
Con este método la función recibe las direcciones de las variables sobre las cuales se va a operar Por lo tanto la función puede cambiar los valores de dichas variables usando el operador * Veamos un ejemplo:

8 Sea la función sumap: int sumap(int *a, int *b, int c) { c = *a + *b;
/*Dentro de la función, a y b son dos variables locales de tipo puntero a int*/ *a = c; *b = c; return c; }

9 void main() { int a=3; int b=2; int c=0; int r=0; r=sumap( &a, &b, c ); cout<<”Valores finales: \n“; cout<<”a=”<<a; // Imprime 5 cout<<”b=”<<b; // Imprime 5 cout<<”c=”<<c; // Imprime 0 cout<<”r=”<<r; // Imprime 5 }

10 Aritmética de punteros
Sobre los punteros es posible sumar y restar números enteros, estas operaciones se usan para cambiar el lugar de la memoria al que apunta el puntero La aritmética de punteros tiene en cuenta el tamaño de la variable apuntada. Las operaciones sobre punteros deben usarse con precaución, ya que al cambiar indiscriminadamente los lugares de la memoria a los que se apunta se pueden sobrescribir accidentalmente otros datos

11 void main() { int a=654; int *p; p=&a; p++; cout<< *p << "y" << *(p-1); // Imprimió: y 654 }

12 Arreglos El identificador (o nombre) de un arreglo siempre se refiere a la dirección del primer elemento Para crear un puntero a un arreglo, simplemente se declara una variable puntero al tipo de los elementos del arreglo Este puntero puede ser acompañado de +i para acceder al elemento i del arreglo

13 Las siguientes expresiones son equivalentes:
(p1 +3) , (A + 3) y (&p1[3]) A p1 p2 p3

14 Recorrido de un vector usando punteros:
void main() { int A[]={2, 5, 87, 21, 34}; int *p; p=A; for(int i=0; i<5; i++) cout<<"Elemento "<<i<<"="<<*p<<"\n"; p++; }

15 Memoria dinámica La memoria dinámica (heap) permite a los programas pedir y liberar espacio de memoria durante su ejecución a medida que lo necesiten Las variables asignadas dinámicamente, residen en el heap, no están sujetas a las reglas de duración vistas en el módulo anterior Útil para declarar el tamaño de arreglos en tiempo de ejecución

16 La función malloc() reserva un espacio de
memoria de tamaño dado en el heap y retorna un puntero a dicho espacio (si no había memoria suficiente, retorna NULL) malloc() utiliza la siguiente sintaxis: puntero = ( tipo_de_variable * ) malloc ( numero_de_bytes ); Se requiere incluir stdlib.h Veamos un ejemplo:

17 int *crear_arreglo(int n)
{ int *p; p=(int *)malloc( n*sizeof(int) ); for(int i=0; i<n; i++){ p[i]=1; } return p; void main(void) { int *a; a=crear_arreglo(4); free(a); //Liberar espacio reservado

18 La función free() libera un espacio de memoria reservado mediante malloc(), no retorna nada y utiliza la siguiente sintaxis: free( direccion ); También se puede usar en vez de malloc() la función new() así: puntero= new tipo_de_dato [n];

19 El mismo programa anterior hecho con new():
int *crear_arreglo_new(int n) { int *p; p= new int[n]; for(int i=0; i<n; i++) p[i]=1; return p; }

20 Recursión Un algoritmo es recursivo si se encuentra definido en términos de sí mismo Es posible que una función se llame a sí misma, para ello basta con invocarse dentro de la función a ella misma y pasarle los argumentos correspondientes. A este tipo de función la denominamos “recursiva”

21 Ejemplo: El factorial de un número N se
define como: Si N  0 entonces: N! =N*(N-1)! Si N=0 entonces: N! =1 Veamos como programar esta función en C++ recursivamente  Es natural hacerlo de manera debido a que la función se define en términos de si misma

22 int factorial(int n) { if(n==0) return 1; else return (n*factorial(n-1)); } void main() { int a; a=factorial(3); Vamos a realizarle un seguimiento manualmente para ver como evoluciona esta función en el Stack…


Descargar ppt "Estructuras de Datos Punteros y algo más."

Presentaciones similares


Anuncios Google