Según lo analizado en el capítulo 2, los datos básicos de C son caracteres, números enteros y números reales. Además, en la redacción de los programas C se pueden utilizar los siguientes tipos de datos: tablas, demostrativos, estructuras, texturas y enumerados. Por otro lado, mientras que en lenguajes como el PASCAL de alto nivel se pueden definir nuevos tipos de datos, C no lo admite, aunque la expresión typedef permite definir sinónimos de tipos de datos. Por tanto, en este capítulo y en el siguiente expondremos la definición y utilización de los tipos de datos y sinónimos mencionados.
La tabla es la estructura de datos más utilizada en cualquier lenguaje. Las palabras vector, matriz, array, cadena y string se utilizan como sinónimo de tabla, aunque en ocasiones no son subtipos de tabla.
La tabla está formada por un conjunto de variables del mismo tipo que se guardan y se conocen con el mismo nombre. La tabla puede tener una o varias dimensiones, denominadas en el primer caso vectores. Las bidimensionales se denominan matrices y mientras se utiliza un índice para identificar los componentes dentro del vector, en las matrices se utilizarán dos índices.
Cuando los componentes de la tabla son caracteres, la tabla se llama cadena de caracteres, cadena o string, con características diferentes.
El tipo de datos de los componentes para la definición de las tablas, el nombre de la tabla y el número de componentes deben especificarse en el rango. En el uso sólo se menciona el nombre de la tabla para referirse al cuadro completo. Para expresar un componente, por el contrario, hay que mencionar el nombre y el índice entre los mapas. El índice indica la posición dentro de la tabla del componente, pero mientras que en la mayoría de los lenguajes el rango de valor del índice es desde uno hasta el número de componentes (N), en C se utiliza desde cero (N-1). Hay que tener en cuenta que el índice que se determina en el rango puede ser cualquier expresión completa; constante, variable o combinación aritmética entre ellas.
En el programa 1 se puede ver un ejemplo en el que tras leer las ventas de 12 meses en una tabla se calcula e imprime la venta anual y los porcentajes mensuales. Para leer la tabla se utilizará una función que definiremos en el programa 3.
En la definición se puede llevar a cabo la inicialización de las tablas, separando los valores de los componentes por comas y definiendo al principio y al final de las mismas. Por ejemplo, la definición de la tabla que indica el número de días que tiene cada mes sería:
int hil-egun [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 31, 31, 30, 30, 31, 31, 31};
Si no hay nada se inicializan las tablas con ceros.
Como se ha dicho, cuando se utiliza el nombre de una tabla sin índice se hace referencia a la tabla completa, pero esto no significa el valor de todos los componentes, sino la referencia del lugar donde se sitúa la tabla en la memoria. Este concepto es el mismo que el del expositor y por eso se dice que cuando se utiliza el nombre de la tabla especificamos su índice. Por este mismo motivo, la asignación o asignación entre las dos tablas también se realiza como componente. No se puede realizar con una simple asignación.
No obstante, aunque existe una gran tendencia a utilizar tablas, los demostradores se pueden utilizar con todo tipo de datos. Los demostrativos son variables, por lo que deben definirse y ubicarse en memoria, ocupando parte de la memoria. Los demostrativos pascales, aunque deben definirse, no incluyen partes de memoria, ya que son dinámicos, pero como C son estáticos, para la definición se utiliza el carácter especial *.
El demostrador (pointer en inglés) indica la dirección de la memoria de un dato y siempre se coloca en cuatro bytes. En la definición se debe especificar el tipo de datos que muestra, * y el nombre de la variable de índice.
Para su uso se utilizan * y agentes. * Mientras que * tiene la misma función que el operador de Pascal (valor de la variable mostrada por el demostrador), se especifica frente a variables no expositoras para referirse a su referencia (o dirección) y no al valor (o contenido).
En el programa 2 se define una función de intercambio de valores entre ambas variables. Ambos parámetros son datos y resultados simultáneamente. Por tanto, no se puede canjear por valor sino por referencia (como en cualquier otro lenguaje).
Hay que tener especial cuidado cuando los expositores participan en operaciones aritméticas, ya que la unidad a la que se añade o elimina es la longitud de la variable mostrada en lugar de ser una.
Por ello en la siguiente parte del programa
La variable p1 (longitud de un carácter) se suma a p2 dos y p3 cuatro (longitud de las variables long). Por otro lado, se admiten sumas y restas entre expositores cuando los tipos de datos mostrados son los mismos.
En el primer programa no hemos definido la función 'tabla de lectura'. Como su primer parámetro es la tabla, existen dos opciones para la determinación del parámetro: como array o como índice, tal y como se puede observar en los programas 3 y 4 (ambos equivalentes).
Hay que tener en cuenta las siguientes diferencias:
Una cadena de caracteres o string, es una tabla con el carácter especial ‘\Ø’ formado por caracteres al final. Las diferencias con el resto de tablas son:
En los programas 5 y 6 se explica la función de calcular el número de veces que un carácter aparece en una cadena.
Por ejemplo
,int matriz [1Ø] [10]; /* 1Ø ilad1Ø columna*/
Ejemplo: int r, *p, **q; r = 1Ø p = r; /* *p = 1Ø */ q = p /* **q = 1Ø */