【问题标题】:Why scanf must take the address of operator为什么scanf必须取operator的地址
【发布时间】:2011-04-23 01:24:04
【问题描述】:

正如标题所说,我一直想知道为什么scanf 必须使用address of 运算符(&)。

【问题讨论】:

    标签: c scanf addressof


    【解决方案1】:

    因为 C 只有“按值传递”参数,所以要传递一个“变量”来放入一个值,你必须传递它的地址(或指向变量的指针)。

    【讨论】:

    • 这是因为你正在存储一些东西。想想函数必须如何工作。使用 printf,您可以将其视为一个 void 函数,它只输出结果然后完成。使用 scanf 您希望保留一些数据,因此您需要一个指针,也就是您输入的数据将存储的地址。如果您采用数据类型的参数,例如“int”,则一旦退出 scanf 函数,数据就会丢失,换句话说,在父函数的下一行代码中,您扫描的数据将是走了..
    【解决方案2】:

    因为它需要地址来放置它读取的值。如果将变量声明为指针,scanf 将不需要&。

    【讨论】:

      【解决方案3】:

      当您使用标准输入设备(通常是键盘)输入内容时,通过的数据必须是 stored 某处。您必须在内存中的某处point,以便可以将数据存储在那里。要point 一个内存位置,您需要该位置的address。因此,您必须使用 & 运算符和 scanf() 来传递变量的地址。

      【讨论】:

        【解决方案4】:

        其他人都很好地描述了 sscanf 需要将其输出 somewhere,但为什么不返回呢?因为它必须返回很多东西——它可以填充多个变量(由格式驱动),它返回一个 int 表示它填充了多少变量。

        【讨论】:

          【解决方案5】:

          scanf 不采用“运算符 (&) 的地址”。它需要一个指针。大多数情况下,指向输出变量的指针是通过在 scanf 调用中使用地址运算符来获取的,例如

          int i;
          scanf("%i", &i);
          printf("number is: %d\n", i);
          

          但这不是唯一的方法。以下内容同样有效:

          int *iPtr = malloc(sizeof(int));
          scanf("%i", iPtr);
          printf("number is: %d\n", *iPtr);
          

          同样我们可以用下面的代码做同样的事情:

          int i;
          int *iPtr = &i;
          scanf("%i", iPtr);
          printf("number is: %d\n", i);
          

          【讨论】:

            【解决方案6】:

            因为值将被存储,(在哪里?),在内存地址中。所以 scanf() 处理 (&) 运算符。

            【讨论】:

              【解决方案7】:

              它告诉在哪里写入输入值,因为 (&) 运算符的地址给出了变量的地址。因此,带有变量名和地址运算符的 scanf 意味着将值写入该位置。 您还可以使用 (&) 运算符的地址和 %p 格式说明符以十六进制格式检查任何变量的地址。

              【讨论】:

                【解决方案8】:

                这是因为你正在存储一些东西。想想函数必须如何工作。使用 printf,您可以将其视为一个 void 函数,它只输出结果然后完成。使用 scanf 您希望保留一些数据,因此您需要一个指针,即地址,即使在您离开函数后,您输入的数据也将存储在该地址中。如果您采用数据类型的参数,例如“int”,则一旦退出 scanf 函数,数据就会丢失,换句话说,在父函数的下一行代码中,您扫描的数据将是走了。

                【讨论】:

                  猜你喜欢
                  • 2021-09-14
                  • 2012-04-09
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-12-04
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多