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!!