为什么我在这段代码中得到一个奇怪的数字?

Why am I getting a strange number in this code?

我想编写一个 C 程序来计算从 1 到 5 的整数的阶乘,并以表格格式打印它们。但是,我总是收到一个奇怪的数字。这是代码:

#include <stdio.h>

int main()
{
    int factorial;

    printf("X\t Factorial of X\n");

    for(int x=1; x<=5; x++)
    {
        factorial = 1;
        for (int j=1; j<=x; j++)
        {
            factorial *=j;
        }
        printf("%d\t %d\n", &x, &factorial);
    }

    return 0;
}

这是这段代码的结果:

X        Factorial of X
6356768  6356772
6356768  6356772
6356768  6356772
6356768  6356772
6356768  6356772

我的代码有什么问题?结果应该是这样的:

X       Factorial of X
1       1
2       2
3       6
4       24
5       120

删除代表地址的&。您正在打印变量的地址,而不是它的值。

    printf("%d\t %d\n", x, factorial);

当使用 printf(以及相关的 output 函数)时,%d 格式说明符需要一个 int 作为相应的参数。在您的 printf("%d\t %d\n", &x, &factorial); 中,您正在传递 xfactorial 变量的 地址

所以,只需删除两个 &(地址)运算符:printf("%d\t %d\n", x, factorial);!

您可能对以下事实感到困惑:对于 scanf(以及其他 input 函数),%d 说明符需要指向其目标变量的指针。

printf("%d\t %d\n", &x, &factorial); &x 和 &factorial 是这些变量的地址,而不是变量本身。省略 &.

scanf 不同,格式 %dprintf() 需要 整数值 ,而不是地址(&x 是包含以下内容的地址一个整数,所以一个指向整数的指针,类型为 int *)。正确的表达方式是

printf("%d\t %d\n", x, factorial);

为什么之前的表达是错误的?

对于 printf("%d\t %d\n", &x, &factorial);,您要求 printf 分别打印 xfactorial 地址的十进制表示。

因此,过去打印的值 63567686356772:

也就不足为奇了
  1. 是大数字,4 的倍数(因为它们寻址整数,大小为 4 字节,并且在像您这样的 32 位体系结构中与 4 的倍数的内存位置对齐)
  2. 它们是内存位置,即使内容改变它们的地址也不会改变

您可以找到 printf 文档 here

语句中printf("%d\t %d\n", &x, n factorial);您使用了“and”来打印该元素的地址。