Apuntadores y Arreglos en C

Sección de Acceso Rápido de Subtemas de Este Capítulo:

Apuntadores en C. | ¿Por que son Importantes los Apuntadores? | Operadores de Dirección e Indirección | Aritmetica de Apuntadores | Apuntadores a Funciones| Arreglos | ¿Por que Usar Arreglos? | Declaración de Arreglos | Arreglos y Apuntadores |

Apuntadores en C

1.-Un Apuntador es una variable que contiene una dirección de memoria, la cual corresponderá a un dato o a una variable que contiene el dato. Los apuntadores también deben de seguir las mismas reglas que se aplican a las demás variables, deben tener nombre únicos y deben de declararse antes de usarse.

Cada variable que se utiliza en una aplicación ocupa una o varias posiciones de memoria. Estas posiciones de memoria se accesan por medio de una dirección.

ejemplo de apuntadores

En la figura el texto Hello ésta guardado en memoria, comenzando en la dirección 1000. Cada carácter ocupa un espacio de dirección único en memoria. Los apuntadores proporcionan un método para conservar y llegar a estas direcciones en memoria. Los apuntadores facilitan el manejo de datos, debido a que conservan la dirección de otra variable o ubicación de datos.



Top de la Pagina

1.1-¿Por qué son Importantes los Apuntadores?Los apuntadores dan flexibilidad a los programas en C++ y permiten que estos crezcan dinámicamente. Utilizando un apuntador hacia un bloque de memoria que se asigna al momento de ejecución, un programa puede ser más flexible que uno que asigna toda su memoria de una sola vez. También, un apuntador es más fácil de guardar que una estructura grande o un objeto de una clase. Debido a que un apuntador sólo guarda una dirección, puede fácilmente pasarse a una función. Uno de las desventajas que pueden presentar los apuntadores es que un apuntador sin control o no inicializado puede provocar fallas en el sistema, además de que su uso incorrecto puede generar fallas muy complejas de hallar.



Top de la Pagina

1.2 Operadores de Indirección y Dirección. Hay 2 operadores que se usan cuando trabajan con direcciones en un programa C; el Operador de Indirección ( * ) y el de Dirección (&). Estos operadores son diferentes de los tratados anteriormente.

El Operador de Dirección ( &) regresa la dirección de una variable. Este operador está asociado con la variable a su derecha: &h; Esta línea regresa la dirección de la variable h.

El Operador de Indirección ( * ) trabaja a la inversa del operador de Dirección. También esta asociado con la variable a su derecha, toma la dirección y regresa el dato que contiene esa dirección. Por ejemplo, la siguiente línea determina la dirección de la variable h y luego usa el operador de Indirección para accesar la variable y darle un valor de 42:

*(&h)=42;

 

La declaración de un puntero de manera general es:

tipo *nombre de apuntador;

Tipo : Especifica el tipo de objeto apuntado y puede ser cualquier tipo.

Nombre de apuntador: Es el identificador del apuntador.

El espacio de memoria requerido para un apuntador, es el número de bytes necesarios para especificar una dirección de memoria, debiendo apuntar siempre al tipo de dato correcto.

Considere el siguiente programa y observe a las variables de dirección e Indirección trabajar:

 

ejemplo de apuntadores

salida de programa


Top de la Pagina

1.3-La Aritmética de Apuntadores. Solamente se pueden realizar operaciones de incremento y decremento, y estos es deacuerdo a la longitud de su tipo de base. Por ejemplo supóngase que una máquina particular utiliza direccionamiento de byte, un entero requiere 4 bytes y el valor de la variable pi (declarada asi: int *pi) es 100, es decir, se apunta al entero *pi en la localidad 100. Entonces el valor de pi-1 es 96, el de pi+1 es 104 y el de pi+2 es 108. El valor de *(pi-1) es el de los contenidos de los 4 bytes 96,97,98, y 99 , el de *(pi+1) es el del contenido de los byte 104, 105,106 y 107, y el de *(pi+2) es el entero que esta en los bytes 108,109,110 y 111.

De manera parecida, si el valor de la variable pc (declarada asi: char *pc; ) es igual a 100, y un carácter tiene un byte de longitud, pc-1 refiere a la localidad 99, pc+1 a la 101 y pc+2 a la 102.



Top de la Pagina

1.4 Apuntadores a Funciones.Un área en la cual desempeñan un papel prominente los apuntadores es el lenguaje C es la transmisión de parámetros a funciones. Por lo común, los parámetros se transmiten por valor a una función en C, es decir, se copian los valores transmitidos en los parámetros de la función llamada en el momento en que se invoca. Si cambia el valor de un parámetro dentro de la función, no cambia su valor en el programa que la llama. Por ejemplo considérese el siguiente fragmento y función de programa (el numero de línea es solo una guía en el ejemplo):

 

Ejemplo de Apuntadores

La línea 2 imprime el número 5 y después llama a funct. El valor de "x", que es 5, se copia en "y" y comienza la ejecución de funct. Después, la línea 9 imprime el número 6 y regresa funct. Sin embargo, cuando la línea 8 incrementa el valor de "y", el valor de "x" permanece invariable. Así, la línea 4 imprime el número 5, "x" y "y" refieren a 2 variables diferentes.

