如何在 C++ 中使用指针创建输入法

How to create an input method in C++ with pointers

我想创建一个输入法,它使用指针创建两个整数。 如果你能帮助我或给我任何提示,那就太好了。 :)

我的方法:

void inputTest(int* x, int* y) {
    cin >> x;
    cin >> y;
}

我的主要:

int *x = 0;
int *y = 0;
cout << "Input: " << endl;


//set input from user x,y with input method 
inputTest(x,y);

首先,您想读取 ints,而不是 int*s,因此您需要取消引用指针:

void inputTest(int* x, int* y) {
    cin >> *x;
    cin >> *y;
}

然后您需要将有效指针传递给该函数 - 您的指针是 空指针,根本没有指向任何地方。
最好的方法是首先创建两个 int,然后使用 "address-of" 运算符获取它们的位置,&.

int x = 0;
int y = 0;
cout << "Input: " << endl;
inputTest(&x, &y);

您可以选择以下两种方式之一:

  1. 将您的变量声明为常规 ints 并将它们的地址传递给函数 inputTest(),这是推荐的方式。

  2. 将您的变量声明为指向 int 的指针并为它们分配有效内存。

方法 1 的示例:

int x = 0;
int y = 0;
cout << "Input: " << endl;


//set input from user x,y with input method 
inputTest(&x, &y);

方法 2 示例:

int *x = new int;
int *y = new int;
cout << "Input: " << endl;


//set input from user x,y with input method 
inputTest(x,y);

完成后不要忘记 release/delete 分配的内存。

你还应该使用:

cin >> *x;
cin >> *y;

在你的函数中。

I'm new to pointers so I want to try it that way.. :)

好的,那么第一课:不要在不必要的时候使用指针。指针可能会导致最严重的错误,没有它们就不会出现这些错误。

下一篇:指针就是指针。可以指向某物。 int*可以指向int。你的指针没有指向任何有意义的东西。

要在某个地方存储整数值,您需要 ints。有指向某处的指针是不够的。一旦你有一个 int,例如 int x; 那么 &x 会给你一个 int*x 的地址(& 被称为地址-of 运算符,但不要混淆,& 可以有不同的含义,见下文)。如果你有指针 int* p = &x; 那么你可以取消引用指针以取回 x:*p = 5; 会将 x 的值设置为 5。使用它你可以写

void inputTest(int* x, int* y) {
    std::cin >> *x;    
    std::cin >> *y;
}
int main() {
   int x,y;
   inputTest(&x,&y);
   std::cout << x << " " << y;
}

BUT(想加粗一点,因为确实是大"but")。有一个替代方案,这是您应该在这里使用的。当 "not pointing anywhere" 是允许的参数时,指针作为参数很有用。对于想要从用户读取输入并将其存储在某处的功能,无效指针几乎没有用处。最好是禁止此类无效输入并使用引用:

void inputTest(int& x, int& y) {
    std::cin >> x;    
    std::cin >> y;
}
int main() {
   int x,y;
   inputTest(x,y);
   std::cout << x << " " << y;
}

我觉得写这个答案有点不好,因为当你完全不熟悉指针时,阅读这里的答案不足以获得正确的理解。拿一本书并阅读它。

您需要取消对指针的引用,以便将值分配给内存中的指向位置。

void inputTest(int* xptr, int* yptr) {
    cin >> *xptr;
    cin >> *yptr;
}

int* x = 0 创建一个指向内存位置 0 的指针。相反,我们想要分配内存,然后指向该内存。我们可以将 x 初始化为 int x = 0,然后使用 &x.

获取指向它的指针
int x = 0;
int y = 0;
cout << "Input: " << endl;
inputTest(&x,&y);

你也可以使用引用...

void inputTest(int& x, int& y) {
    cin >> x;
    cin >> y;
}

int x = 0;
int y = 0;
cout << "Input: " << endl;
inputTest(x,y);

带指针的解决方案

使用 int *x = 0 你只是声明了一个指向任何地方的指针。指针只存储 'pointing' 信息,而不是数据本身。

    void inputTest(int* x, int* y) {
        cin >> *x; // dereference a pointer to get to the 'real' variable
        cin >> *y; // this is also a disadventage of pointers, pointer can point to nowhere, 
                   // and your programwould crach in that situation
    }

    int main()
    {
       int x = 0; // declare a normal variable, instead of a pointer
       int y = 0; 

       cout << "Please insert an input: " << endl;

       inputTest(&x, &y); // pass addresses that point to your variables

       cout << "Your input: " << x << " " << y << endl;
    }

带参考文献的解决方案

您也可以通过引用实现同样的功能。也许你会喜欢它们。

    void inputTest(int& x, int& y) // mind & instead of *
    {
        cin >> x; // no need of dereferencing,
        cin >> y;
    }

    int main()
    {
       int x = 0; // a normal variable
       int y = 0; 

       cout << "Please insert an input: " << endl;

       inputTest(x, y); // simple pass your variables

       cout << "Your input: " << x << " " << y << endl;
    }