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

Why there's a need to use the ampersand when getting a value from n format specifier?

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

例如:

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

%n是一个pointer to an integer type

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

%n 说明符给出了到目前为止打印的字符数,所以它是一个输出值,你添加运算符的 & 地址,将地址传递给 [=14 的值=] 所以它可以在 printf() 内部修改,当 printf() returns 时,它通过使用指向它的指针将字符数存储在 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,因此在函数中修改变量的唯一方法是传递它的地址并从函数访问指针。

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