Tutorial de Apuntadores y Arreglos en C - Cimat

Tutorial de Apuntadores y Arreglos en C - Cimat Tutorial de Apuntadores y Arreglos en C - Cimat

17.05.2013 Views

void show_name(struct tag *p) { } printf("\n%s ", p -> nombre); /* p apunta a una estructura */ printf("%s ", p -> apellido); printf("%d\n", p -> edad); De nuevo, esta es mucha información para absorber de una sola vez. Sugiero al lector compilar y ejecutar los programas y de ser posible usar un depurador (debugger) para ver el estado de las variables ejecutando el programa paso por paso a través de la función principal (main()) y siguiendo el código hasta la función show_name() para ver que es lo que sucede. 22

CAPITULO 6: MÁS SOBRE CADENAS Y ARREGLOS DE CADENAS Bien, regresemos con las cadenas. En lo consiguiente todas las declaraciones se entenderán como hechas globalmente. Es decir, son hechas fuera de cualquier función, incluyendo main(). Habíamos dicho en un capítulo anterior que podíamos hacer: char mi_nombre[40] = "Ted"; Con lo cual reservaríamos espacio para alojar un arreglo de 40 bytes y colocar la cadena dentro de los primeros 4 bytes del arreglo (3 para los caracteres entre comillas y uno más para ‘\0’) Si realmente sólo quisiéramos un arreglo donde alojar el nombre “Ted”, podemos hacer: char mi_nombre[] = "Ted"; Y el compilador contaría los caracteres, dejando espacio para el caracter de terminación nul y entonces guardará un total de 4 caracteres en la memoria, la dirección de la cual sería regresada por el nombre del arreglo, en este caso mi_nombre. En ocasiones, en lugar de código como el de arriba encontraremos: char *mi_nombre = "Ted"; Lo cual es una declaración alterna. ¿Existe alguna diferencia entre ellas? La respuesta es… si. Usando la notación de arreglo 4 bytes de almacenamiento en el bloque de memoria estática son tomados, uno para cada caracter y uno para el caracter de terminación nul. Pero en la notación de apuntador los mismos 4 bytes son requeridos más N bytes para alojar la variable apuntadora mi_nombre (donde N depende del sistema pero es usualmente un mínimo de 2 bytes y pueden ser 4 o más). En la notación de arreglo, “mi_nombre” es la forma corta de &mi_nombre[0] lo cual es la dirección del primer elemento del arreglo. Ya que la dirección en que se alojará el arreglo será fijada durante el tiempo de ejecución del programa, esto es una constante (no una variable). En la notación de punteros, mi_nombre es una variable. Decidir el método a utilizar y cual es el mejor depende de lo que se vaya a hacer en el resto del programa. Vayamos ahora un paso más adelante y consideremos que pasaría si cada una de estas declaraciones fueran hechas dentro de una función, de manera opuesta a lo global que es fuera de los dominios de cualquier función: 23

void show_name(struct tag *p)<br />

{<br />

}<br />

printf("\n%s ", p -> nombre); /* p apunta a una estructura */<br />

printf("%s ", p -> apellido);<br />

printf("%d\n", p -> edad);<br />

De nuevo, esta es mucha información para absorber <strong>de</strong> una sola vez. Sugiero al lector compilar y ejecutar los<br />

programas y <strong>de</strong> ser posible usar un <strong>de</strong>purador (<strong>de</strong>bugger) para ver el estado <strong>de</strong> las variables ejecutando el<br />

programa paso por paso a través <strong>de</strong> la función principal (main()) y sigui<strong>en</strong>do el código hasta la función<br />

show_name() para ver que es lo que suce<strong>de</strong>.<br />

22

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!