elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Representación visual de punteros y punteros a punteros..
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Representación visual de punteros y punteros a punteros..  (Leído 4,884 veces)
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Representación visual de punteros y punteros a punteros..
« en: 2 Mayo 2019, 17:48 pm »

Muy buenas..

Entiendo como funcionan los punteros y los punteros a punteros (según el dibujo adjunto que he realizado, si hay algo malo, corregidme por favor)..



Pero como quedaría dibujada el siguiente puntero doble?

Código
  1. int ** matriz = new int[10][10];
  2.  

Es un puntero a un puntero, pero almacena una matriz bidimensional, no logro visualizar como sería el mapa en la memoria... como seria?

Gracias.
Saludos..


En línea

Dungeons & dragons;
dragons.Attack();
RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Representación visual de punteros y punteros a punteros..
« Respuesta #1 en: 2 Mayo 2019, 19:42 pm »

No quedaría de ninguna forma, porque tu código ni siquiera compilaría. Sería más bien:

Código:
int **matriz = new int*[10];
for(int i = 0; i < 10; i++)
    matriz[i] = new int[10];

Lo que tendrías es: el puntero matriz en la pila, apuntando al inicio de un bloque (localizado en el heap) de 10 punteros, cada uno de los cuales apuntaría al inicio de un bloque de 10 enteros, ubicados también en el heap.


En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Representación visual de punteros y punteros a punteros..
« Respuesta #2 en: 2 Mayo 2019, 20:18 pm »

Gracias..

Entonces la representación visual sería así?

En línea

Dungeons & dragons;
dragons.Attack();
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Representación visual de punteros y punteros a punteros..
« Respuesta #3 en: 2 Mayo 2019, 20:39 pm »

No. Esto último sería una matriz de matrices, no una matriz bidimensional.

Una matriz bidimensional es lo mismo que una matriz unidimensional, solo que está particionado el espacio:

Matriz unidimensional de 16 elementos:  0-15
|00,01,02,03,04,5,06,07,08,09,10,11,12,13,14,15|

Matriz bidimensional de 4x4 elementos: =0-3x0-3
|00,01,02,03|00,01,02,03|00,01,02,03|00,01,02,03|
Así calcular el puntero absoluto de una dimensión es realtivo al puntero absoluto del primer ítem del array...

Además piensa que el puntero, apunta a una estructura y es en dicha estructura donde se apunta al primer elemento de la matriz.
Sería algo así:
array x ----> estructura safeArray ----> puntero al array.

La estructura mantiene los datos básicos del array. Como el tipo de datos que aloja y cuantos bytes por elemento utiliza así como un simple array de las dimensiones en que se subdivide el array, etc...

Código:
typedef struct tagSAFEARRAY {
  USHORT         cDims;
  USHORT         fFeatures;
  ULONG          cbElements;
  ULONG          cLocks;
  PVOID          pvData;   // puntero a los datos del array
  SAFEARRAYBOUND rgsabound[1]; // otra estructura con dos elementos, el valor del índice menor y la cantidad de elementos.
} SAFEARRAY, *LPSAFEARRAY;
« Última modificación: 2 Mayo 2019, 20:44 pm por NEBIRE » En línea

Loretz

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: Representación visual de punteros y punteros a punteros..
« Respuesta #4 en: 2 Mayo 2019, 20:49 pm »

Aprovechando que este es un tema un poco recurrente, creo que este programita puede ayudar a aclarar un poco dónde están las cosas. Puedes convertir las salidas en hexadecimal a decimal si te resulta más cómodo (calculadora de Windows o la que te guste) y ver que los punteros están realmente lejos unos de otros.

Código
  1. #include <iostream>
  2.  
  3. int main()
  4. {
  5.    const char* puntero_probablemente_a_zona_de_solo_lectura = "hola";  // segmento "data" en el ejecutable
  6.    std::cout << "apunta al string literal: \"" << puntero_probablemente_a_zona_de_solo_lectura << "\"\n";
  7.    std::cout << "su direccion es: "
  8.        << (void*)puntero_probablemente_a_zona_de_solo_lectura << "\n\n";
  9.  
  10.    const char* puntero_a_heap = new char[6] { "adios" };  // asignación "dinámica" en heap, usa new / delete
  11.    std::cout << "apunta a la C string en heap: \"" << puntero_a_heap << "\"\n";
  12.    std::cout << "su direccion es: "
  13.        << (void*)puntero_a_heap << "\n\n";
  14.    delete[] puntero_a_heap;
  15.  
  16.    char ch = 'a';
  17.    const char* puntero_a_stack = &ch;  // en el stack frame de main
  18.    std::cout << "apunta al char en stack: \'" << *puntero_a_stack << "\'\n";
  19.    std::cout << "su direccion es: "
  20.        << (void*)puntero_a_stack << "\n\n";
  21.  
  22. }

