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

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Bloques de memoria en C++ [Duda de Concepto]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Bloques de memoria en C++ [Duda de Concepto]  (Leído 6,831 veces)
tmb90

Desconectado Desconectado

Mensajes: 35


Ver Perfil
Bloques de memoria en C++ [Duda de Concepto]
« en: 9 Septiembre 2014, 21:29 pm »

Hola tengo una pregunta.

Para guardar cierta cantidad de bytes en la memoria de mi ordenador utilizo la memoria dinámica y hago lo siguiente.

char * bloque;
bloque = new char[cantbytes];

Quisiera saber por qué tengo que  definir a "bloque" como un puntero.


« Última modificación: 9 Septiembre 2014, 21:34 pm por tmb90 » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Bloques de memoria en C++ [Duda de Concepto]
« Respuesta #1 en: 9 Septiembre 2014, 21:40 pm »

Quisiera saber por qué tengo que  definir a "bloque" como un puntero.
Porque el resultado del operador new es la dirección en memoria donde se localiza el objeto creado (en tu caso un array de "cantbytes" caracteres), esa dirección se debe almacenar en una variable de tipo puntero porque en C y C++ "puntero" es el termino técnico para "dirección en memoria".

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
tmb90

Desconectado Desconectado

Mensajes: 35


Ver Perfil
Re: Bloques de memoria en C++ [Duda de Concepto]
« Respuesta #2 en: 10 Septiembre 2014, 02:13 am »

¿Entonces por qué cuando le asigno los bytes a mi bloque no lo hago así: ?

file.read(*bloque, size);

en lugar de tener que hacerlo así:

file.read(bloque, size);
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Bloques de memoria en C++ [Duda de Concepto]
« Respuesta #3 en: 10 Septiembre 2014, 02:59 am »

Porque el primer argumento de la función miembro read es la dirección en memoria de (un puntero a) el bloque y el segundo el numero de caracteres a leer.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
kaiserr

Desconectado Desconectado

Mensajes: 242


constancia y dedicacion


Ver Perfil
Re: Bloques de memoria en C++ [Duda de Concepto]
« Respuesta #4 en: 10 Septiembre 2014, 03:27 am »

Porque el primer argumento de la función miembro read es la dirección en memoria de (un puntero a) el bloque y el segundo el numero de caracteres a leer.

Un saludo

Es decir, como ya has definido bloque como un puntero, no le tienes que volver a decir que es un puntero.
Si hicieras esto --> *bloque
Equivaldria a esto --> **bloque
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Bloques de memoria en C++ [Duda de Concepto]
« Respuesta #5 en: 10 Septiembre 2014, 09:53 am »

*bloque no equivale a **bloque, *bloque es una indireccion valida y **bloque no ya que bloque no es un doble puntero. El Operador de desreferencia no dice que algo es un puntero.

Esto file.read(*bloque, size); no corresponde ya que le pasaria un CARACTER al metodo read (el primero) y es equivalente a file.read(bloque[0], size);, como ya te explico correctamente rir3760 el metodo en cuestion no recibe un caracter sino un puntero a caracter y esto es asi para poder modificar el bloque de memoria (si le pasas un caracter y no una direccion no puede adivinar donde poner el resultado de la lectura).
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
kaiserr

Desconectado Desconectado

Mensajes: 242


constancia y dedicacion


Ver Perfil
Re: Bloques de memoria en C++ [Duda de Concepto]
« Respuesta #6 en: 11 Septiembre 2014, 03:07 am »

mmmmm pero yo me referia a que si a la funcion le pasas *bloque , es como si estuvieras pasandole **bloque... porque bloque ya esta definido como *bloque, no se si me explico.

Quizas la palabra equivale estaba mal puesta ahi, mejor decir es como...
Si sigo equivocado corregirme :) :-X
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Bloques de memoria en C++ [Duda de Concepto]
« Respuesta #7 en: 11 Septiembre 2014, 10:18 am »

