【问题标题】:How to input pointer of a structure如何输入结构的指针
【发布时间】:2013-04-20 01:28:20
【问题描述】:

我正在编写一个程序,用于使用结构和指针查找两个有理数的加法、乘法和除法。我在用指针输入数字时遇到问题。我的代码应该如何更正?谢谢!

#include <stdio.h>
struct rational
{
    int nu;
    int de;
}*p1,*p2,*p3;
struct rational add()
{
    p1->nu = p1->nu*p2->de + p1->de*p2->nu;
    p3->de = p1->de * p2->de;
    printf("%d\n--\n%d\n",p3->nu,p3->de);
}
struct rational multiply()
{
    p3->nu = p1->nu * p2->nu;
    p3->de = p1->de * p2->de;
    printf("%d\n--\n%d\n",p3->nu,p3->de);
}
struct rational divide()
{
    p3->nu = p1->nu * p2->de;
    p3->de = p1->de * p2->nu;
    printf("%d\n--\n%d\n",p3->nu,p3->de);
}
int main()
{
    int a,b,choice;
    printf("Enter the first rational number.\n");
    scanf("%d%d",&p1->nu,&p1->de);
    printf("Enter the second rational number.\n");
    scanf("%d%d",&p2->nu,&p2->de);
    scanf("%d",&choice);
    switch (choice)
    {
        case 1: add();
                break;
        case 2: multiply();
                break;
        case 3: divide();
                break;
    }
    return 0;
}

【问题讨论】:

  • 我修改了您的代码以使用指向 struct、struct 和 int 的指针。请注意,我在结构声明中使用了 typedef,以便以后可以使用它来对函数进行原型设计。一旦你创建了一个指向结构的指针,你必须使用结构定义来初始化它,使用类似 pVar = &var 的东西。看我的回答...

标签: c pointers structure


【解决方案1】:
  1. 您已经声明了指向struct rational 的指针,但没有将它们分配为实际指向任何此类结构。例如:

    struct rational rat_a;
    p1 = & rat_a;
    
  2. 您将函数声明为返回 struct rational(即 struct rational add()),但它们似乎没有返回任何内容。如果一个函数没有返回任何东西,它应该被声明为 void - void add()

  3. 为什么使用指向结构的指针而不是结构本身? (如果在您的代码中声明为全局)

【讨论】:

    【解决方案2】:

    您声明指向结构的指针,而不是结构本身。指向结构的指针可以保存结构的地址,但不会创建一个。你必须有结构,才能使指针指向它。

    struct rational
    {
        int nu;
        int de;
    }*p1,*p2,*p3;
    

    这部分有 3 个指向结构的指针。他们现在什么都没有。 现在你必须创建像

    这样的实际结构
    struct rational structure1, structure2, structure3;
    

    现在你可以给指针赋值了:

    p1=&structure1;
    p2=&structure2;
    p3=&structure3;
    

    从现在开始 p1 保存结构 1 的地址,依此类推。 并且只有从细点你可以取消引用指针与

    p1->de
    p2->nu
    

    我认为,埋葬你的东西是制作这些全局指针。当函数什么都不做并突然做出一些事情时,它看起来真的很丑。如果你通过引用函数来传递你的结构,它看起来会更好更干净。接下来,您的函数似乎正在返回结构,但它们没有。决定您是否通过指针修改它们。此外,当您定义不带参数的函数时,您会像

    int funct(void);
    

    在您的情况下,函数不接受参数并且不返回值,因此它们中的每一个都应该如下所示:

    void myfunction(void);
    

    【讨论】:

      【解决方案3】:

      您的代码已修改为使用指向结构、结构和整数的指针:

      #include <stdio.h>
      typedef struct 
      {
          int nu;
          int de;
      }rational;
      
      rational *p1, elements;
      
      int add(rational *p4)
      {
          int a;
          a = p4->nu+p4->de;
      
          return a;
      }
      int multiply(rational *p4)
      {
          int a;
          a = p4->de * p4->nu;
      
          return a;
      }
      int divide(rational *p4) //should return a float instead of int to show decimal returns
      {
          int a;
          a = p4->nu / p4->de;
      
          return a;
      }
      int main()
      {
          int a,b,choice;
      
          p1 = &elements;
      
          printf("Enter the first rational number.\n");
          scanf("%d",&a);
          printf("Enter the second rational number.\n");
          scanf("%d",&b);
          printf("Enter choice /(1, 2 or 3/).\n");
      
          scanf("%d",&choice);
      
          p1->nu = a;
          p1->de = b;
          switch (choice)
          {
              case 1: 
                  a = add(p1);
                  printf("%d + %d = %d\n",p1->nu, p1->de, a);
      
                      break;
              case 2: 
                  a= multiply(p1);
                      printf("%d * %d = %d\n",p1->nu, p1->de, a);
      
                      break;
              case 3: 
                  a = divide(p1);
                  printf("%d / %d = %d\n",p1->nu, p1->de, a);
                      break;
          }
          getchar();//eats an additional character?...
          getchar();//stop execution so you can see your answer
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        • 2021-06-15
        • 2013-04-13
        • 1970-01-01
        相关资源
        最近更新 更多