2017-10-18 14 views
-2

considère que ce programme C++:conflit en C++ entre l'adresse du pointeur et l'adresse mémorisée dans le pointeur

#include<iostream> 
using namespace std; 

int main() { 
    int x = 7; 
    int *ip = &x; 
    cout << "the value of x is " << x <<endl; 
    cout << "the address of x is " << &x <<endl; 
    cout << "the address stored at ip is "<< ip <<endl; 
    return 0; 
} 

Voici ce que je reçois en sortie:

the value of x is 7 
the address of x is 0x28ff08 
the address stored at the pointer is 0x28ff08 

Cela me paraît logique . Cependant, si je change le code à ce qui suit, je reçois un autre ensemble de sorties:

#include<iostream> 
using namespace std; 

int main() { 
    int x = 7; 
    int *ip = &x; 
    cout << "the value of x is " << x <<endl; 
    cout << "the address of x is " << &x <<endl; 
    cout << "the address of the ip itself is "<< &ip <<endl; 
    return 0; 
} 

Maintenant, je reçois cette sortie:

the value of x is 7 
the address of x is 0x28ff0c 
the address of the ip itself is 0x28ff08 

Dans le premier code, l'adresse la variable x et l'adresse stockée au pointeur ip sont les mêmes, ce qui est logique pour moi. Mais dans le second programme, l'adresse de ip reste la même, mais l'adresse de x semble changer, ce que je trouve confus. Je m'attendais à ce que l'adresse de la variable x reste la même que dans le premier programme et pour que l'adresse du pointeur change.

Quelqu'un peut-il expliquer ce qui se passe ici?

+6

a) Pourquoi vous attendez-vous à cela et b) pourquoi voulez-vous commencer? –

+1

Je ne comprends vraiment pas de quoi il s'agit. Pouvez-vous inclure la sortie dans la question au lieu de simplement des captures d'écran et peut-être mettre en évidence les adresses que vous attendez à être identiques/differrent? – user463035818

+1

est-ce que vous vous attendez à ce que l'adresse de 'x' dans le deuxième extrait soit la même que l'adresse de' x' dans le premier extrait? Si oui, pourquoi? Vous ne pouvez même pas compter sur 'x' stocké dans la même mémoire lorsque vous exécutez le même code deux fois – user463035818

Répondre

1

Les valeurs du premier code sont identiques car la valeur de ip est l'adresse de x (même chose, adresse IP de x). Mais dans le second code les résultats sont différents car l'adresse de x n'est pas l'adresse de ip (ip est une variable différente - le pointeur peut contenir des adresses d'autres variables). Où l'ordinateur va décider de les créer - qui sait. Je pense que c'était juste une coïncidence où une variable est créée sur la même adresse et la seconde sur différente.

1

Je pense que vous pouvez être confus entre la valeur de la pointe, l'adresse de la pointe, la valeur du pointeur et l'adresse du pointeur. Je pense que c'est probablement mieux expliqué à travers une image. Si vous écrivez

int x = 7; 
int* ip = &x; 

puis, en mémoire, les choses sont quelque chose comme ceci:

+-----------+     +-----------+ 
    |  7  | <------------ | Address A | 
    +-----------+     +-----------+ 
     int x      int* ip 
    Address A      Address B 

Ici, la x variable est stockée à un endroit (appeler A) et il détient la valeur 7. La variable ip est stockée à un emplacement donné (appelez-la B) et elle contient comme valeur l'adresse A. Notez que A et B doivent être différents les uns des autres, car x et occupent des emplacements de mémoire séparés.

Maintenant, pensez à ce qui se passe lorsque vous écrivez

cout << x << endl; 

Ceci affiche la valeur stockée dans x, qui est 7. (Je suppose que ce n'est pas très surprenant.)

Si vous écrivez

cout << &x << endl; 

vous imprimez l'adresse que x assis à. Ce sera la valeur de A, et cela variera d'un programme à l'autre.

Si vous écrivez

cout << ip << endl; 

vous imprimez la valeur stockée dans ip. Depuis ip des points à x, la valeur stockée dans ip est l'adresse de x, ce qui est tout A se trouve être.

Cependant, si vous écrivez

cout << &ip << endl; 

vous imprimez l'adresse de la variable ip. Cette adresse est notée ci-dessus par B et dépend de l'exécution particulière du programme. Notez que A et B sont pas la même chose, donc vous devriez vous attendre à voir des valeurs différentes ici.

Pour récapituler:

+-----------+     +-----------+ 
    |  7  | <------------ | Address A | 
    +-----------+     +-----------+ 
     int x      int* ip 
    Address A      Address B 

     cout << x << endl; // Prints 7, the contents of x. 
     cout << &x << endl; // Prints A, the address of x. 
     cout << ip << endl; // Prints A, the contents of ip. 
     cout << &ip << endl; // Prints B, the address of ip. 

Dans votre cas, il semble que A, l'adresse de x, était 0x28ff0c et l'adresse de ip (B) était 0x28ff08. Cela ne signifie pas que l'adresse de x a changé, mais indique plutôt que ip et x occupent différentes adresses mémoire.