【问题标题】:Why we need to specify address of variable and not name of variable while using scanf function为什么我们在使用 scanf 函数时需要指定变量的地址而不是变量的名称
【发布时间】:2020-03-28 05:56:10
【问题描述】:

为什么我们在使用scanf函数时需要指定变量的地址而不是变量的名称例如:scanf("%d",&a);为什么我们使用&而不是我们可以这样写scanf("%d",a);所以为什么我们需要使用地址同时使用scanf()?

【问题讨论】:

  • 因为 C 标准说 scanf 需要一个 指针 来存储作为每个相应 转换说明符的参数> 在其格式字符串中。 C11 Standard - 7.21.6.2 The fscanf function(p2) 除非您正在填充数组(例如,使用 "%s" -- 它会自动转换为指向第一个元素的指针),否则您需要提供变量的地址。
  • 在 C 中,所有参数都是按值传递的。这意味着如果您传入a,该函数将只获得a 的值。这对函数没有用,因为它需要a 的地址才能将值存储到a 中。 & 正是运营商的地址。
  • 这能回答你的问题吗? Why does scanf require &?
  • 另一个潜在的骗子:why-scanf-must-take-the-address-of-operator

标签: c


【解决方案1】:

scanf 在所有情况下都会隐含地想要一个地址,因为您将作为输入的变量必须存储在内存中的某个位置,并且使用&variable_name 您正在分配一个指向变量位置的指针。

对于数组/字符串,您可以不使用&,因为传递的数组/字符串实际上是指向第一个值/字符存储位置的指针。 (从那里您可以使用指针算法对其进行迭代,例如:+4 for int)

【讨论】:

    【解决方案2】:

    以上答案和 cmets 为您提供了技术原因,但外行

    所以你的问题基本上是为什么scanf 不能只取变量的名称而不是地址。

    您使用scanf() 将某些内容放入变量中对吗?

    现在让我们假设你要送一封信,你能通过提供人名来送信吗?

    你需要在上面写上地址,然后邮递员就会到达那个地址,邮递员不需要知道收件人的姓名,他只需要知道地址。

    您的scanf 就像那个邮递员一样,它需要内存位置的地址才能将该值传递给您想要的变量。

    【讨论】:

    • 在 C 中,对象的名称是一个 lvalue,它提供对对象的访问。这就是为什么赋值表达式可以在没有地址的情况下更改对象的值。 scanf 需要地址的原因并不是因为名字本身就不够用。
    • 您能否编辑我的答案以使其也适合我的类比?
    猜你喜欢
    • 1970-01-01
    • 2012-02-11
    • 2019-12-18
    • 2020-08-20
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多