Вы находитесь на странице: 1из 17

UNIVERSIDAD DEL SOCONUSCO

CLAVE SEP 07PSU0052L

Material Autoinstruccional

Materia: Estructura de Datos

TAPACHULA DE CRDOVA Y ORDEZ, CHIAPAS.

Competencia especfica: Representar y aplicar las diferentes formas de declarar variables y constantes y soluciones con punteros, mediante un programa en lenguaje c. 1 MANEJO DE MEMORIA 1.1. Memoria esttica.

1.1.1. Constantes 1.1.2. Variables 1.2. Memoria dinmica

1.2.1. PunterosMEMORIA ESTTICA

Variables Todas las variables en C se declaran o definen antes de que sean utilizadas. Una declaracin indica el tipo de una variable. Si la declaracin produce tambin almacenamiento (se inicia), entonces en una definicin.

Nombres de variables en C Los nombres de variables en C constan de letras, nmeros y carcter subrayado. Pueden ser maysculas o minsculas o una mezcla de tamaos. El tamao de la letra es significativo. Las variables siguientes son todas diferentes. Temperatura TEMPERATURA temperatura A veces se utilizan caracteres subrayados y mezcla de maysculas y minsculas para aumentar la legibilidad: Dia_de_Semana int x; DiaDeSemana Nombre_ciudad PagaMes

//declara x variable entera

char nombre, conforme; //declara nombre, conforme de tipo char int x =, no = 0; float total = 42.125 //definen las variables x y no //define la variable total

Se pueden declarar variables mltiples del mismo tipo de dos formas:

As una declaracin int v1; int v2; int v3; int v4;

o bien int v1; int v2; int v3; int v4;

pudindose declarar tambin de la forma siguiente: int v1, int v2, int v3, int v4; C, no soporta tipos de datos lgicos, pero mediante enteros se pueden representar: 0, significa falso; distinto de cero, significa verdadero (cierto).

Constantes La palabra reservada const permite definir determinadas variables con valores constantes, que no se pueden modificar. As, si se declara const int z = 4350 y si se trata de modificar su valor z = 3475 el compilador emite un mensaje de error similar a Cannot modify a const object in function main (No se puede modificar un objeto const en la funcin main). Las variables declaradas como const pueden recibir valores iniciales, pero no pueden modificarse su valor con otras sentencias.

Variables tipo char Las variables de tipo char (carcter) pueden almacenar caracteres individuales. Por ejemplo la definicin: char car = M; declara una variable car y le asigna el valor ASCII del carcter M. El compilador convierte la constante carcter M en un valor entero (int), igual al cdigo ASCII de M que se almacena a continuacin en el byte reservado para car. Dado que los caracteres literales se almacenan internamente como valores int, se puede cambiar la lnea. char car; por int car; y el programa funcionar correctamente

Constantes de cadena Las cadenas de caracteres constan de cero o ms caracteres separados por dobles comillas. La cadena se almacena en memoria como una serie de valores ASCII de tipo char de un solo byte y se termina con u byte cero, que se llama carcter nulo. Adems de los caracteres que son imprimibles, se pueden guardar en constantes cadena, cdigos de escape, smbolos especiales que representan cdigos de control y otros valores ASCII no

imprimibles. Los cdigos de escape se representan en la Tabla como un carcter nico, almacenado internamente como un valor entero y compuesto de una barra inclinada seguida por una letra, signo de puntuacin o dgitos octales o hexadecimales. Por ejemplo, la declaracin: char c = \n; asigna el smbolo nueva lnea a la variable C. En los PC, cuando se enva un carcter \n a un dispositivo de salida, o cuando se escribe \n en un archivo de texto, el smbolo nueva lnea se convierte en un retorno de carro y un avance de lnea.

Tipos enumerados El tipo enum es una lista ordenada de elementos como constantes enteras. A menos que se indique lo contrario, el primer miembro de un conjunto enumerado de valores toma el valor 0, pero se pueden especificar valores. La declaracin: enum diasSemana {Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo }; significa que Lunes = 0, martes = 1 etc. Sin embargo, si se hace Viernes = 10, entonces Lunes sigue siendo 0, Martes es igual a 2 etc.; pero ahora Viernes = 11, Sabado = 12, etc.

Un tipo enumerado se puede utilizar para declarar una variable enum diasSemana Laborable; y a continuacin utilizarla con Laborable = Jueves; o bien Laborable = Sabado; if (Laborable >= Viernes) printf ( Hoy no es laborable \n,Laborable);

REPASO Y EJEMPLOS VARIABLES Y CONSTANTES EN C Nombres de las variables Slo estn permitidas letras de la 'a' a la 'z' (la no vale), nmeros y el smbolo '_', puede contener nmeros, pero no en el primer carcter. Ejemplos de nombres vlidos: camiones numero buffer a1 j10hola29 num_alumnos Ejemplos de nombres no vlidos: 1abc nombre? num/alumnos Tampoco valen como nombres de variable las palabras reservadas que usa el compilador. Por ejemplo: for, main, do, while. C distingue entre maysculas y minsculas. Por lo tanto: Nombre nombre NOMBRE seran tres variables distintas. Dnde se declaran las variables? Tenemos dos posibilidades, una es declararla como global y otra como local. Es global aquella variable que se declara fuera de la funcin main y local la que se declara dentro: Variable Global #include <stdio.h> int x; int main() { }

