1 PUNTEROS Y REFERENCIASIng. Betty Suárez Torres
2
3 INICIALIZACIÓN DE PUNTEROSLa inicialización de un puntero proporciona a ese puntero la dirección del dato correspondiente. Después de la inicialización, se puede utilizar el puntero para referenciar los datos direccionados. Para asignar una dirección de memoria a un puntero se utiliza el operador de referencia &. por ejemplo: &valor significa «la dirección de valor». El método de inicialización (iniciación), también denominado estático, requiere: Asignar memoria (estáticamente) definiendo una variable y a continuación hacer que el puntero apunte al valor de la variable. int i; //define una variable i int *p; //define un puntero a un entero p p = &i; //asigna la dirección de i a p Asignar un valor a la dirección de memoria: *p = 50 El asterisco delante de la variable puntero indica «e/ contenido de de la memoria apuntada por el puntero y será del tipo dado. No se puede liberar la memoria reservada para una variable. El puntero a esa variable se puede cambiar, pero permanecerá la cantidad de memoria reservada. Como se hace para que el puntero? Al colocar o crear un punteros indica que apunta una direccion (p); para saber en contenido de i se tiene que colocar *p (se muestra contenido) ; la inicializacion es abligatoria
4 OPERADOR DE DIRECCIÓN && devuelve la dirección de memoria donde empieza la variable . El operador & se utiliza habitualmente para asignar valores a datos de tipo puntero. int i, *ptri; ptri = &i; i es una variable de tipo entero, por lo que la expresión &i es la dirección de memoria donde comienza un entero y, por tanto, puede ser asignada al puntero ptri. Se dice que ptri apunta o referencia a i. se llama operador de direccion
5 OPERADOR DE INDIRECCIÓN **
6 EJEMPLO #include
7 EJEMPLO Un solo* muestra el valor de memoria de p y no de a por ello tiene que usarse de **q
8 OPERADORES DE PUNTEROS
9 ERRORES COMUNES Asignar puntero de distinto tipo int a=10, *ptri;float b=5.0, *ptrf; ptri = &a; ptrf = &b; ptrf = ptri; // Error en compilación Uso de punteros no inicializados Es un error asignar un valor, a un contenido de una variable puntero si previamente no se ha inicializado con la dirección de una variable, o bien se le ha asignado dinámicamente memoria (malloc / new). Por ejemplo: float* px; *px = 23.5; //error, px no contiene dirección Asignación de valores al puntero y no a la variable. int y=5, *nptr =&y; //CORRECTO nptr = 9; //ERROR
10 #include
11 EJEMPLO #include
12 ARREGLOS Y PUNTEROS Un nombre de un array es simplemente un puntero. Supongamos que se tiene la siguiente declaración de un array: int lista[5] = {10, 20, 30, 40, 50}; 1 2 3 4 10 20 30 40 50 lista + 0 lista[0] (*lista) Para apuntar alos otros valores de una lista se puede usar p++ o p+i; lista + 1 lista[1] lista lista + 2 lista[2] lista + 3 lista[3] lista + 4 lista[4]
13 EJEMPLO int v[0] ; int *p; p = v; (v+4); //apunta al 5" elementop = p+6; //contiene la dirección del 7º elemento A una variable puntero se le puede aplicar el operador ++, o el operador Esto hace que contenga la dirección del siguiente o anterior elemento: float m[20]; float *r; r = m; r++; //contiene la dirección del elemento siguiente
14 PUNTEROS A CADENAS Los punteros se pueden utilizar en lugar de índices de arrays. Ejemplo: char alfabeto [27] = “ABCDEFGHIJKLMNOPQRSTUVWXYZ"; Declaremos ahora p un puntero a char char *p; Se establece que P apunta al primer carácter de alfabeto escribiendo p = &alfabeto[0]; //o también p = alfabeto de modo que si escribe la sentencia printf("%c \n", *p) ; se visualiza la letra A, ya que p apunta al primer elemento de la cadena. Se puede hacer también p = alfabeto[15]; de modo que p apuntará al carácter 16º (la letra Q). Sin embargo, no se puede hacer p = &alfabeto; ya que alfabeto es un array cuyos elementos son de tipo char, y se produciría un error al compilar (tipo de asignación es incompatible).
15 PUNTEROS COMO ARGUMENTOSCuando se pasa una variable a una función (paso por valor) no se puede cambiar el valor de esa variable. Sin embargo, si se pasa un puntero a una variable a una función (paso por direccición) se puede cambiar el valor de la variable. Ejemplo: Considere la siguiente definición de la función incrementar que incrementa una variable en 5. void Incrementar(int *i){ *i += 5; } La llamada a la función será: int i; i = 10; Incrementar(&i) ;
16 EJEMPLO CON STRUCT struct temperatura{ float alta; float baja ; };void registrotemp(struct temperatura *t){ float actual ; leertempactual(actual); if (actual > t -> alta) t - > alta = actual; else if (actual < t -> baja) t -> baja = actual; } La llamada a la función sería: struct temperatura tmp; registrotemp(&tmp);
17 EJEMPLO #include
18 Encuentra los errores en la siguiente declaración de punteros: EVALUACIÓN Encuentra los errores en la siguiente declaración de punteros: int x, *p, &y; char *b = “Cadena larga”; char* c= ‘C’; float x; void *r = &x; &y es de tipo exa decimal;en la dos no inilizamos , no apunta nada, de frente lo estamos declarando; en el siguiente = que la anterior; en la dos ultimas el tipo de dato tiene que ser = al dato que se apunta.