Punteros(PROGRAMACION)
Enviado por cryspy • 1 de Agosto de 2013 • 1.576 Palabras (7 Páginas) • 385 Visitas
PUNTEROS
2
Punteros en C Un puntero es una variable que almacena direcciones de memoria
tipo *puntero; tipo variable; puntero = &variable;
A partir de la última sentencia puntero y variable permiten modificar el valor almacenado en la dirección de memoria ffd0
Un puntero está asociado a un tipo y contiene como valor una dirección
variable
puntero
ffd0
fff0 ffd0
valor
Analista Universitario en Sistemas Taller de Programación II
Instituto Politécnico Superior
3
Punteros en C Como un puntero posee una dirección de memoria esta puede ser asignada a un puntero también tipo **puntero2; puntero2 = &puntero;
Operaciones - Asignarle un valor puntero=direccion puntero=(cast)puntero
el operador & (operador de dirección) retorna la dirección de una variable puntero=&variable
Analista Universitario en Sistemas Taller de Programación II
Instituto Politécnico Superior
4
Operador de desreferencia (*) Es posible modificar el valor de la variable que “apunta” el puntero
int a=10; int *ptra; ptra = &a; *ptra=50;
printf(“%d”, a); > 50 a=100; printf(“%d”, *ptra); > 100
Analista Universitario en Sistemas Taller de Programación II
Instituto Politécnico Superior
5
Pasaje de argumentos por valor y referencia En C, por defecto, los parámetros a una función se pasan por valor Las variables pasadas a una función no son modificadas, en la función se crean variables automáticas con los valores de las variables empleadas en la invocación Las variables automáticas se destruyen al retornar la función
Pasaje por valor int suma_dobles(int a, int b) { //a posee una copia del valor de x, b de y, vars. automáticas a = a*2; // variable local a cambia de valor b = b*2; // variable local b cambia de valor return a+b; } int main() { int x=10, y=20; printf(“Variables x=%d y=%d\n”, x, y); // variables x=10 y=20 suma_dobles(x, y); printf(“Variables x=%d y=%d\n”, x, y); // variables x=10 y=20 // x e y no cambian luego de invocar a suma_dobles return 0; }
Analista Universitario en Sistemas Taller de Programación II
Instituto Politécnico Superior
6
Pasaje de argumentos por valor y referencia Si se emplean direcciones en la invocación a una función, las variables automáticas reciben direcciones (referencias), no valores Toda modificación dentro de la función que altere los valores almacenados en dichas direcciones serán visibles al retornar dicha función Pasaje por referencia int suma_dobles(int *a, int *b) { //a y b son punteros, reciben direcciones *a = (*a)*2; // cambia de valor el lugar de memoria de a *b = (*b)*2; // cambia de valor el lugar de memoria de b return (*a)+(*b); } int main() { int x=10, y=20; printf(“Variables x=%d y=%d\n”, x, y); // variables x=10 y=20 suma_dobles(&x, &y); // se pasan direcciones printf(“Variables x=%d y=%d\n”, x, y); // variables x=20 y=40 //x e y cambiaron luego de invocar a suma_dobles return 0; }
Analista Universitario en Sistemas Taller de Programación II
Instituto Politécnico Superior
7
Aritmética de punteros Los punteros pueden oficiar de operandos para algunos operadores aritméticos
Es posible sumar o restar una constante numérica a un puntero tipo a=valor; tipo *ptra=&a; tipo *ptrb=NULL; ptrb=ptra+Constante; //esto es en realidad ptra+Constante*sizeof(tipo);
También valen ptra = ptra + Constante ptra += Constante (+=) ptra++ (++) Mismas operaciones con (-)
En el contexto de un array o un espacio de memoria dinámicamente obtenido la resta de punteros retorna la cantidad de elementos de tamaño del tipo asociado entre las direcciones que apuntan sendos punteros. Ejemplo.
Analista Universitario en Sistemas Taller de Programación II
Instituto Politécnico Superior
8
Puntero NULL NULL es una constante simbólica que representa un valor especial de dirección de memoria, un valor nulo
NULL está definido en <stdio.h>
Un “puntero NULL” es un puntero con este valor NULL es útil para protegerse del acceso no controlado a memoria int a=10; int *ptra; //Inicializado “apuntando” a alguna dirección *ptra = 5000; //Error: modificación de una dirección de memoria desconocida
Forma correcta int a=10; int *ptra=NULL; Intentar modificar el valor de lo que “apunta” ptra es un error
Es un error desreferenciar un “puntero NULL” Se puede comprobar antes si un puntuero es NULL mediante ptra == NULL ptra != NULL
Analista Universitario en Sistemas Taller de Programación II
Instituto Politécnico Superior
9
Puntero void Es posible asignar directamente un puntero a otro si ambos poseen el mismo tipo
Si los tipos son diferentes debe realizarse una conversión explícita de tipos mediante cast. Sintaxis: (tipo)puntero
El puntero void es un “puntero genérico” capaz de representar cualquier tipo de puntero Todos los tipos de puntero pueden asignarse a un puntero void sin cast, pero un puntero void solo puede asignarse a otro de otro tipo si se emplea cast
Se recibe un error si se desreferencia un puntero void
void *ptrv; int i=5; ptrv=ptri; //OK double d=10.7; ptrv=ptrd; //OK int *ptri=&i; ptrd=ptrv; //Error double *ptrd=&d; ptrd=(double*)ptrv; //OK
Analista Universitario en Sistemas Taller de Programación II
Instituto Politécnico Superior
10
Punteros a string (cadena) En C no existe el tipo string ni se cuenta con operadores para su tratamiento, como un operador de contatenación de cadenas, por ejemplo.
...