Post on 10-Oct-2015
ltima modificacin 28/03/2007 09:24
CAPITULO 1
Conceptos bsicos de C
Identificadores, palabras reservadas, separadores y comentarios
Un identificador es una secuencia de letras o dgitos donde el primer elemento debe ser una letra, o los
caracteres _ y $. Las letras maysculas y minsculas se consideran distintas. Los identificadores son los
nombres que se utilizan para representar variables, constantes, tipos y funciones de un programa. El
compilador slo reconoce los 32 primeros caracteres del identificador, pero ste puede ser de cualquier
tamao.
El lenguaje C distingue entre letras maysculas y minsculas. Por ejemplo, el identificador valor es
distinto a los identificadores VALOR y Valor
Las palabras reservadas son identificadores predefinidos que tienen un significado especial para el
compilador de C. Las palabras claves siempre van en minsculas. En la Tabla 1.1 se recogen las palabras
reservadas segn ANSI C, que es la definicin estandarizada del lenguaje C creada por el Instituto
Nacional Americano de Estndares (ANSI).
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
Pgina 1 de 12page_04 OCW UNED
17/09/2014http://ocw.innova.uned.es/ocwuniversia/Ing_tecnico_infor_sistemas/SO_II/contenidos...
co if static while
Tabla 1.1: Palabras reservadas segn el estndar ANSI C
El lenguaje C tambin utiliza una serie de caracteres como elementos separadores: {,},[,],(,),;,->,..
En C es posible escribir comentarios como una secuencia de caracteres que se inicia con /* y termina con
*/. Los comentarios son ignorados por el compilador.
Constantes
Las constantes se refieren a valores fijos que no se pueden alterar por el programa. El lenguaje C tiene
cuatro tipos bsicos de constantes:
1. Enteras. Es un nmero con un valor entero, consistente en una secuencia de dgitos. Las constantes enteras se pueden escribir en tres sistemas numricos distintos: decimal, octal y hexadecimal.
2. En coma flotante. Es un nmero decimal que contiene un punto decimal o un exponente (o ambos).3. De carcter. Es un slo carcter encerrado con comillas simples.4. De cadenas de caracteres. Consta de cualquier nmero de caracteres consecutivos encerrados entre
comillas dobles.
Se denomina secuencia de escape a una combinacin de caracteres que comienza siempre con una barra
inclina hacia atrs \ y es seguida por uno o ms caracteres especiales. Una secuencia de escape siempre
representa un slo carcter , an cuando se escriba con dos o ms caracteres. En la Tabla 1.2 se listan las
secuencias de escape utilizadas ms frecuentemente:
Carcter Secuencia de escape
Sonido (alerta) \a
Tabulador horizontal \t
Tabulador vertical \v
Nueva lnea \n
Comillas \"
Comilla simple \'
Barra inclinada hacia atrs \\
Pgina 2 de 12page_04 OCW UNED
17/09/2014http://ocw.innova.uned.es/ocwuniversia/Ing_tecnico_infor_sistemas/SO_II/contenidos...
Signo de interrogacin \?
Nulo \0
Tabla 1.2: Secuencias de escape
1. Ejemplo 1.2:
0 1 743 5280 32767 9999 (Constantes enteras decimales)
0x 0X 0X7FFF 0xabcd (Constantes enteras hexadecimales)
0.1 1.0 827.602 2E-8 1.666E12 (Constantes en coma flotante)
'A' 'X' '?' ' ' 'd' (Constantes de carcter)
"Verde" "La respuesta correcta es" (Constantes de cadena de caracteres)
Las constantes se declaran colocando el modificador constdelante del tipo de datos. Otra forma de definir
constantes es usando la directiva de compilacin #define.
1. Ejemplo 1.3:
La siguiente sentencia declara la constante MAXIMO de tipo entero que es inicializada al valor 9.
const int MAXIMO=9;
Otra forma equivalente de declararla es con la sentencia:
#define MAXIMO 9
Esta sentencia se ejecuta de la siguiente forma: En la fase de compilacin al ejecutar #define el
compilador sustituye cada aparicin de MAXIMO por el valor 9. Adems no se permite asignar ningn
valor a esa constante . Es importante darse cuenta que esta declaracin no acaba en punto y coma ';'
Variables
Una variable es un identificador que se utiliza para representar cierto tipo de informacin dentro de una
determinada parte del programa. En su forma ms sencilla, una variable es un identificador que se utiliza
para representar un dato individual; es decir, una cantidad numrica o una constante de carcter. En
alguna parte del programa se asigna el dato a la variable. Este valor se puede recuperar despus en el
programa simplemente haciendo referencia al nombre de la variable.
A una variable se le pueden asignar diferentes valores en distintas partes del programa. De esta forma la
informacin representada puede cambiar durante la ejecucin del programa. Sin embargo, el tipo de datos
asociado a la variable no puede cambiar.
Pgina 3 de 12page_04 OCW UNED
17/09/2014http://ocw.innova.uned.es/ocwuniversia/Ing_tecnico_infor_sistemas/SO_II/contenidos...
Las variables se declaran de la siguiente forma:
tipo nombre_variable;
Donde tiposer un tipo de datos vlido en C con los modificadores necesarios y nombre_variable ser el
identificador de la misma.
Las variables se pueden declarar en diferentes puntos de un programa:
1. Dentro de funciones. Las variables declaradas de esta forma se denominan variables locales.2. En la definicin de funciones. Las variables declaradas de esta forma se denominan parmetros formales.3. Fuera de todas las funciones. Las variables declaradas de esta forma se denominan variables globales.
La inicializacin de una variable es de la forma:
nombre_de la variable= constante;
Donde constantedebe ser del tipo de la variable.
1. Ejemplo 1.4:
/*Declaracin de variables*/
char letra;
int entero;
float real;
/*Inicializacin de variables*/
letra='a'; /*Se usan comillas simples*/
entero=234;
real =123.333;
Tipos fundamentales de datos
En el lenguaje C se consideran dos grandes bloques de datos:
1. Tipos fundamentales: que son suministrados por el lenguaje.2. Tipos derivados, que son definidos por el programador.
Los tipos fundamentales se clasifican en:
1. Tipos enteros. Se utilizan para representar subconjuntos de los nmeros naturales y enteros.2. Tipos reales. Se emplean para representar un subconjunto de los nmeros racionales.3. Tipo void. Sirve para declarar explcitamente funciones que no devuelven ningn valor. Tambien sirve
para declarar punteros genricos.
1. Tipos enteros
Pgina 4 de 12page_04 OCW UNED
17/09/2014http://ocw.innova.uned.es/ocwuniversia/Ing_tecnico_infor_sistemas/SO_II/contenidos...
Se distinguen los siguientes tipos enteros:
1. char. Define un nmero entero de 8 bits. Su rango es [-128, 127]. Tambin se emplea para representar el conjunto de caracteres ASCII (Cdigo Estndar Americano para el Intercambio de Informacin).
2. int. Define un nmero entero de 16 o 32 bits (dependiendo del procesador).3. long. Define un nmero entero de 32 o 64 bits.4. short. Define un nmero entero de tamao menor o igual que int. En general se cumple que: tamao
(short) ( tamao(int) ( tamao(long).
Los cuatro primeros tipos pueden ir precedidos del modificador unsigned que indica que el tipo slo
representa nmeros positivos o el cero.
1. Ejemplo 1.5:
int numero=3;
char letra='c';
unsigned short contador=0;
Con las anteriores sentencias se han declarado la variable numero de tipo int inicializada a 3, la variable
letra de tipo char inicializado a 'c' y la variable contador de tipo unsigned short inicializado a 0.
2. Tipos reales
Se distinguen los siguientes tipos reales:
1. float. Define un nmero en coma flotante de precisin simple. El tamao de este tipo suele ser de 4 bytes (32 bits).
2. double. Define un nmero en coma flotante de precisin doble. El tamao de este tipo suele ser de 8 bytes (64 bits). Este tipo puede ir precedido del modificador long, que indica que su tamao pasa a ser de 10 bytes.
3. Ejemplo 1.6:
float ganancia=125.23;
double diametro=12.3E53;
Con las anteriores sentencias se han declarado la variable ganancia de tipo float inicializada a 125.3 y la
variable diametro de tipo double inicializada a '12.3E53'.
Tipos derivados de datos
Los tipos derivados se construyen a partir de los tipos fundamentales o de otros tipos derivados. Se van a
describir las caractersticas de los siguientes: arrays, punteros, estructuras y uniones.
3. Arrays
Un array es una coleccin de variables del mismo tipo que se referencian por un nombre comn. El
compilador reserva espacio para un array y le asigna posiciones de memoria contiguas. La direccin ms
baja corresponde al primer elemento y la ms alta al ltimo. Se puede acceder a cada elemento de un
Pgina 5 de 12page_04 OCW UNED
17/09/2014http://ocw.innova.uned.es/ocwuniversia/Ing_tecnico_infor_sistemas/SO_II/contenidos...
array con un ndice. Los ndices, para acceder al array, deben ser variables o constantes de tipo entero. Se
define la dimensin de un array como el total de ndices que necesitamos para acceder a un elemento
particular del array.
La definicin formal de una array N-dimensional es la siguiente:
tipo_array nombre_array [rango1] [rango1]... [rangoN];
A los arrays unidimensionales se les denomina vectores, y a los bidimensionales se les denomina matrices.
A los arrays unidimensionales de tipo char se les denomina cadena de caracteres, y a los arrays de
cadenas de caracteres (matrices de caracteres) se les denomina tablas.
Para indexar los elementos de un array, se debe tener en cuenta que los ndices deben variar entre 0 y
M-1, donde M es el tamao de la dimensin a la que se refiere el ndice.
1. Ejemplo 1.7:
La declaracin de una variable denominada matriz_A de nmeros de tipo float de dos filas y dos columnas
sera de la siguiente forma:
float matriz_A[2][2];
La declaracin de una variable denomina X que es un vector de 4 nmeros de tipo int sera de la siguiente
forma:
int X[4];
Para el vector X anteriormente declarado, el ndice variar entre 0 y 3: X[0], X[1], X[2], X[3];
4. Punteros
Un puntero es una variable que es capaz de guardar una direccin de memoria, dicha direccin es la
localizacin de otra variable en memoria. As, si una variable A contiene la direccin de otra variable B
decimos que A apunta a B, o que A es un puntero a B.
Los punteros se definen en base a un tipo fundamental o a un tipo derivado. La declaracin de un puntero
se realiza de la siguiente forma:
tipo_base *puntero;
Los punteros una vez declarados contienen un valor desconocido. Si se intenta usar sin inicializar
podemos incluso daar el sistema operativo. La forma de inicializarlos consiste en asignarles una
direccin conocida.
Existen dos operadores que se utilizan para trabajar con punteros:
1. El operador &, da la direccin de memoria asociada a una variable y se utiliza para inicializar un puntero.
2. El operador *, se utiliza para referirse al contenido de una direccin de memoria.
Pgina 6 de 12page_04 OCW UNED
17/09/2014http://ocw.innova.uned.es/ocwuniversia/Ing_tecnico_infor_sistemas/SO_II/contenidos...
3. Ejemplo 1.8:
Supngase la siguiente sentencia
int *z;
Se trata de la declaracin de la variable puntero z, que contiene la direccin de memoria de un nmero de
tipo int.
Supngase ahora las siguientes tres sentencias:
int z, *pz;
pz=&z;
*pz=25;
La primera sentencia est declarando un variable z de tipo entero y una variable puntero pz que contiene
la direccin de una variable de tipo int.
La segunda sentencia, inicializa la variable puntero pz a la direccin de la variable z.
Por ltimo la tercera sentencia es equivalente a la sentencia 'z=25;'. A travs de pz se puede modificar de
una forma indirecta el valor de la variable z.
En la Figura 1.2 se representa la relacin entre el puntero pz y la variable z.
Figura 1.2:Relacin entre el puntero pz y la variable z
El acceso a una variable a travs de un puntero se conoce tambin como indireccin. Obviamente antes
de manipular el contenido de un puntero hay que inicializar el puntero para que referencie a la direccin
de dicha variable.
En general no tiene sentido asignar un valor entero a una variable puntero. Pero una excepcin es la
asignacin de 0, que a veces se utiliza para indicar condiciones especiales. En tales situaciones, la
prctica recomendada es definir una constante simblica NULL que representa el valor 0 y usar NULL en
la inicializacin del puntero. Un ejemplo de esta forma de inicializacin es
#define NULL 0
float *pv=NULL;
Por otra parte, los punteros admiten las operaciones de incremento, decremento, suma de una constante
entera y diferencia de punteros. Al realizar estas operaciones se est modificando la direccin a la que
apunta el puntero.
Pgina 7 de 12page_04 OCW UNED
17/09/2014http://ocw.innova.uned.es/ocwuniversia/Ing_tecnico_infor_sistemas/SO_II/contenidos...
Los punteros son usados frecuentemente en C ya que tienen una gran cantidad de aplicaciones. Por
ejemplo, pueden ser usados para transvasar informacin entre una funcin y sus puntos de llamada. En
particular proporcionan una forma de devolver varios datos desde una funcin a travs de los argumentos
de una funcin. Los punteros tambin permiten que referencias a otras funciones puedan ser
especificadas como argumentos de una funcin. Esto tiene el efecto de pasar funciones como argumentos
de una funcin dada.
Los punteros estn muy relacionados con los arrays y proporcionan una va alternativa de acceso a los
elementos individuales del array. Se puede acceder a cualquier posicin del array usando el nombre y el
ndice (indexacin) o bien con un puntero y la aritmtica de punteros.
En general, el nombre de un array es realmente un puntero al primer elemento de ese array. Por tanto, si
x es un array unidimensional, entonces la direccin al primer elemento del array se puede expresar tanto
como &x[0] o simplemente como x. Adems la direccin del segundo elemento del array se puede escribir
tanto como &x[1] o como (x+1), y as sucesivamente. En general, la direccin del elemento (i+1) de la
formacin se puede expresar bien como &x[i] o como (x+i).
1. Ejemplo 1.9:
float vector[5];
float *p=vector; /*Inicializacin del puntero*/
*p=10.2; /*Esta sentencia equivale a vector[0]=10.2*/
p=p+3;
*p=0.5 ; /*Esta sentencia equivale a vector[3]=0.5*/
El anterior conjunto de sentencias muestra como es posible acceder a los elementos del array vector que
consta de 5 elementos a travs del puntero p.
Indicar que otra forma de inicializacin del puntero p es usando la direccin de la primera posicin del
array
float p=&vector[0];
5. Estructuras
Una estructura es un agregado de tipos fundamentales o derivados que se compone de varios campos. A
diferencia de los arrays, cada elemento de la estructura puede ser de un tipo diferente. La forma de
definir una estructura es la siguiente:
struct nombre_estructura
{
tipo1 campo1;
Pgina 8 de 12page_04 OCW UNED
17/09/2014http://ocw.innova.uned.es/ocwuniversia/Ing_tecnico_infor_sistemas/SO_II/contenidos...
tipo2 campo2;
...
tipoN campoN;
}
Para acceder a los campos de una estructura se utiliza el operador '.'.
Es posible declarar:
1. Arrays de estructuras.
2. Punteros a estructuras. En este caso, el acceso a los campos de la variable se hace por medio del
operador '->'.
Adems, puesto que el tipo de cada campo de una estructura puede ser un tipo fundamental o derivado,
tambin puede ser otra estructura. Con lo que es posible declarar estructuras dentro de estructuras.
1. Ejemplo 1.10:
struct cliente{
int cuenta;
char nombre[100];
unsigned short dia;
unsigned short mes;
unsigned int ao;
float saldo;
}
struct cliente uno;
La variable uno es una variable declarada del tipo struct cliente. Con la sentencia
uno.cuenta=12530;
Se est asignando al campo cuenta de la estructura uno el valor 12530.
1. Ejemplo 1.11:
Sea la siguiente declaracin de una estructura
struct
{
Pgina 9 de 12page_04 OCW UNED
17/09/2014http://ocw.innova.uned.es/ocwuniversia/Ing_tecnico_infor_sistemas/SO_II/contenidos...
float real, imaginaria;
} vectorC[5];
La variable vectorC es un array unidimensional de nmeros complejos. Para modificar la parte real del
elemento 2 (recurdese que loe elementos de un array se comienzan a numerar por el 0), se escribe la
sentencia:
vectorC[1].real=0.23;
1. Ejemplo 1.12:
Supngase ahora la siguiente declaracin de una estructura:
struct altura
{
char nombre[100];
float h;
};
struct altura persona, *p;
p=&persona;
p->h=1.65;
El puntero p apunta a la estructura persona del tipo altura Con la ltima sentencia se est asignando al
campo h de la estructura persona el valor 1.65. Esa sentencia es equivalente a
persona.h=1.65;
1. Ejemplo 1.13:
Un ejemplo de una estructura declarada dentro de una estructura sera:
struct fecha
{
int da, mes, ao;
}
struct alumno
{
Pgina 10 de 12page_04 OCW UNED
17/09/2014http://ocw.innova.uned.es/ocwuniversia/Ing_tecnico_infor_sistemas/SO_II/contenidos...
char nombre[100];
struct fecha fecha_nacimiento;
float nota;
};
struct alumno alumno;
6. Uniones
Las uniones se definen de forma parecida a las estructuras y se emplean para almacenar en un mismo
espacio de memoria variables de distintos tipos. La declaracin de una unin es la siguiente:
union nombre_unin
{
tipo1 campo1;
tipo2 campo2;
...
tipoN campoN;
};
El tamao de la unin va a ser igual al tamao del mayor de sus campos.
1. Ejemplo 1.14:
union multiuso
{
float numeroR;
int numeroZ;
char letra;
};
Con la variable multiuso se pueden hacer las siguientes asignaciones:
multiuso.numeroR=0.1235;
multiuso.numeroZ=-225;
multiuso.letra='j';
Pgina 11 de 12page_04 OCW UNED
17/09/2014http://ocw.innova.uned.es/ocwuniversia/Ing_tecnico_infor_sistemas/SO_II/contenidos...
7. Alias para los nombres de tipo
Es posible hacer que un identificador sea considerado el nombre de un nuevo tipo, para ello hay que
emplear la palabra clave typedef, con ella es posible actuar sobre cualquier tipo fundamental o derivado.
1. Ejemplo 1.15:
typedef int entero;
entero y;
Con la definicin de entero como sinnimo de int, es posible declarar variables de tipo entero.
Pgina 12 de 12page_04 OCW UNED
17/09/2014http://ocw.innova.uned.es/ocwuniversia/Ing_tecnico_infor_sistemas/SO_II/contenidos...