El programador mantiene una barra de
herramientas en la parte superior, una línea de entrada en la parte
inferior, y una zona intermedia donde se visualiza, de izquierda a
derecha, el árbol de variables, la representación de la memoria
o el diagrama de variables, y finalmente, el histórico de sentencias
introducidas.
No solo es posible crear variables de estos tipos,
sino además punteros a las mismas.
Un ejemplo introductorio sería el
siguiente. Introduzca las siguientes sentencias en el programa:
El puntero se representa de manera muy
similar a la variable, sólo que en su tipo aparecerá
int
* en lugar de
int. Finalmente, una flecha
aparecerá uniendo las cajas del puntero y de la variable. En caso de
que el puntero tenga valor nulo (NULL o 0), entonces la flecha
aparecerá apuntando a una toma de tierra.
Se puede utilizar la función
printf() para mostrar un valor. Por ejemplo,
tecleando:
printf( *ptr )
Se imprimirá el valor de la variable
a (5) en la salida
(output) inferior.
Punteros
Como ya se ha explicado, los punteros se crean de la misma forma que se
crean en C. Pueden ser inicializados utilizando la dirección de una
variable existente, o incluso una constante en hexadecimal o decimal. Dado
el siguiente código;
int a = 5
int b = 6
int * ptr = &a
El valor del puntero
ptr debe ser el mismo que la dirección
de la variable apuntada,
a (que aparece entre corchetes en la
parte superior de su caja). Ahora es posible realizar cambios sobre la
variable
a sin utilizarla directamente, como por ejemplo:
*ptr = 3
printf( a )
El código anterior imprimirá 3 en la salida inferior.
Referencias
Aunque no son propias de C, sino de C++,
C-Sim soporta
también el uso de referencias, que interpreta como punteros especiales.
Estos punteros no precisan de la sintaxis habitual (asterisco) para acceder al
valor apuntado, y de hecho impersonan a la variable apuntada incluso cuando se
trata de obtener su dirección.
int a = 5
int &ref = a
ref = 7
int * ptr = &ref
printf( *ptr )
El código anterior imprimirá 7 en la salida inferior.
Comprensión del manejo de memoria con punteros
Los punteros guardan dos informaciones valiosas dentro de sí: la
dirección a la que apuntan, y el tipo al que pertenecen. Lo segundo sirve
para saber cuántos bytes de memoria manejar cuando se accede a la
dirección.
int a = 5
char ch = 'a'
int * ptr = 90
printf( ch )
printf( *ptr )
En el ejemplo más arriba, si en lugar de la tercera instrucción se
intentara
int * ptr = &ch, esta no
funcionaría, pues un puntero a entero no puede apuntar a un puntero a
char.
Sin embargo, en el ejemplo se fuerza esta circunstancia, asignándole
directamente a
ptr la dirección de memoria que ocupa
ch
mediante una constante numérica. A pesar de que el puntero apunta a un
caracter, como debe tomar 4 bytes para un entero (en un arquitectura de 32
bits), toma el primer byte con el valor 65 (la A mayúscula) y los tres
siguientes bytes, que no se sabe lo que contienen. Así, el valor impreso
para
*ptr y
ch no coincide.