Free Web Hosting Provider - Web Hosting - E-commerce - High Speed Internet - Free Web Page
Search the Web

Universidad del Valle de México

MUSICA MIENTRAS NAVEGAS CON REAL AUDIO

SACBEOB ( SISTEMAS DE CAMINOS ELEVADOS )

419PERSONAS QUE NOS VISITAN

Búscalo en SACBEOB

PUNTEROS

PUNTEROS Y ARRAYS

El nombre de un array , para el compilador C , es un PUNTERO inicializado con la dirección del primer elemento del array . Sin embargo hay una importante diferencia entre ambos.
Veamos algunas operaciones permitidas entre punteros :

ASIGNACION

float var , conjunto[] = { 8.0 , 7.0 , 6.0 , 5.0 , 4.0 );

float *punt ;

punt = conjunto ; /* equivalente a hacer : punt = &conjunto [0] */

var1 = *punt ;

*punt = 25.1 ;

Es perfectamente válido asignar a un puntero el valor de otro , el resultado de ésta operación es cargar en el puntero punt la dirección del elemento [0] del array conjunto , y posteriormente en la variable var el valor del mismo (8.0) y para luego cambiar el valor de dicho primer elemento a 25.1 .
Veamos cual es la diferencia entre un puntero y el denominador de un array : el primero es una VARIABLE , es decir que puedo asignarlo , incrementarlo etc , en cambio el segundo es una CONSTANTE, que apunta siempre al primer elemento del array con que fué declarado , por lo que su contenido no puede ser variado.

El siguiente ejemplo nos muestra un tipo de error bastante frecuente:

ASIGNACION ERRONEA

int conjunto[3] , lista[] = { 5 , 6 , 7 ) ;

int *apuntador ;

apuntador = lista ; /* correcto */

conjunto = apuntador; /* ERROR ( se requiere en Lvalue no constante ) */

lista = conjunto ; /* ERROR ( idem ) */

apuntador = &conjunto /* ERROR no se puede aplicar el operador & (dirección) a

una constante */

INCREMENTO O DECREMENTO DE UN PUNTERO

int *pint , arreglo_int[5] ;

double *pdw , arreglo_dou[6] ;

pint = arreglo_int ; /* pint apunta a arreglo_int[0] */

pdw = arreglo_dw ; /* pdw apunta a arreglo_dou[0] */

pint += 1 ; /* pint apunta a arreglo_int[1] */

pdw += 1 ; /* pdw apunta a arreglo_dw[1] */

pint++ ; /* pint apunta a arreglo_int[2] */

pdw++ ; /* pdw apunta a arreglo_dw[2] */

Para el compilador , éstas sentencias se leen como : incremente el contenido del puntero ( dirección del primer elemento del array ) en un número igual a la cantidad de bytes que tiene la variable con que fué declarado . Es decir que el contenido de pint es incrementado en dos bytes (un int tiene 2 bytes ) mientras que pdou es incrementado 8 bytes ( por ser un puntero a double ) , el resultado entonces es el mismo para ambos , ya que luego de la operación quedan apuntando al elemento siguiente del array , arreglo_int[1] y arreglo_dw[1] .

Vemos que de ésta manera será muy facil "barrer" arrays , independientemente del tamaño de variables que lo compongan , permitiendo por otro lado que el programa sea transportable a distintos hardwares sin preocuparnos de la diferente cantidad de bytes que pueden asignar los mismos , a un dado tipo de variable .
De manera similar las dos instrucciones siguientes , vuelven a a incrementarse los punteros , apuntando ahora a los elementos siguientes de los arrays.
Todo lo dicho se puede aplicar de igual  manera  al operador de decremento(--)    .

REGRESAR

CONTINUAR