Está en la página 1de 4

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; */ *px = *py; *py = temp; } /* pone y en x */ /* pone x en y */ /* guarda el valor de la direccion x

8.3 Apuntadores y arreglos


Existe una relacin estrecha entre los punteros y los arreglos. 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. Considerar lo siguiente:
int a[10], x; int *ap;

ap = &a[0];

/* ap apunta a la direccion de a[0] */

x = *ap; /* A x se le asigna el contenido de ap (a[0] en este caso) */ *(ap + 1) = 100; /* Se asigna al segundo elemento de 'a' el valor 100 usando ap*/

Como se puede observar en el ejemplo la sentencia a[t] es idntica a ap+t. Se debe tener cuidado ya que C no hace una revisin de los lmites del arreglo, por lo que se puede ir fcilmente ms alla del arreglo en memoria y sobreescribir otras cosas. C sin embargo es mucho ms stil en su relacin entre arreglos y apuntadores. Por ejemplo se puede teclear solamente:
ap = a; en vez de ap = &a[0]; y tambin *(a + i) en vez de a[i], esto es, &a[i] es equivalente con a+i .

Y como se ve en el ejemplo, el direccionamiento de apuntadores se puede expresar como:


a[i] que es equivalente a *(ap + i)

Sin embargo los apuntadores y los arreglos son diferentes:


Un apuntador es una variable. Se puede hacer ap = a y ap++. Un arreglo NO ES una variable. Hacer a = ap y a++ ES ILEGAL.

Este parte es muy importante, asegrese haberla entendido. Con lo comentado se puede entender como los arreglos son pasados a las funciones. Cuando un arreglo es pasado a una funcin lo que en realidad se le esta pasando es la localidad de su elemento inicial en memoria. Por lo tanto:
strlen(s) es equivalente a strlen(&s[0])

Esta es la razn por la cual se declara la funcin como:


int strlen(char s[]); y una declaracin equivalente es int strlen(char *s);

ya que char s[] es igual que char *s.

La funcin strlen() es una funcin de la biblioteca estndar que regresa la longitud de una cadena. Se muestra enseguida la versin de esta funcin que podra escribirse:
int strlen(char *s) { char *p = s; while ( *p != '\0' ) p++; return p - s; }

Se muestra enseguida una funcin para copiar una cadena en otra. Al igual que en el ejercicio anterior existe en la biblioteca estndar una funcin que hace lo mismo.
void strcpy(char *s, char *t) { while ( (*s++ = *t++) != '\0' ); }

En los dos ltimos ejemplos se emplean apuntadores y asignacin por valor. Nota: Se emplea el uso del caracter nulo con la sentencia while para encontrar el fin de la cadena.

8.4 Arreglos de apuntadores


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? 1. Guardar todas las lneas en un arreglo de tipo char grande. Observando que \n marca el fin de cada lnea. Ver figura 8.1. 2. Guardar los apuntadores en un arreglo diferente donde cada apuntador apunta al primer caracter de cada lnea.

3. Comparar dos lneas usando la funcin de la biblioteca estndar strcmp(). 4. Si dos lneas estn desacomodadas -- intercambiar (swap) los apuntadores (no el texto).

Figura 8.1: Arreglos de apuntadores (Ejemplo de ordenamiento de cadenas). Con lo anterior se elimina:
el manejo complicado del almacenamiento. alta sobrecarga por el movimiento de lneas.

También podría gustarte