22 de septiembre de 2016

Apuntadores y arreglos.

   Los apuntadores son variables especiales pero variables finalmente, ¿será posible entonces crear un arreglo de apuntadores? La respuesta es sí, de hecho, los arreglos de apuntadores son de lo más común en los programas en C.

   El Ejemplo 7.5 muestra en la línea 9 un arreglo de apuntadores a char de nombre codigoMorse. Observe que dicho arreglo es inicializado en tiempo de compilación y que cada elemento del arreglo hace referencia a una cadena o arreglo de caracteres.

Representación del arreglo de apuntadores codigoMorse del Ejemplo 7.5.
 
    La figura anterior muestra la representación del arreglo de apuntadores definido en la línea 9 del Ejemplo 7.5. Note cómo cada elemento de codigoMorse hace referencia a cadenas de diferente longitud correspondientes al código Morse de cada una de las letras del alfabeto inglés (se ha hecho así para no tener que lidiar con aspectos irrelevantes a los arreglos de apuntadores, como el código de la letra “ñ" por ejemplo). Observe también que en las primeras dos representaciones de la figura anterior (correspondientes a los índices 0 y 1 respectivamente del arreglo de apuntadores codigoMorse), se ha hecho explícito el almacenamiento de arreglo de caracteres para los apuntadores correspondientes, mientras que para las siguientes la representación de cadenas se ha puesto entre comillas dobles.

   El ciclo for de la línea 15 resulta peculiar pero es un ejemplo clave de la versatilidad del lenguaje de programación C. Note cómo la variable de control letra es de tipo char y cómo letra es inicializada con el símbolo 'a' en la expresión de inicialización del ciclo; letra se utilizará para recorrer el alfabeto (letra++) mientras no se llegue al símbolo 'z' (letra <= 'z') como lo indica la expresión condicional.

   Lo último que resta por explicar es la expresión de la línea 16:

codigoMorse[letra - 'a']

aquí letra es inicialmente 'a', así que:
'a' - 'a' =  0
'b' - 'a' =  1
    .
    .
    .
'z' - 'a' = 25

   Si comprendió la explicación quizá esté sorprendido y la respuesta a su posible interrogante es sí: C puede restar letras. En realidad está restando los códigos de los símbolos respectivos, pero es mejor dejarle los detalles de los códigos subyacentes al compilador que tener que lidiar con los códigos de cada símbolo (lo cual además de ser un mejor enfoque de abstracción que utilizar números mágicos, hace que el código sea más portable al no depender de códigos de tipo ASCII (American Standard Code for Information Interchange), UTF (Unicode Transformation Format), etc.).

   La salida del Ejemplo 7.5 se muestra en la siguiente figura :

Salida del Ejemplo 7.5.