Diferencia entre revisiones de «Punteros»
Ir a la navegación
Ir a la búsqueda
m Protegió «Punteros» ([edit=sysop] (indefinido) [move=sysop] (indefinido)) [en cascada] |
|||
| Línea 13: | Línea 13: | ||
int *q; | int *q; | ||
q = p; | q = p; | ||
*Una buena práctica es inicializar los punteros a NULL | |||
int *p = NULL; | |||
= Operaciones con Vectores = | = Operaciones con Vectores = | ||
Revisión del 14:42 6 mar 2013
Caracteristicas
- Un puntero no es más que una variable estática cuyo contenido es una dirección de memoria
- Para obtener la dirección de memoria de una variable se usa el operador de dirección"&"
int i;
printf("direccion de memoria de la variable: %d", &i);
- Para acceder al contenido de una posición de memoria se utiliza el operador de indirección "*"
- Cuando se define un puntero se hace según un tipo de variable. Ese puntero solo puede apuntar a ese tipo de varaibles
- Los operadores "& y *" tiene mas prioridad que los operadores binarios (+, -, ...)
- Se pueden asignar punteros entre ellos:
int a = 8; int *p = &a; int *q; q = p;
- Una buena práctica es inicializar los punteros a NULL
int *p = NULL;
Operaciones con Vectores
- Podemos manipular la dirección de memoria del puntero
int *p;
int a[10];
p=&a;
printf("%d", *(p+0)); //Primera posicion del vector a ;
printf("%d", *(p+1)); //Segunda posicion del vector a;
- Lo mismo se puede hacer restando
Punteros y Vectores
Todos los vectores son en realidad punteros
int a[10];
int *p;
p = a; //Ahora p puede acceder a las "casillas de a". Se escribe así porque la variable a, es un puntero
//Estos dos printfs son equivalentes
printf("%d", a[0]);
printf("%d", *p);
//Estos dos printfs son equivalentes
printf("%d", a[1]);
printf("%d", *(p+1)); //Sumamos 1 a la dirección de memoria haciendo que p apunte al siguiente elemento del vector
//En este ejemplo vemos que para imprimir un caracter y asignarle un valor lo hacemos normalmente:
char *c;
char b = 'H';
c = &b;
printf("%c", *c); //Cuando se imprime se pone el * para imprimir el dato que hay en la casilla a la cual apunta c.
//Aqui vemos que en una cadena de caracteres las operaciones de imprimir y asignar un valor son diferentes a como se hacen con el caracter y son similares a como se hacen con vectores de cadenas.
//Esto es por lo dicho anteriormente, los vectores de cadena son punteros.
//Estos dos ejemplos son equivalentes, los dos imprimiran Fran
char *cadena;
cadena = "Fran";
printf("%s", cadena);
char cadena2[]="Fran";
printg("%s", cadena2);
//Printfs equivalentes. Estos dos imprimiran F
char cadena[]="Fran";
printf("%c", cadena[0]);
printf("%c", *cadena);
Explicación:
Ejemplo1 Ejemplo2
char cadena2[]="Fran"; == char *cadena = "Fran";
printf("%s", cadena2); == printf("%s", cadena);
Con estos dos ejemplos vemos que cuando se hace la declaracion de una cadena de caracteres y luego se imprime es igual que como se hace con un puntero.
Cuando se imprime un puntero que apunta a un vector lo que se imprime es la primera posicion del vector. Para poder ir recorriendo el vector se le va sumando +1 al contenido de la memoria, asi si va desplazando entre las casillas.
Por tanto cuando ponemos en el printf la cadena lo que hacemos es pasarle al printf la dirección de memoria y con el operador %s indicamos que es un vector de caracteres y que tiene que ir recorriendolo todo.
Sabiendo esto y sabiendo de operaciones de punteros podemos hacer las equivalencias:
char cadena="Fran";
printf("%c", cadena[0]) == printf("%c", *cadena); //Primera posicion del vector
printf("%c", cadena[1]) == printf("%c", *(cadena+1); //Segunda posicion del vector