No, no entiendo que queres explicar y sospecho que no leiste el enlace que deje sobre el operador de desreferencia. Si la variable no fuera un puntero (char bloque) no la podrias desreferenciar ... y como no es un doble puntero no la podes desrefenciar dos veces.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Bloques de memoria en C++ [Duda de Concepto]
« Respuesta #8 en: 11 Septiembre 2014, 11:24 am »

Si tenemos 'char** bloque', entonces:

  • 'bloque' es un puntero doble a char
  • '*bloque' es un puntero a char
  • '**bloque' es un char

Se ve entonces claramente que '*bloque' no es lo mismo que '**bloque'

Ejemplo 1:

Código
  1. void funcionInutil( char bloque )
  2. {
  3.  bloque = 'a';
  4. }
  5.  
  6. void funcionUtil( char* bloque )
  7. {
  8.  *bloque = 'a';
  9. }
  10.  
  11. int main( )
  12. {
  13.  char bloque = '0';
  14.  
  15.  funcionInutil( bloque );
  16.  printf( "%c", bloque );
  17.  
  18.  funcionUtil( &bloque );
  19.  printf( "%c", bloque );
  20. }

Ejemplo 2:

Código
  1. void funcionInutil( char *bloque )
  2. {
  3.  bloque = malloc( 20, 1 );
  4.  
  5.  // Imprime la dirección de memoria que acaba de reservar
  6.  printf( "%d\n", bloque );
  7. }
  8.  
  9. void funcionUtil( char **bloque )
  10. {
  11.  *bloque = malloc( 20, 1 );
  12.  
  13.  // Imprime la dirección de memoria que acaba de reservar
  14.  printf( "%d\n", *bloque );
  15. }
  16.  
  17. int main( )
  18. {
  19.  char *bloque = NULL;
  20.  
  21.  funcionInutil( bloque );
  22.  
  23.  // Imprimirá 0, 'bloque' se ha pasado por copia, luego su valor no se puede modificar
  24.  printf( "%d\n", bloque );
  25.  
  26.  funcionUtil( &bloque );
  27.  
  28.  // Ahora si se ha podido modificar 'bloque' porque se ha pasado por referencia.
  29.  printf( "%d\n", bloque );
  30. }

Espero que con estos ejemplos quede un poco más claro el tema de los punteros, las referencias y las desreferencias.
En línea

kaiserr

Desconectado Desconectado

Mensajes: 242


constancia y dedicacion


Ver Perfil
Re: Bloques de memoria en C++ [Duda de Concepto]
« Respuesta #9 en: 11 Septiembre 2014, 14:01 pm »

No, no entiendo que queres explicar y sospecho que no leiste el enlace que deje sobre el operador de desreferencia. Si la variable no fuera un puntero (char bloque) no la podrias desreferenciar ... y como no es un doble puntero no la podes desrefenciar dos veces.

si lo lei  :) y entiendo el funcionamiento de los operadores de desferencia (quizas no tan bien como otros), pero a lo que yo me referia es:
Si se declara char *bloque; y luego una funcion necesita que se le pase un puntero:
read(bloque)
Hasta aqui bien no?
Pero si le pasamos por error read(*bloque), teniendo char *bloque... no seria lo mismo que tener char **bloque y pasarle read(bloque)
 :-X
 
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda del concepto de redes y el uso de Whireshark
Hacking
Spidersam 3 3,663 Último mensaje 27 Diciembre 2009, 14:03 pm
por tragantras
[DUDA] Acerca de Memoria Virtual Y Memoria Fisica Entre otros...
Programación C/C++
x64core 9 7,312 Último mensaje 28 Noviembre 2011, 17:20 pm
por x64core
Duda - Concepto de Maquina Virtual
ASM
$Edu$ 9 5,693 Último mensaje 23 Abril 2012, 18:25 pm
por Eternal Idol
Duda registros,memoria principal y memoria caché
Hardware
Senior++ 2 3,365 Último mensaje 9 Mayo 2014, 10:16 am
por Senior++
Duda de concepto directivas AngularJS
Desarrollo Web
str_null 2 2,512 Último mensaje 24 Agosto 2015, 22:46 pm
por str_null
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines