对指针及其内存地址的困惑

Tim*_*ech 0 c++ pointers

好吧,我在这里查看代码,这个想法很难理解.

#include <iostream>
using namespace std;
class Point
{
public :
    int X,Y;
    Point() : X(0), Y(0) {}
};

void MoveUp (Point * p)
{
    p -> Y += 5;
}

int main()
{
    Point point;
    MoveUp(&point);
    cout << point.X << point.Y;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

好吧,所以我相信创建了一个类,声明了X和Y,并将它们放在构造函数中

创建一个方法,参数是Point*p,这意味着我们将把构造函数的指针放在函数内部;

现在我们创建一个名为point的对象然后调用我们的方法并将指针地址放在其中?

指针只是寻址一个像0x255255这样的内存号吗?

为什么没有宣布?

(int * p = Y)
Run Code Online (Sandbox Code Playgroud)

什么是内存地址?它可以用作参数吗?

pax*_*blo 9

p 宣布.

void MoveUp (Point * p)
{
    p -> Y += 5;
}
Run Code Online (Sandbox Code Playgroud)

是一个函数,它将指向a Point并向其Y值添加5.它与以下内容没有什么不同:

void f(int n) {
    printf ("%d\n", n);
}
:
int x = 7;
f(x);
Run Code Online (Sandbox Code Playgroud)

你不会说n在那种情况下没有定义.它是同p你的情况.

也许代码中的一些注释会有所帮助:

#include <iostream>
using namespace std;
class Point
{

public :
    int X,Y;
    Point() : X(0), Y(0) {}       // Constructor sets X and Y to 0.
};

void MoveUp (Point * p)           // Take a Point pointer p.
{
    p -> Y += 5;                  // Add 5 to its Y value.
}
int main()
{
    Point point;                  // Define a Point.
    MoveUp(&point);               // Call MoveUp with its address.
    cout <<point.X << point.Y;    // Print out its values (0,5).
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

指针只是间接的一个层次.在代码中:

1   int X;
2   int *pX = &X;
3   X = 7;
4   *pX = 7;
Run Code Online (Sandbox Code Playgroud)

第3和第4行的效果是相同的.那是因为pX是一个指针,实际上X*pX,内容.pXX

在你的情况下,p->Y(*p).Y,或者Y指向的类的成员p.