Está en la página 1de 5

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. Ver figura1.1.
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).

Con lo anterior se elimina:


El manejo complicado del almacenamiento.
Alta sobrecarga por el movimiento de lneas.

Apuntadores y arreglos multidimensionales:


Puede provocar confusin el uso de arreglos de dos dimensiones y un arreglo de
apuntadores.
Considerar:
int a[10][10];
int *b[10];
El uso de a y b puede ser parecido, desde el momento en que a[5][5] y b[5][5] son referencias
validas a un int
El arreglo a es un arreglo verdadero, existen 100 celdas de memoria asignadas y se efecta el
clculo de subndices rectangulares convencional para localizar un elemento dado
Sin embargo, a b la declaracin solo le asigna 10 apuntadores, cada uno de los cuales deber
de apuntar a un arreglo de enteros
La desventajas de b son:
Ocupa ms espacio, suponiendo que cada uno apunta a un arreglo de 10 elementos, el
tamao ser de 10 apuntadores ms 100 elementos.
Se debe de crear el espacio de los arreglos antes de asignarlos.
o La declaracin b tiene dos ventajas:
o El acceso se hace ms rpido, una indereccin es ms rapida que el hacer una multiplicacin
seguida de una suma.
o El tamao de los arreglos apuntados por cada una de las diez localidades pueden ser
diferentes.

Un arreglo multidimensional puede ser visto en varias formas en C, por ejemplo:


Un arreglo de dos dimensiones es un arreglo de una dimensin, donde cada uno de los
elementos es en s mismo un arreglo.
Por lo tanto, la notacin
a[n][m]
nos indica que los elementos del arreglo estn guardados rengln por rengln.
Cuando se pasa una arreglo bidimensional a una funcin se debe especificar el nmero de
columnas -- el nmero de renglones es irrelevante.
La razn de lo anterior, es nuevamente los apuntadores. C requiere conocer cuantas son las
columnas para que pueda brincar de rengln en rengln en la memoria.
Considerando que una funcin deba recibir int a[5][35], se puede declarar el argumento de la
funcin como:
f( int a[][35] ) { ..... }
o an
f( int (*a)[35] ) { ..... }
En el ltimo ejemplo se requieren los parnteis (*a) ya que [ ] tiene una precedencia ms alta
que *.
Por lo tanto:
int (*a)[35]; declara un apuntador a un arreglo de 35 enteros, y por ejemplo si hacemos la
siguiente referencia a+2, nos estaremos refiriendo a la direccin del primer elemento que se
encuentran en el tercer rengln de la matriz supuesta, mientras que
int *a[35]; declara un arreglo de 35 apuntadores a enteros.
Ahora veamos la diferencia (sutil) entre apuntadores y arreglos. El manejo de cadenas es una
aplicacin comn de esto.
Considera:
char *nomb[10];
char anomb[10][20];
En donde es vlido hacer nomb[3][4] y anomb[3][4] en C.
Sin embargo:
anomb es un arreglo verdadero de 200 elementos de dos dimensiones tipo char.
El acceso de los elementos anomb en memoria se hace bajo la siguiente frmula 20*renglon +
columna + direccin_base
En cambio nomb tiene 10 apuntadores a elementos.
NOTA: si cada apuntador en nomb indica un arreglo de 20 elementos entonces y solamente
entonces 200 chars estarn disponibles (10 elementos).
Con el primer tipo de declaracin se tiene la ventaja de que cada apuntador puede apuntar a
arreglos de diferente longitud.
Considerar:
char *nomb[] = { "No mes", "Ene", "Feb", "Mar", .... };
char anomb[][15] = { "No mes", "Ene", "Feb", "Mar", ... };
Lo cual grficamente se muestra en la figura 1.2. Se puede indicar que se hace un manejo
ms eficiente del espacio haciendo uso de un arreglo de apuntadores y usando un arreglo
bidimensional.

Figura 1.2: Arreglo de 2 dimensiones VS. arreglo de apuntadores.

También podría gustarte