En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Representación visual de punteros y punteros a punteros..
« Respuesta #5 en: 2 Mayo 2019, 20:50 pm »

Sí, sería como la pusiste. Obviamente estamos hablando de punteros, y en concreto, un puntero a punteros para simular matrices de manera dinámica. En una matriz "real" (arreglo bidimensional):

Código:
int matriz[10][10];

la memoria es toda contigua y existe en la pila, pero evidentemente, y desde que estás hablado de punteros a punteros, no es a lo que te refieres. A menos que te haya entendido mal.
En línea

Loretz

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: Representación visual de punteros y punteros a punteros..
« Respuesta #6 en: 2 Mayo 2019, 21:09 pm »

RayR; hay una falta de ortografía en tu ejemplo:

Código:
int **matriz = new int*[10];
for(int i = 0; i < 10; i++)
    matriz[i] = new int[10];

debería ser:
Código:
int** matriz = new int* [10];
    for (int i = 0; i < 10; i++)
        matriz[i] = new int; // sin el [10]

Amplío un poco el ejemplo que muestra un ciclo completo:

Código:
#include <iostream>

int main()
{
    // puntero a un array de 10 punteros a int
    int** matriz = new int* [10];
    for (int i = 0; i < 10; i++)
        matriz[i] = new int{i};  // cada uno de esos 10 punteros con valores inicializados con el indice i.

    // a ver...
    for (int i = 0; i < 10; ++i)
        std::cout << *matriz[i] << '\n';
    std::cout << '\n';

    // deletes:
    for (int i = 0; i < 10; ++i)
        delete[] matriz[i];
    delete[] matriz;
   
}
En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Representación visual de punteros y punteros a punteros..
« Respuesta #7 en: 2 Mayo 2019, 21:20 pm »

Código:
[quote author=Loretz link=topic=495255.msg2191896#msg2191896 date=1556824168]
RayR; hay una falta de ortografía en tu ejemplo:

No. Es tal cuál lo puse. Reitero, yo me estoy guiando en lo que digimikeh pidió, que es un tamaño de 10x10.
En línea

Loretz

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: Representación visual de punteros y punteros a punteros..
« Respuesta #8 en: 2 Mayo 2019, 22:36 pm »


No. Es tal cuál lo puse. Reitero, yo me estoy guiando en lo que digimikeh pidió, que es un tamaño de 10x10.

Ah, Ok, cierto.
En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Representación visual de punteros y punteros a punteros..
« Respuesta #9 en: 3 Mayo 2019, 15:51 pm »

Perfect.. perfect, me queda todo muy claro...

Y que pasa en el caso de los punteros a funciones?.. al no usar el operador new, dudo que un puntero a función tenga que apuntar a la memoria dinámica... entonces estaría apuntando a una dirección de la pila o de algún registro o algo parecido?

Código
  1.  
  2. int sumar (int x, int y){
  3.     return x + y;
  4. }
  5.  
  6. int (* pSumar) (int)(int) = sumar;
  7.  

pSumar en este caso esta apuntando siempre a una direccion del stack?..


Gracias nuevamente..
« Última modificación: 3 Mayo 2019, 15:54 pm por digimikeh » En línea

Dungeons & dragons;
dragons.Attack();
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
punteros
Programación Visual Basic
bautistasbr 4 2,283 Último mensaje 30 Septiembre 2005, 19:35 pm
por NYlOn
Duda Punteros Dobles/Array de punteros
Programación C/C++
MisterJava 2 5,203 Último mensaje 30 Diciembre 2012, 20:19 pm
por MisterJava
Punteros dobles / Punteros a puntero.
Programación C/C++
NOB2014 5 8,470 Último mensaje 13 Abril 2016, 16:00 pm
por MAFUS
(Consulta) Punteros a punteros en C
Programación C/C++
class_OpenGL 1 2,042 Último mensaje 19 Julio 2016, 14:29 pm
por class_OpenGL
Consulta sobre punteros y doble punteros
Programación C/C++
palacio29 4 3,426 Último mensaje 17 Mayo 2019, 20:40 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines