You are on page 1of 5

RESUMEN UNIDAD V Cmo se organiza la memoria asociada a un programa? Como una coleccin de posiciones de memoria consecutivas.

En ellas se almacenan los distintos tipos de datos, que ocupan, por ejemplo: 1 char = 1 byte 1 int = 2 bytes 1 float = 4 bytes Un puntero no es ms que una variable esttica cuyo contenido es una direccin de memoria.

El puntero, no es ms que una herramienta muy potente que puede Utilizar en sus programas para hacerlos ms eficiente y flexibles. Los punteros Son, sin gnero de dudas, una de las razones fundamentales para que el Lenguaje C sea tan potente y tan utilizado. Una variable puntero(o puntero como se llama normalmente) es una variable Que contiene direcciones de otras variables.
En C los punteros y los vectores estn fuertemente relacionados, hasta el punto de que el nombre de un vector es en s mismo un puntero a la primera (0-sima) posicin del vector. Todas las operaciones que utilizan vectores e ndices pueden realizarse mediante punteros. int v[10]; 1 v[0] 3 v[1] 5 v[2] 7 v[3] 9 v[4] 11 v[5] 13 v[6] 15 v[7] 17 v[8] 19 v[9]

Declaracin de Apuntador
Cuando se declara una variable, el compilador reserva un espacio de memoria para ella y asocia el nombre de sta a la direccin de memoria desde donde comienzan los datos de esa variable. Las direcciones de memoria se suelen describir como nmeros en hexadecimal. Un apuntador es una variable cuyo valor es la direccin de memoria de otra variable. Se dice que un apuntador apunta a la variable cuyo valor se almacena a partir de la direccin de memoria que contiene el apuntador. Por ejemplo, si un apuntador p almacena la direccin de una variable x, se dice que p apunta a x. Los apuntadores como cualquier otra variable deben de ser declarados antes de que puedan ser utilizados. El tipo de un apuntador lo proporciona implcitamente el tipo de la variable a la que apunta. Los apuntadores pueden ser declarados para apuntar a objetos de cualquier clase. La sintaxis general de declaracin es: <tipo> * <variable>

int *apuntador;
Se debe asociar a cada apuntador un tipo particular. Por ejemplo, no se puede asignar la direccin de un short int a un long int.

Inicializacin de APUNTADORES:
AI igual que otras variables, C no inicializa los punteros cuando se declaran y es preciso inicializarlos antes de su uso. La inicializacin de un puntero proporciona a ese puntero la direccin del dato correspondiente. Despus de la inicializacin, se puede utilizar el puntero para referenciar los datos direccionados. Para asignar una direccin de memoria a un puntero se utiliza el operador de referencia
&.

< Almacenamiento > < Tipo > * < Nombre > = < Expresin > Si <Almacenamiento> es extern o static, <Expresin> deber ser una expresin constante del tipo <Tipo> expresado. Si <Almacenamiento> es auto, entonces <Expresin> puede ser cualquier expresin del <Tipo> especificado. Ejemplos: La constante entera 0, NULL (cero) proporciona un apuntador nulo a cualquier tipo de dato: int *p; p = NULL; //actualizacin El nombre de un arreglo de almacenamiento static o extern se transforma segn la expresin: float mat[12]; float *punt = mat; float mat[12]; float *punt = &mat[0]; Un cast apuntador a apuntador: int *punt = (int *) 123.456; Inicializa el apuntador con el entero. Esto es, en la direccin a la que apunta la variable punt se almacena el valor 123.

Un apuntador a carcter puede inicializarse en la forma: char *cadena = Esto es una cadena; Se pueden sumar o restar valores enteros a las direcciones de memoria en la forma: (aritmtica de APUNTADORES) static int x; int *punt = &x+2, *p = &x-1;

Punteros y verificacin de tipos


Los punteros se enlazan a tipos de datos especficos, de modo que C verificar si se asigna la direccin de un tipo de dato al tipo correcto de puntero. As, por ejemplo, si se define un puntero a float, no se le puede asignar la direccin de un carcter o un entero. Por ejemplo, este segmento de cdigo no funcionar:
float *fp; char c; fp = &c; / * no es vlido * /

PUNTEROS null Y void