Variable Local #include <stdio.h> int main() { int x; } Las variables globales se pueden usar en cualquier procedimiento y las locales slo pueden usarse en el procedimiento en el que se declaran. Es buena costumbre usar variables locales en vez de globales. Podemos declarar ms de una variable en una sola lnea: int x, y; En C++, las variables pueden ser declaradas en cualquier lugar dentro de un programa. No es necesario, como en C, que sean declaradas al comienzo de una funcin o de un bloque. Esto puede ser til en cdigos grandes, cuando una variable se utiliza en un trozo de cdigo lejano al comienzo del bloque. En este caso, el declarar el tipo de la variable cerca del lugar donde se va a utilizar puede hacer que el programa sea ms fcil de leer. Un ejemplo de esta posibilidad de C++ es la declaracin del contador dentro de un bucle. # include <iostream.h> main () { for (int i=0; i < 10; i++) { cout << "hola" << '\n'; } } El ndice i se ha definido dentro del bucle for. En algunos compiladores, su validez se extiende hasta el final del bloque donde han sido definidos Constantes. Las constantes se declaran, como en C, igual que una variable normal, pero aadiendo la palabra const delante. Por ejemplo, para declarar una constante con valor 14:

const int numero = 14; Estas constantes no pueden ser modificadas a lo largo del programa. Por eso deben ser definidas al mismo tiempo que declaradas. Enumeraciones. C++ permite definir nombres mnemotcnicos para enteros agrupados en conjuntos. Una enumeracin es un conjunto ordenado de nombres: enum Color {rojo, verde, azul, negro}; Esta declaracin define un nuevo tipo, Color, y cuatro variables inalterables de ese tipo. Por ejemplo, Color c=verde; declara la variable c del tipo Color con valor inicial verde. Cada nombre en la enumeracin se inicializa con un nmero entero, empezando en 0 e incrementndose en 1 al ir de izquierda a derecha. Se pueden especificar los valores enteros asociados a cada identificador en la enumeracin: enum Poligono {tringulo = 3, cuadrado = 4, pentgono =5}; Declaraciones typedef. La declaracin typedef da un nombre adicional a un tipo ya existente. Por ejemplo: typedef float temperatura; hace que temperatura sea un sinnimo de float, pero no define un nuevo tipo, y por tanto no afecta a las reglas de conversin de tipo. y p como variables de distinto tipo, ambas son en realidad de tipo float . Conversiones de tipo. Conversiones aritmticas usuales Si los operandos de un operador aritmtico binario son del mismo tipo, ese tipo es el tipo del resultado. Pero si no es as uno de los operandos es convertido al tipo del otro, y el resultado de la operacin tiene ese tipo comn. El tipo comn es el tipo del operando que aparece primero en la lista long double, double, float, long int, int. Los operandos de tipo char y short son tratados como si fueran de tipo int. Conversiones forzadas por el programador Las conversiones de tipo se hacen en C++ igual que en C:

c = (int)a; En C++ las conversiones de tipo se pueden escribir tambin como una llamada a funcin: c = int(a);

Operacin Accin x++ Postincremento ++x Preincremento x-Postdecremento --x Predecremento +x + unario -x - unario x*y Multiplicacin x/y Divisin x%y Mdulo x+y Suma x-y Resta

MEMORIA DINMICA CONCEPTO DE PUNTERO O APUNTADOR El valor de cada variable est almacenado en un lugar determinado de la memoria, caracterizado por una direccin (que se suele expresar con un nmero hexadecimal). La computadora mantiene una tabla de direcciones que relaciona el nombre de cada variable con su direccin en memoria. Gracias a los nombres de las variables (identificadores), de ordinario no hace falta que programador se preocupe de la direccin de memoria donde estn almacenados sus datos. Sin embargo, en ciertas ocasiones es ms til trabajar con las direcciones que con los propios nombres de las variables. El lenguaje C dispone del operador direccin (&) que permite determinar la direccin de una variable, y de un tipo especial de variables destinadas a contener direcciones de variables. Estas variables se llaman punteros o apuntadores (en ingls pointers). As pues, un puntero es una variable que puede contener la direccin de otra variable. Por supuesto, los punteros estn almacenados en algn lugar de la memoria y tienen su propia direccin ms adelante se ver que existen punteros a punteros). Se dice que un puntero apunta a una variable si su contenido es la direccin de esa variable. Un puntero ocupa de ordinario 4 bytes de memoria, y se debe declarar o definir de acuerdo con el tipo del dato al que apunta. Por ejemplo, un puntero a una variable de tipo int se declara del siguiente modo: int *direc; o cual quiere decir que a partir de este momento, la variable direc podr contener la direccin de cualquier variable entera. La regla nemotcnica es que el valor al que apunta direc (es decir *direc, como luego se ver), es de tipo int. Los punteros a long, char, float y double se definen anlogamente a los punteros a int.

OPERADORES DIRECCIN (&) E INDIRECCIN (*) Como se ha dicho, el lenguaje C dispone del operador direccin (&) que permite hallar la direccin de la variable a la que se aplica. Un puntero es una verdadera variable, y por tanto puede cambiar de valor, es decir, puede cambiar la variable a la que apunta. Para acceder al valor depositado en la zona de memoria a la que apunta un puntero se debe utilizar el operador de indireccin (*). Por ejemplo, supngase las siguientes declaraciones y sentencias, int i, j, *p; // p es un puntero a int p = &i; *p = 10; p = &j; *p = -2; // p contiene la direccin de i // i toma el valor 10 // p contiene ahora la direccin de j // j toma el valor -2

Las constantes y las expresiones no tienen direccin, por lo que no se les puede aplicar el operador (&). Tampoco puede cambiarse la direccin de una variable. Los valores posibles para un puntero son las direcciones posibles de memoria. Un puntero puede tener valor 0 (equivalente a la constante simblica predefinida NULL). No se puede asignar una direccin absoluta directamente (habra que hacer un casting). Las siguientes sentencias son ilegales: p = &34; p = &(i+1); &i = p; // las constantes no tienen direccin // las expresiones no tienen direccin

// las direcciones no se pueden cambiar // habra que escribir p = (int *)17654;

p = 17654;

Para imprimir punteros con la funcin printf() se deben utilizar los formatos %u y %p, como se ver ms adelante. No se permiten asignaciones directas (sin casting) entre punteros que apuntan a distintos tipos de variables. Sin embargo, existe un tipo indefinido de punteros (void *, o punteros a void), que puede asignarse y al que puede asignarse cualquier tipo de puntero. Por ejemplo: int *p;

double *q; void *r; p = q; // ilegal

p = (int *)q; // legal p = r = q; // legal

ARITMTICA DE PUNTEROS Como ya se ha visto, los punteros son unas variables un poco especiales, ya que guardan informacin no slo de la direccin a la que apuntan, sino tambin del tipo de variable almacenado en esa direccin. Esto implica que no van a estar permitidas las operaciones que no tienen sentido con direcciones de variables, como multiplicar o dividir, pero s otras como sumar o restar. Adems estas operaciones se realizan de un modo correcto, pero que no es el ordinario. As, la sentencia: p = p+1; hace que p apunte a la direccin siguiente de la que apuntaba, teniendo en cuenta el tipo de dato. Por ejemplo, si el valor apuntado por p es short int y ocupa 2 bytes, el sumar 1 a p implica aadir 2 bytes a la direccin que contiene, mientras que si p apunta a un double, sumarle 1 implica aadirle 8 bytes. Tambin tiene sentido la diferencia de punteros al mismo tipo de variable. El resultado es la distancia entre las direcciones de las variables apuntadas por ellos, no en bytes sino en datos de ese mismo tipo. Las siguientes expresiones tienen pleno sentido en C: p = p + 1; p = p + i; p += 1; p++; El siguiente ejemplo ilustra la aritmtica de punteros: void main(void) { int a, b, c; int *p1, *p2; void *p; p1 = &a; *p1 = 1; p2 = &b; // Paso 1. La direccin de a es asignada a p1 // Paso 2. p1 (a) es igual a 1. Equivale a a = 1; // Paso 3. La direccin de b es asignada a p2

*p2 = 2; p1 = p2; *p1 = 0; p2 = &c; *p2 = 3;

// Paso 4. p2 (b) es igual a 2. Equivale a b = 2; // Paso 5. El valor del p1 = p2 // Paso 6. b = 0 // Paso 7. La direccin de c es asignada a p2 // Paso 8. c = 3 // Paso 9. Qu se imprime?

printf("%d %d %d\n", a, b, c); p = &p1; *p = p2; *p1 = 1;

// Paso 10. p contiene la direccin de p1 // Paso 11. p1= p2; // Paso 12. c = 1 // Paso 13. Qu se imprime?

printf("%d %d %d\n", a, b, c); }

Ejemplo aritmtica de punteros: #include <stdio.h> #include <stdlib.h>

int main(void) { int *ptrA, *ptrB; int A, B, Resp; char opr; ptrA = &A; ptrB = &B;

printf(" Operacion: "); scanf("%d %c %d",ptrA,&opr,ptrB); printf(" %d %c %d", A, opr,B); switch(opr) { case '+': Resp = *ptrA + *ptrB; break; case '-': Resp = *ptrA - *ptrB; break; case '*': Resp = *ptrA * *ptrB; break; case '/': Resp = *ptrA / *ptrB; break; } printf("n Resultado de la suma: %d",Resp); getch(); return 0; }