【问题标题】:How to create an input method in C++ with pointers如何在 C++ 中使用指针创建输入法
【发布时间】:2024-04-26 23:55:01
【问题描述】:

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

我的方法:

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);

【问题讨论】:

  • int *x = 0; 没有做你认为它正在做的事情
  • 您能否澄清一下-您是否希望inputTest 方法同时allocate(创建)和assignxy,还是只是从cin 流中为它们分配值?
  • 我相信你对指针有一个错误的想法。也许good read 可以提供帮助。
  • 我想从 cin 流中为 x 和 y 分配新值
  • @Coder95 如果你想在 inputTest 中改变 x 和 y,你可以使用引用而不是指针

标签: c++ pointers input methods cin


【解决方案1】:

首先,你要读取ints,而不是int*s,所以你需要解引用指针:

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

然后你需要将有效指针传递给函数 - 你的是 空指针 并且根本不指向任何地方。
最好的方法是首先创建两个ints,然后使用“address-of”运算符获取它们的位置,&amp;

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

【讨论】:

    【解决方案2】:

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

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

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

    方法 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);
    

    完成后不要忘记释放/删除分配的内存。

    你也应该使用:

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

    在你的函数内部。

    【讨论】:

    • 你的意思是delete,而不是free,因为你是newed而不是malloced。
    【解决方案3】:

    我是指针新手,所以我想尝试一下.. :)

    好的,那么第一课:不要在不必要的时候使用指针。指针可能会导致最讨厌的错误,如果没有它们,您将无法获得。

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

    要在某处存储整数值,您需要ints。有指向某处的指针是不够的。一旦你有一个int,例如int x;,那么&amp;x会给你一个int*,即x的地址(&amp;被称为地址运算符,但不要混淆,&amp;可以有不同的含义,见下文)。如果你有指针int* p = &amp;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(想让它更加大胆,因为它确实是一个很大的“但是”)。有一个替代方案,这就是你应该在这里使用的。当“不指向任何地方”是允许的参数时,指针作为参数很有用。对于想要从用户读取输入并将其存储在某个地方的函数来说,无效指针几乎没有用处。更好的是禁止此类无效输入并使用引用:

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

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

    【讨论】:

      【解决方案4】:

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

      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);
      

      【讨论】:

        【解决方案5】:

        指针解决方案

        使用int *x = 0,您只声明了一个指向无处的指针。并且指针应该只存储“指向”信息,而不是数据本身。

            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;
            }
        

        【讨论】: