Está en la página 1de 0

Arrays y Punteros

Realizado por Ismael Camarero


icamarero@gmail.com
SIMULACIN DE ARRAYS MEDIANE PUNER!S
A nivel de memoria del ordenador, los arrays no tienen existencia real. El ordenador utiliza
direcciones de memoria y punteros, variables capaces de almacenar direcciones de memoria.
Cuando declaramos un array :
int valores[20];
lo que hacemos es decir que nos reserve memoria para 2 valores int.
!ero "c"mo #acemos lo mismo utili$an%o s"lo &unteros#.
$a declaraci%n

int *ptr;
reserva memoria para &uardar la direcci%n de memoria de un ob'eto int residente en memoria. !ara
simular el comportamiento del array debemos decir cu(ntos elementos int vamos a utilizar.
!ara ello:
) *e declara un puntero:
int *ptr;
) *e realiza una reserva de memoria del tama+o deseado ,numero elementos x tama+o del
elemento-
)malloc ()' devuelve un puntero &en.rico a la primera posici%n reservada. *u
/ormato es:
void *malloc(tamao a reservar);
)alloc (): lo mismo que malloc,-, con di/erente /ormato:
void *calloc(numero elementos, tamao_elemento);
(realloc ( )' Reduce o expande el tama+o de un bloque previamente alo'ado
en memoria. El nuevo bloque no tiene porque estar en el mismo lu&ar. 0ormato:
void *realloc(void *bloque, nuevo_tamao);
1er e'emplo en C: malloc.cpp
) $as tres /unciones se encuentran en malloc.h o alloc.h.
) Como el puntero que devuelves es &en.rico, habr( que someterlo a una conversi%n /orzada
de tipo ,cast- para aportarlo al tipo de dato apuntado:
char *str;
str = (char *) malloc(10*sizeof(char)); //reserva para 10 caracteres
2 bien:
str = (char *) calloc(10, sizeof(char));
str = (char *) realloc(str, 50*sizeof(char)); //realojamos

) *i la reserva de memoria /racasa, devuelve un puntero nulo ,34$$- que nos permitir(
saber que la operaci%n ha /allado. !ara ello emplearemos la instrucci%n:
if ((str = (char *)malloc(10*sizeof(char))== !"")
p#ts($%eserva &e memoria falli&a'''();

PUNER!S )s ARRAYS'
*+ Puntero a gru&o %e arrays contiguos'
5eclar(bamos un array:
tipo)&ato arra*[tam1][tam267

E'emplo:
int valor [tam1] [tam2];
$os arrays no existen con ese /ormato en memoria por lo que es necesario la utilizaci%n de
punteros.

int valor [10] [20]; //array de 10 filas x 20 columnas
Este array seria lo mismo que hacer:
int (*valor)[20];
Diremos ,ue se trata %e un &untero a gru&o %e arrays contiguos
Im&ortante' en la %eclaraci"n anterior %esa&arece la &rimera %imensi"n.
Representa un puntero a un &rupo conti&uo de 8 arrays lineales de 2 elementos cada uno.
valor + i: representa la direccin de memoria de cada una de las filas
8 2 9 : ;;..8<
valor + 0
Primer array monodimensional (fila 0)
valor + 1
Segundo array monodimensional (fila 1)
...
...
. . . . .
1eamos el c%di&o en C:
8- //direcciones de las filas:
p#ts(,-irecciones &e las filas.,);
for(i=0; i/2; i++)
printf(,0p ,, *(valor+i));
2) //direcciones de cada elemento
p#ts(,1n-irecciones &e ca&a elemento.,);
for(i=0; i/2; i++)
2
for(j=0; j/5; j++)
printf(,0p ,, (*(valor+i)+j));
printf(,1n,);
3

9) //Contenido de cada elemento:
p#ts(,1n4onteni&o &e ca&a elemento (como p#ntero &o5le).,);
for(i=0; i/2; i++)
2
for(j=0; j/5; j++)
printf(,0& ,, *(*(valor+i)+j));
printf(,1n,);
3
6) //Contenidos como puntero a grupo de arrays contiguos:
p#ts(,1n4onteni&os &e ca&a elemento (como p#ntero a #n 7r#po &e
arra*s conti7#os.,);
for(i=0; i/2; i++)
2
for(j=0; j/5; j++)
printf(,0& ,, (*(valor+i))[j]); //8889 :9;%< =<%>?>:@:'''''
printf(,1n,);
3
7etch();
3
Aer ptr.cpp
-+ Array %e &unteros'
4n array bidimensional puede ser expresado como un array %e &unteros que contienen la
direcci%n de memoria en la que reside un valor. El nuevo array ser( de una dimensi%n menor que la
de la ori&inal.
int &atos[tam1][tam2];

5e /orma &eneral:
tipo ) &ato[tam1][tam2]BB[tam n];
Como arrays de punteros:
int *&atos[tam1];
tipo)&ato valor[tam1][tam2]BB[tam nC1];
El array de punteros contiene como elementos punteros a posiciones de memoria que contienen
datos.
El nuevo array tiene una dimensi%n menos que el array ori&inal. !ierde la =ltima de las dimensiones
ori&inales
E'emplo de array de punteros:
5eclaramos el array bidimensional:
int valor [10] [0]
Empleando la notaci%n de array de punteros, ser(:
int *valor [10] ; //arra* &e 10 p#nteros, ca&a #no a #n arra* mono&imensional
valor>6 8 2 9 : 8<
;;;
Array monodimensional ,- de 2 elementos
valor>86 8 2 9 : 8<
*. ;;;
Array monodimensioanl ,8- de 2 elementos;
valor>86 apunta a la direcci%n
del array . 5irecci%n: valor>86?8

Contenido es: @,valor>86?2-, es decir *.
!tro e/em&lo'
float ptr[6][5];
Como array de punteros:
float *ptr[6]; //#n arra* &e 6 p#nteros a arra*s flotantesD
8 2 9


En len&ua'e C, tendrAamos:
1) //&irecciones &e las filas.
p#ts(,-irecciones &e las filas.,);
for(i=0; i/2; i++)
printf(,0& ,, valor[i]);
2)//&irecciones &e ca&a elemento
p#ts(,1n-irecciones &e ca&a elemento.,);
for(i=0; i/2; i++)
2
for(j=0; j/5; j++)
printf(,0& ,, (valor[i]+j));
printf(,1n,);
3
E) p#ts(,1n4onteni&os &e ca&a elemento (como p#ntero &o5le).,);
for(i=0; i/2; i++)
2
for(j=0; j/5; j++)
printf(,0& ,, *(*(valor+i)+j));
printf(,1n,);
3
6) p#ts(,1n4onteni&os &e ca&a elemento (como arra* &e p#nteros.,);
for(i=0; i/2; i++)
2
for(j=0; j/5; j++)
printf(,0& ,, *(valor[i]+j));
printf(,1n,);
3
Aer ptr.cpp
3ota: en la impresi%n de direcciones de memoria he empleado la notaci%n
printf(,0& ,, (valor[i]+j));
que imprime las direcciones como n=meros enteros. *i se desea traba'ar con /ormatos
hexadecimales, emplear la notaci%n:
printf(,0FG ,, (valor[i]+j));
2 bien:
printf(,0p ,, (valor[i]+j));

!ara ver otras notaciones comple'as, posibles, empleando punteros, ver el documento

1er %eclar&unt.%oc
!alladolid, "ebrero de 00#
$a%ado de
&ttp:''pro(ramandoenc.)ebcindario.com