[C con Clase] Puntero a Array

Marving jr.marving en gmail.com
Jue Abr 3 15:29:53 CEST 2014


El pasado 2014-04-01 18:00:41, Steven Davidson escribió:
 
SD> Hola Marving,
SD> 2014-04-01 11:59 GMT-04:00 Marving <jr.marving en gmail.com>:
SD> > Soy nuevo en esto de c++. Tratando de conseguir algo de confianza con los
SD> > punteros, tropezé con la preferencia entre * y [] y de ahí surgió.
SD> >
SD> > int (*ptr0) [5];
SD> >
SD> > Parece ser que esto es Puntero a un array  de 5 entero
SD> >
SD> Correcto.
SD> Pero no entiendo el concepto.
SD> > En el siguiente programa si intento apuntar a un array de 5 enteros como es
SD> > int array[5] con ptr0 de este modo
SD> >          int (*ptr0) [5] = array;
SD> > obtengo
SD> >          cannot convert 'int*' to 'int (*)[5]' in initialization
SD> >
SD> >
SD> Obviamente los tipos no concuerdan.
SD> Intenta hacer esto:
SD> int tabla[10][5];
SD> int (*pa)[5] = tabla;
SD> Te puede venir bien a la hora de pasar arrays 2D a una función; por ejemplo,
SD> void func( int (*pa)[5] );
SD> ...
SD> func( tabla );
SD> Sinceramente, esto no es algo que se suele hacer en la práctica, pero como
SD> ejercicio viene bien para entender los punteros y los arrays.
SD> Espero que esto te aclare las dudas.
SD> Steven
SD> _______________________________________________
SD> Lista de correo Cconclase Cconclase en listas.conclase.net
SD> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
SD> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ

Hola Steven
Gracias por tu rápida respuesta.
La verdad es que no se aclararon mis dudas. Pero no te preocupes no fue debido
a tu explicación. No comprendía nada de tu contestación, ayer.
Entendía la arrays de dos dimensiones, pero no manejaba los punteros para este tipo de arrays.
Partiendo de esto
int vector[4];
int array_2D[3][4]

A veces asociaba la idea de vector, como puntero de arrays de 5 enteros.
Seguidamente, array_2D, era para mi un puntero a un array de dos dimensiones.
Parece ser que estaba equivocado.

Lo cierto parece ser que es
vector es simplemente un puntero a un entero. Apunta a los elementos del array
array_2D es un puntero a arrays unidimensionales de 4 elementos
array_2D[3][4]     son 3 arrays unidimensionales de 4 elementos

Y si el programa este es correcto. Creo que ya habré captado la idea.
No se hasta cuando,... espero por lo menos hasta el final del día.

int vector[4] = {10,20,30,40};
    int matriz_2D[3][4] = 
    {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9,10,11,12}
    };
    
    // vector es puntero constante de tipo  --entero--
    // vector apunta vector[0]
    int* ptr = vector;       // ptr =  &vector[0]
    cout << ptr << " ";
    ptr =  &vector[0];
    cout << ptr << " \n";
    for (int i = 0; i < 4; i++)
    {
        cout << *(ptr + i) << " ";
    }
    cout << "\n---------------\n";
    
    // matriz_2D [3][4] son 3 array unidimensionales de 4 elementos
    // matriz_2D es un puntero constante de tipo --vector 4 elementos enteros-- 
    // matriz_2D apunta a un vector de 4 elementos
    // matriz_2D apunta a matriz_2D[0]
    int (*ptr_v)[4] = matriz_2D;      // ptr_v = &matriz_2D[0] 
    cout << ptr_v << " ";
    ptr_v = &matriz_2D[0];
    cout << ptr_v << " ";
    cout << &matriz_2D[0][0] <<"\n";
    cout << "-------------\n";
    
    for (int i = 0; i < 3; i++) 
    {   
        //   Apunta a vectores
        //   ptr_v + i          -- &matriz_2D[0]--&matriz_2D[1]--&matriz_2D[2]
        
        //   Apunta a elementos del vector
        //   *(ptr_v + i)       -- Direccion de los elementos del vector 
        
        ptr = *(ptr_v + i);
        for (int j = 0; j < 4; j++)
        {
                cout <<  *(ptr + j) << " ";
        }
        cout << "\n";
    }
    
    cout << "----------------------Directamente---------------------\n";
    ptr_v = matriz_2D;
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 4; j++)
            cout << *(*(ptr_v + i) + j) << " ";
        cout << "\n";
    }

Saludos
    


Más información sobre la lista de distribución Cconclase