【问题标题】:Why there's a need to use the ampersand when getting a value from n format specifier?为什么从 n 格式说明符获取值时需要使用 & 符号?
【发布时间】:2015-02-21 20:38:20
【问题描述】:

为什么在从 n 格式说明符中获取值时需要使用 & 符号?

例如:

...
int n;
printf("%s: %nFoo\n", "hello", &n);

%npointer to an integer type

而和号是一个地址,那么为什么在上面的例子中它将格式说明符的结果转换为一个整数呢?

【问题讨论】:

  • 我不明白,它应该在我的代码中返回n=5 否? @Wallyk
  • @kuhaku no,n == 7。因为':'' '

标签: c syntax


【解决方案1】:

%n 说明符给出了到目前为止打印的字符数,所以它是一个输出值,你添加运算符的& 地址,将地址传递给n 的值,以便可以在里面修改printf() 和当printf() 返回时,它通过使用指向它的指针将字符数存储在n 变量中。

如何修改函数中的值的示例如下

void setValue(int *where, int howMuch)
{
    if (where == NULL)
        return;
    *where = howMuch;
}

int main()
{
    int value;

    setValue(&value, 8);
    /*       ^ here is where the & address of is important */
    printf("%d\n", value);

    return 0;
}

输出将是

8

请注意,在 c 中,没有passing by reference,因此在函数中修改变量的唯一方法是传递它的地址并从函数中访问指针。

【讨论】:

  • 如果它的类型是指向整数的指针,那么到目前为止打印的字符数如何?还有为什么它不能通过 n 而不是 &n 工作?
  • 因为正如另一个答案中所解释的,在 c 中没有通过引用传递参数这样的事情。在main() 中,它的类型是int,在printf() 中,它是一个指向整数的指针,所以像*n 那样取消引用它使其成为int 类型,并且更改该值,也会更改main() 中的值.
【解决方案2】:

C 中的函数参数始终是值。知道表达式n 的当前值不会为printf 提供任何信息以在其中存储新值。 printf 需要知道的是 哪里 来存储结果。这个问题由一个指针来回答,具体来说,是一个指向您希望存储结果的对象的指针,n

【讨论】:

    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2013-09-29
    • 2020-07-30
    • 2019-10-08
    • 2018-10-09
    相关资源
    最近更新 更多