Cap 1.Conceptos Básicos de C

download Cap 1.Conceptos Básicos de C

of 12

Transcript of Cap 1.Conceptos Básicos de C

  • 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...