[C con Clase] Pregunta sobre Punteros dobles

Davidson, Steven srd4121 en njit.edu
Jue Sep 19 05:46:54 CEST 2013


Hola Edwin,

2013/9/18 Edwin Alexander Bohorquez Gamba <edwinprogramacion en hotmail.es>

> Hola,  tengo una pregunta a cerca de punteros y es la siguiente:
> Por favor corrijanme si lo que digo esta mal:
>

Muy bien; así lo haremos.

--------------------------------------------------------
> Pasamos un apuntador por valor:
>
>
Correcto.

--------------------------------------------------------
> Pasamos un apuntador por referencia:
>

>

Correcto.

--------------------------------------------------------
> Pero me surge una duda:
>
> struct lista{
> //miembros..
> };
>
> ¿ Esta es una forma de pasar un apuntador por referencia o por valor?
> void funcion( lista   **nuevo ){
>

Técnicamente, pasamos la dirección de memoria del puntero (o apuntador) por
valor. Es decir, copiamos la dirección de memoria del puntero a 'nuevo'. En
tu ejemplo, el resultado es:

lista **nuevo = &puntero;

//realiza alguna operacion...
> }
>
> int main()
> {
> lista  *puntero;
> //...
> funcion( &puntero );
> }
>
> que sentido tiene recibir como parametro un doble apuntador ?
>

En C, al no haber paso por referencia, la manera de emular tal
comportamiento es pasando la dirección de memoria de la variable. En C++,
no es tan necesario hacer esto para el mismo caso, porque tenemos el paso
por referencia.

Ahora bien, el uso importante del puntero en C/C++ es con el tema de la
adjudicación dinámica de memoria. Por ejemplo,

void func( int **ptr, int nFilas, int nCols );
...
// Tabla de N x M
int **pTabla = new int*[N];

for( int i=0; i<N; i++ )
  pTabla[i] = new int[M];

func( pTabla, N, M );

Lo mismo podríamos decir de una "tabla 3D". La idea es que un puntero
apunta - valga la redundancia - a un array de punteros, los cuales apuntan
a sus respectivos arrays de punteros, y así sucesivamente. Por ejemplo,

int *****************ptr;

ptr = new int ****************[10];

ptr[0] = new int ***************[5];
ptr[1] = new int ***************[15];
ptr[2] = new int ***************[20];
...
ptr[0][0] = new int **************[50];
ptr[0][1] = new int **************[25];
...

Obviamente, es un ejemplo extremo, pero válido.


Otro uso importante en C++ es cuando queremos manipular objetos
polimórficos. Un doble puntero aparecería si queremos una lista de objetos
polimórficos. Por ejemplo,

class Base
{
public:
  virtual ~Base();
...
};

class Der : public Base  {...};
...

Base **pLista = new Base*[10];

pLista[0] = new Base;
pLista[1] = new Der;
pLista[2] = new Der;
pLista[3] = new Base;
pLista[4] = new Base;

Si pasamos el array a una  función, tendremos que pasar un doble puntero,
aunque en realidad se trata de un puntero a un objeto polimórfico, el cual
se representa como un puntero a una clase base.

y que aplicaciones tienen los apuntadores dobles en las listas enlazadas ?
>

En C++, no son necesarios para implementar una lista enlazada.

-------------------------------------------------------------------------------------------------------------
> Me podrian explicar como manejar los apuntadores dobles ?, por ejemplo:
>
> int main()
> {
> int a=10;
> int **ptr;
> *ptr = &a;
>

Esto es peligroso, porque 'ptr' no apunta a nada deseado. Deberíamos crear
memoria o apuntar a un puntero que ya exista. Por ejemplo,

int **ptr = new int*;
*ptr = &a;

O si lo prefieres,

int *pa = &a;
int **ptr = &pa;

**ptr = **p + 5;
>

Sospecho que querías escribir:

**ptr = **ptr + 5;

cout<<ptr<<"\n";
> cout<<*ptr<<"\n";
> cout<<**ptr<<"\n";
> system("pause");
> }
> Veo que para este tipo de apuntadores, la forma de manipular el contenido
> es con:  **ptr;
> y para manipular la direccion es *p . Por favor me podrian aclarar este
> ejemplo?
>
>
La variable 'ptr' guarda la dirección de memoria de un puntero, previamente
creado. Piensa que un puntero implica un nivel de indirección, porque
indirectamente tratamos el valor guardado en memoria. Por lo tanto, un
doble puntero supone dos niveles de indirección; triple puntero implica
tres niveles, y así sucesivamente.

De antemano muchas Gracias por su respuesta y por el Curso de C++ .
> Gracias  Steven R. Davidson, y Salvador Pozo por sus grandes aportes a la
> programacion.
>
>
De nada; para eso estamos :)


Espero que todo esto aclare las dudas.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130918/bd12c826/attachment.html>


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