2017-09-27 6 views
0

私はこのプログラムの出力が何であるかを理解できません。たぶん誰かが私を助けることができます。ダブルポインタを参照すると、値は何ですか?

なぜダブルポインターのリファレンスは:0062FB78?

逆参照されたダブルポインタ= 0062FAA0の参照はなぜですか?

これらは反転してはいけませんか?

0062FB78は、私は0062FAA0は、ダブルポインタのアドレスであると思いますよX

のアドレスですか?あなたの上に問題を行く前に

#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

は、あなたの様々な機能に*値で*パラメータを渡しています。 – Bathsheba

+5

'&x'を"参照 "と呼ぶのはちょっと混乱します。 'x'のアドレスは参照ではありません – user463035818

+2

あなたの関数では、'&x'はパラメータのアドレスです。関数に渡した値のアドレスではありません。 – molbdnilo

答えて

2

、まずはy= &xを呼び出した後、yはxを参照するのではなく、xのアドレスではないことに同意してみましょう。あなたは細心の注意を払っている場合

それでは、print

にコールを調べてみましょう、我々は値による変数を渡すので、この方法は、実際に値19を印刷しますが、アドレスはの一時コピーに属しますx

我々は、次のいずれかにプロトタイプを変更していた場合は、ここで印刷されたxのアドレスが、これらはあまりにも発生し、あなたの他の懸念についての方法で印刷yprintPointer

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

のアドレスと同じになりますがポインターは値渡しであり、参照渡しではありません。

この単純なプログラムは、すべてがうまく機能することを示しています

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; 
} 
関連する問題