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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con correspondencia entre arreglos y punteros en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con correspondencia entre arreglos y punteros en C++  (Leído 3,318 veces)
retr02332

Desconectado Desconectado

Mensajes: 89


Learn, Imagine and Create.


Ver Perfil
Duda con correspondencia entre arreglos y punteros en C++
« en: 2 Junio 2020, 18:39 pm »

Hola a todos, de nuevo...

Me disculpo por preguntar dos veces seguidas, en realidad antes de preguntar de nuevo, me tome la molestia de googlear mucho. Pero realmente sentí que se contradecían las cosas, así que decido volver a preguntar, pero repito.. siento preguntar dos veces seguidas.

Bueno, el código es el siguiente:

Código:
#include<iostream>
using namespace std;

int main(){
    int numeros[] = {1,5,9,7,4,3};
    int *dir_numeros;

    dir_numeros = &numeros[0]; // Tambien, por simplicidad podemos colocar 'números', en lugar de '&numeros[0]'

    for(int i=0; i < 6; i++){
        cout<<*dir_numeros++;
    }

    /*
    cout<<*dir_numeros;
    dir_numeros++;
    cout<<*dir_numeros;
    */

    return 0;
}

Tanto lo que esta comentado, como el for que esta en el main, me imprimen lo siguiente:

Citar
159743

Lo que estoy haciendo, es simplemente mostrar los valores del arreglo, pero esta vez, haciendo uso de punteros.

Para no hacer esto tan largo, la duda de acuerdo a lo anterior es la siguiente:

int numero = 5;
int *dir_numero = &numero;

cout<<*dir_numero; "Esto imprime el valor"
cout<<dir_numero; "Esto imprime la dirección de memoria de la variable a la que apunta"

Teniendo eso claro, como es posible que en el for se use el ++ "de incremento" y este me imprima los valores del array?, es decir... Si uno se fija, ahí se esta usando el *, por lo que debería incrementar en uno dicho valor (1++) "porque la dirección que almaceno es la del primer elemento del array, por eso el 1".

En cambio, si vemos lo que esta comentado, es algo que hice yo, que funciona igual, pero que para mi tiene lógica. Porque esta vez lo que incremento es la dirección de memoria a la que apunta el puntero (mas que incrementar, es como seguir a la siguiente dirección de memoria, pues un arreglo almacena los datos de forma contigua, y claro... ahora sí recorrería el arreglo lógicamente.

entonces:

¿Porque el for hace lo mismo que lo que esta comentado, si este lo que incrementa es el valor del arreglo y no su dirección de memoria?

Muchas gracias, y perdón por extenderme.


« Última modificación: 2 Junio 2020, 18:49 pm por clay2332xd » En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Duda con correspondencia entre arreglos y punteros en C++
« Respuesta #1 en: 2 Junio 2020, 18:59 pm »

El operador ++ tiene mayor precedencia que el *, por lo que primero se incrementa el puntero y luego se "desreferencia". En cambio así:

Código
  1. (*dir_numeros)++

incrementas el valor.


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


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


Ver Perfil WWW
Re: Duda con correspondencia entre arreglos y punteros en C++
« Respuesta #2 en: 2 Junio 2020, 19:06 pm »

Teniendo eso claro, como es posible que en el for se use el ++ "de incremento" y este me imprima los valores del array?, es decir... Si uno se fija, ahí se esta usando el *, por lo que debería incrementar en uno dicho valor (1++) "porque la dirección que almaceno es la del primer elemento del array, por eso el 1".

A cout se le pasa como argumento *dir_numeros y despues se incrementa dir_numeros.

Distinto seria si hicieras:
Código
  1. cout<<(*dir_numeros)++;

¿Porque el for hace lo mismo que lo que esta comentado, si este lo que incrementa es el valor del arreglo y no su dirección de memoria?

El for tambien incrementa el puntero.



El operador ++ tiene mayor precedencia que el *, por lo que primero se incrementa el puntero y luego se "desreferencia".

Si eso fuera cierto el primer numero en salir seria 5 y el ultimo vaya uno a saber. que es lo que pasa con este codigo:

Código
  1. for(int i=0; i < 6; i++){
  2. ++dir_numeros;
  3.        cout<<*dir_numeros;
  4.    }

El codigo original es en realidad de este estilo:
Código
  1. 00007ff7`a615358a 488b442428      mov     rax,qword ptr [rsp+28h] ;rax=dir_numeros
  2. 00007ff7`a615358f 8b00            mov     eax,dword ptr [rax] ds:000000f1`867cfa40=00000001 ;eax=*dir_numeros
  3. 00007ff7`a6153591 89442424        mov     dword ptr [rsp+24h],eax
  4. 00007ff7`a6153595 8b542424        mov     edx,dword ptr [rsp+24h] ;p2
  5. 00007ff7`a6153599 488d0d70930e00  lea     rcx,[merr!std::cout (00007ff7`a623c910)] ;p1
  6. 00007ff7`a61535a0 e8dce0feff      call    merr!ILT+1660(??6?$basic_ostreamDU?$char_traitsDstdstdQEAAAEAV01HZ) (00007ff7`a6141681)
  7. 00007ff7`a61535a5 488b442428      mov     rax,qword ptr [rsp+28h] ;rax=dir_numeros
  8. 00007ff7`a61535aa 4883c004        add     rax,4 ;rax += 4 (es un int, 4 bytes)
  9. 00007ff7`a61535ae 4889442428      mov     qword ptr [rsp+28h],rax ;dir_numeros=rax
  10. 00007ff7`a61535b3 ebc3            jmp     merr!main+0x68 (00007ff7`a6153578)
« Última modificación: 2 Junio 2020, 19:19 pm por Eternal Idol » 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
RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Duda con correspondencia entre arreglos y punteros en C++
« Respuesta #3 en: 2 Junio 2020, 19:37 pm »

Cierto, fue un resbalón escribit que primero se incrementa. Lo que quise decir es que, dada la precedencia de operadores, primero se evalúa la expresión dir_numeros++ (que, al tratarse de postincremento, nos da el valor actual de dir_numeros), esto se desreferencia, y después se incrementa el puntero.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda Punteros Dobles/Array de punteros
Programación C/C++
MisterJava 2 5,167 Último mensaje 30 Diciembre 2012, 20:19 pm
por MisterJava
Arreglos,punteros y sprintf.-
Programación C/C++
DanielPy 4 2,839 Último mensaje 13 Diciembre 2013, 17:50 pm
por DanielPy
Arreglos entre clases - Ayuda porfavor!!
Java
tmpDash 6 2,532 Último mensaje 31 Julio 2014, 23:07 pm
por tmpDash
[C] (Consulta) Mezclando punteros y arreglos.
Programación C/C++
class_OpenGL 5 4,603 Último mensaje 16 Mayo 2016, 18:51 pm
por class_OpenGL
Asunto con punteros y arreglos en c
Programación C/C++
Jay 4 2,101 Último mensaje 5 Mayo 2019, 22:49 pm
por RayR
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines