"Microsoft no es la respuesta. Microsoft es la pregunta. NO es la respuesta" — Erik Naggum
Punteros (¡ay madre!)
Los punteros (todo el mundo tiembla de emoción y a la par cierto recelo) son la base de la potencia de C. Un puntero no es más que una dirección de memoria. Por tanto en arquitecturas de 32 bits, es un número de 32 bits. Este número indica (apunta) a una variable en memoria. Por ejemplo:
Código: Seleccionar todo
int* p;
Estoy diciendo que p es un puntero a un entero. Pero ojo, esto no quiere decir que estemos creando un entero. Sólo estamos creando el puntero (recordad esto bien, es un fallo muy común).
Los vectores/arrays también son punteros, pero con memoria reservada. Es decir, el "hueco" de las variables está reservado por la cantidad que pongamos. Por ejemplo:
Código: Seleccionar todo
char s[10];
es un puntero al primero de los 10 caracteres reservados. Esto es lo mismo que:
Código: Seleccionar todo
char* s = "123456789";
sólo que obviamente en ésta tenemos valores iniciales (también reservados en el caso de inicializar la variable). Esto es más claro si entendemos cómo funcionan las cadenas de caracteres en C.
Código: Seleccionar todo
s -> 1 2 3 4 5 6 7 8 9 \0
Esto nos dice que realmente s apunta al primer carácter, y todos los demás bytes (un char es un byte en C) forman una cadena hasta encontrar un carácter nulo (\0 código 0 en ASCII). Para ilustrar esto:
Código: Seleccionar todo
#include <stdio.h>
int main()
{
char s[10] = "123456789";
printf("La direccion de la cadena en memoria es 0x%X\n", s);
printf("La cadena es %s\n", s);
return 0;
}
Siendo s un puntero, podemos realizar operaciones matemáticas sobre él si lo casteamos como unsigned int (entero sin signo, lo que viene a ser un puntero ).
Código: Seleccionar todo
#include <stdio.h>
int main()
{
char s[10] = "123456789";
int pos = 3;
char* s0 = (char*)(unsigned int) s + pos; // s = s + pos
printf("El carácter en posición %d es %c\n", pos, *s0);
printf("La cadena es %s\n", s);
return 0;
}
Veis que uso *s0 para indicar la variable a la que apunta el puntero (en este caso un char). El proceso inverso, es decir, obtener la dirección de una variable se hace con el operador &.
Código: Seleccionar todo
#include <stdio.h>
int main()
{
int a = 10;
int* p = &a;
printf("La dirección de memoria del entero a es 0x%X\n", p);
printf("El valor de a es %d\n", *p);
// Y sumamos 2
a = *p + 2;
printf("La dirección de memoria del entero a es 0x%X\n", &a);
printf("El valor de a es %d\n", a);
return 0;
}
Luego seguiré con más punteros, pero por ahora unos problemillas para relajarse la mente
- Imprimir cada carácter de una cadena de caracteres, recorriendo la cadena usando punteros y recursividad
- Igual que el anterior pero imprimiendo la cadena al revés
¡Suerte y a darle al coco!
<< Anterior Siguiente >>