Punteros
14. Arreglos de punteros.
NO es lo mismo un puntero a un arreglo, que un arreglo de punteros!!
Un arreglo de punteros, no es otra cosa que una variable que tiene espacios consecutivos asignados en la memoria ( por ser arreglo) y que almacena direcciones de memoria ( por ser puntero)
La sintaxis es la esperada:
tipo puntero [cantidad_de_valores];
Veamos un ejemplo:
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
float *pa;//declaro puntero a float
cout<<sizeof(float)<<endl;
pa=new float[5];//con new reservo 5 espacios consecutivos
// pero regreso un puntero al primero!!
for(int i=0;i<5;i++)cin>>*pa[i];
for(int i=0;i<5;i++)cout<<pa[i]<<"\t"<<&pa[i]<<endl;
return 0;
}
Se puede ver en la salida claramente que los espacios son consecutivos, separados por 4 bytes ( tammaño de float) y que en este caso NO apuntan a nada, lógicamente.
Veamos el siguiente código:
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){
float *px;
px=new float[5];//Declaro arreglo de punteros CONSECUTIVOS
float *pa[5];//Declaro arreglo de punteros <-Esto es nuevo!!
cout<<sizeof(float)<<endl;
//Espacios NO consecutivos ( cada vez que ejecuto new) .
for(int i=0;i<5;i++){
pa[i]=new float;//dinámicamente resevo UN espacio en memoria.
cin>>*pa[i];//cada puntero ahora apunta al dato ingresado:inicializo
}
for(int i=0;i<5;i++)cout<<*pa[i]<<" "<<pa[i]<<endl;//Espacios consecutivos.
for(int i=0;i<5;i++)
cin>>*(px+i);//cada puntero ahora apunta al dato ingresado
for(int i=0;i<5;i++)cout<<*(px+i)<<" "<<(px+i)<<endl;
return 0;
}
Algo como :
- espacio solicitado con new, como new float[5] => asigna 5 espacios consecutivos!!!
- float *pa[5] no tiene new!! NO reserva espacio!! solo DECLARA UN ARREGLO DE PUNTEROS
La salida de este código sería para entradas 1,2,3,4,5,6,7,8,9,10
No hay NOMBRES de variables !!, Es un arreglo
de punteros!!