2011-07-22 9 views
7

Mis disculpas, sé que hay un millón de preguntas en punteros, matrices, etc. aunque tan básico como esto es que no puedo encontrar nada que apunte (¡ja, ja!) A una respuesta.Obteniendo la dirección de un puntero

Tengo un puntero que se inicializa para apuntar a un trozo de memoria, entiendo que puedo acceder a esta memoria similar a cómo iba a una matriz:

char *mMem=new char[5000]; 
cout<<mMem[5]<<endl; 

¿Qué es en realidad:

char *mMem=new char[5000]; 
cout<<*(mMem+5)<<endl; 

lo que no entiendo es sin embargo cómo obtener la dirección de un elemento - soy consciente de que el elemento no es la palabra adecuada teniendo en cuenta MMEM no es una matriz - eso es si mi entendimiento es correcto, aunque no puedo estar muy seguro porque parece que cada sitio usa las palabras que quiere cuando se trata de punteros y matrices. Por lo tanto, si tengo:

char *mMem=new char[5000]; 
cout<<mMem[5]<<endl; 
    or 
cout<<*(mMem+5)<<endl; 

¿Por qué la dirección del operador no funciona correctamente:

cout<<&mMem[5]<<endl; 

En lugar de obtener la dirección del 5º elemento, puedo obtener una copia impresa de los contenidos de bloques de memoria desde ese elemento en adelante. Entonces, ¿por qué la dirección del operador no funcionaba como esperaba y cómo puedo obtener la dirección de un elemento de la memoria?

Respuesta

14

&mMem[5]es la dirección del 5 ° elemento. La razón por la que obtiene una impresión de la memoria desde allí es porque tipo de &mMem[5] es char*, pero las cadenas en C heredado también son de char*, por lo que el operador << simplemente piensa que desea imprimir una cadena desde allí. Me gustaría probar la fundición del puntero a una void* antes de imprimir:

cout << static_cast<void*>(&mMem[5]) << endl; 

Por cierto, &mMem[5] y mMem+5 son lo mismo.

4

Obtiene la dirección del elemento 5 como esperaba, pero la funcionalidad de impresión cout para char * es imprimir el contenido de la cadena en esa ubicación de memoria, no el valor del puntero.

Lanza el puntero a un int: cout << (int)&mMem[5]; y deberías obtener la dirección impresa.

Cuestiones relacionadas