Si deseamos usar funct para modificar el valor de "x", debemos de transmitir la dirección de "x" de la siguiente manera:

 

Ejemplo de apuntadores

La línea 2 imprime nuevamente el número 5, y la línea 3 llama a funct. Ahora, sin embargo, el valor transferido no es el valor entero de "x" sino el valor apuntador "&x". Este es la dirección de "x". El parámetro de funct no es más y de tipo int, sino py de tipo int * . (Es conveniente nombrar a las variables apuntadores comenzando con la letra p para recordar tanto que se trata de un apuntador) la línea 8 ahora aumenta al entero en la localidad py; py, sin embargo, no cambia y conserva su valor inicial "&x". Así, py apunta al entero "x" de tal manera que cuando *py, aumenta x. La línea 9 imprime 6 y cuando regresa funct, la línea 4 imprime también 6. Los apuntadores son el mecanismo usado en el lenguaje C para permitir a una función llamada modificar las variables de la función que llama.

 

 

Top de la Pagina

Areglos en C.

2.-Arreglos. Es una serie de datos del mismo tipo, también conocidos como vectores o rangos. Una arreglo esta constituido por varias posiciones de memoria de igual tamaño consecutivas que tienen el mismo tipo de variable y se accesan usando el mismo nombre seguido de un subíndice entre corchetes. La cantidad total de espacio que se usa por un arreglo depende de 2 cosas: El número de elementos en el arreglo y El tamaño del arreglo.

Ejemplo de Arreglo


Top de la Pagina

2.1- ¿Por qué Usar los Arreglos? Por que son uno de los factores esenciales de los programas de computadora. Permiten que se haga referencia a entradas individuales en una tabla de elementos de datos usando el mismo código y variando el índice del elemento.



Top de la Pagina

2.3- La Declaración de un Arreglo es igual a como se haría con una variable, a excepción de que también se especifica la cantidad de elementos en el arreglo encerrado entre corchetes de la siguiente manera: tipo nombre_del_arreglo[tamaño];

Cuando se declara un arreglo, sus valores se pueden inicializar de la siguiente manera:

Int lista[9]= {0, 4, 78, 5, 32, 9, 77, 1, 23}

No trate de engañar al Compilador inicializando mas valores en el arreglo de los que puede, ya que este no lo obedecerá, sin embargo, si inicializa solo una parte del arreglo, las restantes posiciones se inicializan con 0´s.

Si desea imprimir un valor de un arreglo, la línea luce así: printf ("%d", lista[1]);

Una Característica importante de los arreglos en C es que no se pueden modificar los limites superior e inferior (y por tanto el rango) durante el programa. El limite inferior se fija siempre en 0 y el superior lo fija el programador, es decir:

Ejemplo de indices de arreglos

Se han visto hasta ahora, arreglos llamados Unidimensionales, pero existen también los llamados Bidimensionales, y se declaran así: tipo nombre_arreglo_bi[tamaño][tamaño]; Estos también son comúnmente conocidas como Matrices, El tamaño en la declaración de la matriz estipula Renglon-Columna y se representarían así:

Ejemplo de arreglo bidimensional

Estos también se pueden inicializar:

Int lista_nueva[2][2]={{14, 34},{23, 67}}; y se acceden de la misma manera que un unidimensional. Ejemplo printf ("%d", lista_nueva[1][0]); Y de esta forma se pueden construir arreglos Multidimensionales p/e:

int grande[3][4][7]; ó incluso int mas_grande [5][7][8][2][3][2]; pero se debe de tener cuidado al manejar estos arreglos por que son complejos de manipular a la larga. A pesar de ser Bidimensionales, en la memoria siguen siendo representados como espacios secuenciales lineales.



Top de la Pagina

2.4 Arreglos y Apuntadores. Las versiones con apuntadores en los arreglos son mas rápidas que la indexación común. La declaración

int a[10]; int *pa;

por lo que pa=&a[0] y así establecemos que *pa=a[0] y *(pa+1)=a[1] y así sucesivamente. De esta manera se pude manejar mas eficientemente los valores y direcciones de un arreglo Bi o Unidimensional.


Top de la Pagina


Examen!

Si has Estudiado Bien el Capitulo Click Aqui para hacer el Examen 3


Glosario del Tutorial

¿No Entiendes Bien Algún Concepto?... Consultalo!


Busqueda en el Tutorial

¿Deseas Encontrar Algo Especifico?...Encuentralo!

 

Ejemplo Practico de este Capitulo !

Este tutorial desarrolla al 100% sus Aplicaciones con un Navegador en 800x600

OPCIÓN ALTERNA:
Introducción@Elementos de C@Apuntadores y Arreglos@Estructuras y Uniones@Bibliografía

Archivos y Gráficos@POO1@POO2@POO3@Creditos@Presentación Principal@Menú Principal


Todos los Derechos Reservados por El Instituto Tecnológico de Querétaro Mexico. "La tierra será como sean los Hombres"

Ultima Actualización: México Noviembre de 1999