none
Punteros II RRS feed

  • Pregunta

  • Visual C++ 2008

    Hola a todos

    1º ¿Cuál es la forma correcta de declarar punteros?

    int*  p;  ó   int  *p;

    ¿Existe alguna diferencia?

    2º ¿Por qué el valor de la dirección de la variable a la que apunta un puntero es siempre la misma, aún si cierro el VS2008 y lo vuelvo a abrir? Por ejemplo siempre me da, para una variable, la dirección 0012FF60. ¿No se supone que al ir utilizando recursos y/o programas, se asignan dinámicamente las "celdas" de memoria?

    Desde ya Muchísimas Gracias


    -- Skar.2007
    lunes, 7 de febrero de 2011 18:05

Todas las respuestas

  • 1º Las dos son correctas, incluso "int*p;", sin espacios es correcto. Es cuestión de gustos. Yo prefiero la segunda, la veo más clara para el lector, sobre todo si utilizas expresiones como:

    int*  a, b; // b es int no int*, es confuso

    int  *a, b; // *a es int, b es int, es más consistente

    2º Si la dirección la obtienes de un new y haces todos los new y delete en el mismo orden y del mismo tamaño, generalmente suelen coincidir. Pero es irrelebante. Tu programa no debe depender del valor de un puntero, debe depender del contenido de la memoria apuntada. Haz la prueba haciendo un new 'fantasma' antes y verás que obtienes otro valor. Si la dirección la obtienes con & de una variable declarada, mientras no declares una variable antes de esa variable, o cambies el tamaño de alguna variable anterior a esa, el compilador también suele colocar las variables de la misma manera a cada compilación y obtienes la misma dirección. Igual que antes, cambia el orden de declaración de las variables y obtendrás una dirección diferente.

     

    martes, 8 de febrero de 2011 6:52
  • 1.- Yo uso también la segunda, pero sin embargo para las referencias (int& a) uso la primera. Cuestión de gustos. :-)

    2.- Eso ocurre porque las direcciones de memoria en cada proceso son virtuales y locales. Es decir, aunque tu veas 0012FF60, la real física será cualquier otra. Ahora bien, eso ocurre sólo en XP y anteriores. En Vista y siete, si se tiene activo el ASLR (Y el compilador es compatible con ello), en cada ejecución las direcciones son diferentes, de modo que es mucho más difícil inyectar código binario aprovechando desbordamientos de buffer o ineyctando DLLs malignas en el espacio de direcciones...


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    viernes, 11 de febrero de 2011 17:10
    Moderador