2011-05-12 25 views
8

Así que tengo la (muy simple) siguiente código:¿Qué se está imprimiendo? C++ puntero a un entero

int* pInt = new int(32); 

std::cout<< pInt << std::endl; //statement A 
std::cout<< *pInt << std::endl; //statement B 
std::cout << &pInt << std::endl; //statement C 

Así que esto es lo que que que estoy haciendo (He aprendido que en C++ estoy rara vez haciendo lo que pienso estoy haciendo):

  1. Creación de un puntero a un entero y decir que es medio litro
  2. statementA imprime la dirección del valor '32'
  3. statementB imprime el valor entero que mi puntero apunta hacia él (lo cual se hace porque desreferencia el puntero, lo que me da acceso a lo que apunta).
  4. instrucciónC imprime la dirección del puntero en sí (no la dirección del valor entero '32').

¿Es todo esto correcto?

Respuesta

10

Su segunda afirmación es incorrecta. Usted asigna un nuevo int fuera del montón. La constante de tiempo de compilación "32" no tiene una dirección, y por lo tanto no puede tomarla. Usted crea un int cuyo valor es 32. Esto no es lo mismo.

int* pInt1 = new int(32); 
int* pInt2 = new int(32); 

pInt1 y pInt2 no son iguales.

Oh, una última cosa: C++ es un lenguaje muy fuertemente tipado, y es bastante innecesario prefijar nombres de variables con datos de tipo. Esto se denomina notación húngara, es muy común en las bibliotecas y muestras de Microsoft C, pero generalmente es innecesario aquí.

+0

Si la variable se define como int * Valor = 32; estarías en lo correcto Sin embargo, incluir la constante en el constructor lo convierte en un objeto. Si hiciste eso, entonces la variable se optimizaría a una const int *. – monksy

+0

¿qué quieres decir con "lo convierte en un objeto"? –

+6

Es una distinción muy sutil, pero para una comprensión completa es necesario señalarlo. Creo que la redacción correcta sería "2. statementA imprime la dirección de un' int' que contiene el valor '32' ". –

0

La declaración B imprime el valor del objeto al que apunta pInt. Apunta a un int con el valor 32, por lo que imprime 32.

Las declaraciones A y C no están definidas. El objeto que se imprime en ambos casos es un puntero, que a nivel de máquina es una dirección de memoria. La mayoría de los compiladores imprimen un número hexadecimal, aunque no hay garantía de que lo haga. El valor también dependerá de dónde se almacenan los objetos. Por ejemplo, g ++ de 32 bits de Windows Vista en mi computadora imprime:

0x900ee8 
32 
0x22ff1c 

impresiones de Borland:

016E33B0 
32 
0012FF50 

Visual C++ impresiones

00131D10 
32 
0028FE24 

Es probable que obtener resultados diferentes. El primer número es la dirección asignada por new int() del montón y se guarda en pInt. Se asignó una matriz de 4 bytes, almacenó el número 32 allí y almacenó la dirección en pInt. El segundo número es el valor almacenado, interpretado como un int. El tercer número es la dirección (en la pila) de pInt.

2
  • Imprimir la dirección de memoria de pinta, que apunta a una región de la memoria (4 bytes) que contiene el valor 32:

std::cout<< pInt << std::endl; //statement A

  • imprimir el contenido de esa dirección de memoria :

std::cout<< *pInt << std::endl; //statement B, which should print 32

  • Imprimir la dirección de memoria del indicador sí mismo:

std::cout << &pInt << std::endl; //statement C

Cuestiones relacionadas