2017-09-27 10 views
0

Je n'arrive pas à comprendre pourquoi la sortie de ce programme est ce qu'elle est. Peut-être que quelqu'un peut m'aider.En référence à un double pointeur, quelle est la valeur?

Et pourquoi la référence du double pointeur: 0062FB78? Pourquoi la référence du double pointeur déréférencé est-elle 0062FAA0?

Ne devraient-ils pas être retournés?

0062FB78 est l'adresse de x

Je suis deviner 0062FAA0 est l'adresse de la double pointeur?

#include <iostream> 


void print(int x) { 
    std::cout << "value: " << (x) << "\n"; 
    std::cout << "reference: " << (&x) << "\n"; 
    //std::cout << (*x) << "\n"; 
} 

void printPointer(int *x) { 
    std::cout << "value: " << x << "\n"; 
    std::cout << "reference: " << &x << "\n"; 
    std::cout << "dereference:" << *x << "\n"; 
} 

void printDoublePointer(int **x) { 
    std::cout << "value: " << x << "\n"; 
    std::cout << "reference: " << &x << "\n"; 
    std::cout << "dereference:" << *x << "\n"; 
    printPointer(*x); 
} 

void printTripplePointer(int ***x) { 
    std::cout << "value:" << x << "\n"; 
    std::cout << "reference:" << &x << "\n"; 
    std::cout << "dereference:" << *x << "\n"; 
    printDoublePointer(*x); 
} 

void print(char* string) { 
    std::cout << "\n" << string << "\n"; 
} 


int main() 
{ 
    int x = 19; 
    int *y; // y is a address space 
    y = &x; // &y now points to the address of x, *y now has the value of x 
    int **doublePointer = &y; 
    print(x); 
    printPointer(y); 
    printDoublePointer(doublePointer); 
    print("doublePointer"); 
    std::cin >> x; 
} 

x 
value: 19 
reference: 0062FBB78 

y 
value: 0062FC7C 
reference: 0062FBB78 
defererence: 19 

doublePointer 
value: 0062FC58 
reference of double Pointer: 0062FB78 
dereference of doble Pointer: 0062FC7C 
value of dereferenced double pointer: 0062FC7C 
reference of dereferenced double pointer: 0062FAA0 
dereference: 19 
+3

Remarque vous le passage de paramètres * par valeur * dans vos différentes fonctions. – Bathsheba

+5

appelant '& x' une" référence "est un peu déroutant. c'est l'adresse de 'x' qui n'est pas une référence – user463035818

+2

Dans vos fonctions,' & x' est l'adresse du paramètre. Ce n'est pas l'adresse de la valeur que vous avez transmise à la fonction. – molbdnilo

Répondre

2

Avant d'aller sur vous problème, nous allons d'abord d'accord que après avoir appelé y= &x, y est pas une référence à x, mais l'adresse de x.

Maintenant, nous allons examiner l'appel à print

Si vous prêtez attention, nous passons par la valeur de la variable, cette méthode fait imprimer la valeur 19, mais l'adresse appartiendra à une copie temporaire de x.

Si nous avons changé le prototype à la suivante, l'adresse de x imprimé ici sera égale à l'adresse de y imprimée dans la méthode printPointer

void print(int & x) { 
    std::cout << __PRETTY_FUNCTION__ << "\n"; 
    std::cout << "value: " << (x) << "\n"; 
    std::cout << "reference: " << (&x) << "\n"; 
} 

En ce qui concerne votre autre préoccupation, ces trop se produisent parce que vous passez les pointeurs par valeur et non par référence.

Ce programme montre que tout fonctionne très bien:

int main() 
{ 
    int x = 19; 
    int *y = &x; 
    int **z = &y; 

    std::cout << x << "\t" << &x << std::endl; 
    std::cout << y << "\t" << &y << "\t" << *y << std::endl; 
    std::cout << z << "\t" << &z << "\t" << *z << std::endl; 
}