Normalmente un puntero inicializado adecuadamente apunta a alguna posicin especfica de la memoria. Sin embargo, un puntero no inicializado, como cualquier variable, tiene un valor aleatorio hasta que se inicializa el puntero. En consecuencia, ser preciso asegurarse que las variables puntero utilicen direcciones de memoria vlida. Un sistema de inicializar una variable puntero a nulo es:

char *p = NULL;

Apuntadores y Funciones:
Cuando C pasa argumentos a funciones, los pasa por valor, es decir, si el parmetro es modificado dentro de la funcin, una vez que termina la funcin el valor pasado de la variable permanece inalterado. Hay muchos casos que se quiere alterar el argumento pasado a la funcin y recibir el nuevo valor una vez que la funcin ha terminado. Para hacer lo anterior se debe usar una llamada por referencia, en C se puede simular pasando un puntero al argumento. Con esto se provoca que la computadora pase la direccin del argumento a la funcin. Para entender mejor lo anterior consideremos la funcin swap() que intercambia el valor de dos argumentos enteros: void swap(int *px, int *py); main() { int x, y; x = 10; y = 20; printf("x=%d\ty=%d\n",x,y); swap(&x, &y); printf("x=%d\ty=%d\n",x,y); } void swap(int *px, int *py) { int temp; temp = *px; /* guarda el valor de la direccion x */ *px = *py; /* pone y en x */ *py = temp; /* pone x en y */

APUNTADORES Y ARREGLOS:
Existe una estrecha relacin entre apuntadores y arreglos, tanto que pueden ser usados en forma casi indistinta. En C, un nombre de un arreglo es un ndice a la direccin de comienzo del arreglo. En esencia, el nombre de un arreglo es un puntero al arreglo. Una variable de tipo arreglo puede considerarse como un apuntadora tipo del arreglo. Los apuntadores pueden ser utilizados en cualquier operacin que involucre subndices de arreglos.

Ejemplo: main() { int tabla[10],i,x,*pt,*ptr; pt = &tabla[0]; x = *pt; for (i=0; i!10; i++) *(pt+i) = random(); ptr = tabla; for (i=0; i!10; i++) printf(''%d nn'',*(ptr+i),tabla[i]); } Cuando se suma 1 a un apuntador el incremento se adecua al tamao en memoria del objeto apuntado. Un apuntador es una variable, por lo que operaciones como pa = a y pa++ son permitidas. Un nombre de un arreglo es una constante, no una variable, de ah que a = pa o a++ o p = a.

Arreglos de apuntadores:
Los arreglos pueden contener apuntadores. El uso ms comn es el de formar arreglos de cadenas de caracteres. Cada entrada en el arreglo es un apuntador al primer carcter de la cadena. Sea la declaracin: char * mensaje[4] = {''Hola'',''Adios'',''Bye'',''Salut''} Cada cadena est almacenada en memoria como una cadena de caracteres terminada en NULL n0. En el arreglo no estn colocadas las cadenas, tan solo estn almacenados los apuntadores. Aunque el arreglo es de tamao fijo, permite el acceso a cadenas de caracteres de cualquier longitud. En C se pueden tener arreglos de apuntadores ya que los apuntadores son variables. A continuacin se muestra un ejemplo de su uso: ordenar las lneas de un texto de diferente longitud. Los arreglos de apuntadores son una representacin de datos que manejan de una forma eficiente y conveniente lneas de texto de longitud variable. Cmo se puede hacer lo anterior? Guardar todas las lneas en un arreglo de tipo char grande. Observando que \n marca el fin de cada lnea. Guardar los apuntadores en un arreglo diferente donde cada apuntador apunta al primer caracter de cada lnea. Comparar dos lneas usando la funcin de la biblioteca estndar strcmp(). Si dos lneas estn desacomodadas -- intercambiar (swap) los apuntadores (no el texto).

Figura 1.1: Arreglos de apuntadores (Ejemplo de ordenamiento de cadenas).

Ventajas de los punteros


Un nombre de un array es una constante puntero, no una variable puntero. No se puede cambiar el valor de un nombre de array, como no se pueden cambiar constantes. Esto explica por qu no se pueden asignar valores nuevos a un array durante una ejecucin de un programa. Por ejemplo, si cnombre es un array de caracteres, la siguiente sentencia no es vlida en C:

cnombre = "Hermanos Daltn"; Se pueden asignar valores al nombre de un array slo en el momento de la declaracin, o bien utilizando funciones,
Se pueden cambiar punteros para hacerlos apuntar a valores diferentes en memoria

You might also like