8
votes

Qu'est-ce qui est imprimé? Pointeur C ++ à un entier

J'ai donc le code suivant (très simple): xxx

Voici ce que je pense je fais (j'ai appris qu'en C ++, je suis rarement faire ce que je pense que je pense):

  1. Création d'un pointeur sur un entier et en appelant pinte
  2. L'énoncéa imprime l'adresse de la valeur "32 '
  3. L'énoncéb imprime la valeur entière en cours de pointe par mon pointeur (qui est terminée parce que je déréférencière le pointeur, me donnant ainsi accès à ce qu'il pointe de).
  4. LeditCC imprime l'adresse du pointeur lui-même (pas l'adresse de la valeur entière '32').

    est tout cela correct?


0 commentaires

3 Réponses :


10
votes

Votre deuxième déclaration est fausse. Vous allouez un nouveau Int hors du tas. La constante de la compilation «32» n'a pas d'adresse et vous ne pouvez donc pas le prendre. Vous créez une INT dont la valeur est 32. Ce n'est pas la même chose.

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


5 commentaires

Si la variable a été définie comme int valeur = 32; Vous seriez correct. Cependant, y compris la constante dans le constructeur en fait un objet. Si vous avez fait cela, la variable serait optimisée à un const int .


Que voulez-vous dire par "en fait un objet"?


C'est une distinction très subtile, mais pour une compréhension complète, il est nécessaire de le signaler. Je pense que le libellé correct serait "2. énoncéa imprime l'adresse d'un int qui contient la valeur" 32 "".


@Mark Ransom: J'ai réparé mon message pour refléter votre déclaration. @Deadmg: Si, par exemple, votre code a été écrit, je pourrais exprimer l'égalité des valeurs pointées de cette manière: (* pint1 == * pint2). Est-ce correct?


@Storm Kiernan: Oui, c'est correct et votre déclaration modifiée est également correcte.



0
votes

L'instruction B imprime la valeur de l'objet qui pinte pointe. Il pointe vers un int avec la valeur 32, de sorte qu'il imprime 32.

Les déclarations A et C sont indéfinies. L'objet étant imprimé dans les deux cas est un pointeur, qui au niveau de la machine est une adresse mémoire. La plupart des compilateurs imprimeront un nombre hexadécimal, bien qu'il n'y ait aucune garantie qu'il le fera. La valeur dépendra également de l'endroit où les objets sont stockés. Par exemple, g ++ dans Windows Vista 32 bits sur mes impressions de mon ordinateur: P>

00131D10
32
0028FE24


0 commentaires

2
votes
  • Imprimez l'adresse de la mémoire de PINT, qui pointe vers une région de mémoire (4 octets) contenant la valeur 32:

    std :: COUT << PINT << STD :: endl; // déclaration A

    • Imprimez le contenu de cette adresse mémoire:

      std :: COUT << * PINT << STD :: endl; // déclaration B, qui devrait imprimer 32

      • Imprimez l'adresse de la mémoire du pointeur lui-même:

        std :: COUT << & PINT << STD :: endl; // déclaration C


0 commentaires