C 为什么这个阶乘函数不起作用?

C 为什么这个阶乘函数不起作用?,c,C,我试着自己想办法做一个阶乘,所以很混乱,但我对某些方面感到困惑,比如这个。在fact()中,我键入fact(x,j)。这是有效的。然而,我最初的尝试(包含fact(&x,j)没有成功。为什么呢?后一个参数不应该工作吗,因为我正在发送x的地址,我已经在*x=(*x)*j中设置为n*n-1 int main(void) { int x =0; scanf("%d", &x); int j =x; fact(&x, j); printf("%d\

我试着自己想办法做一个阶乘,所以很混乱,但我对某些方面感到困惑,比如这个。在fact()中,我键入
fact(x,j)
。这是有效的。然而,我最初的尝试(包含
fact(&x,j)
没有成功。为什么呢?后一个参数不应该工作吗,因为我正在发送x的地址,我已经在
*x=(*x)*j中设置为n*n-1

int main(void)
{
    int x =0;
    scanf("%d", &x);
    int j =x;
    fact(&x, j);
    printf("%d\n", x);
    scanf("%d", &x);
}

int fact(int *x, int j)
{
    if(j!=1)
    {
        j = j-1;
        *x = (*x)*j;
        printf("j is : %d\n", j);
        fact(&x, j); //this is what i mean, remove the "&" and it works, but why?
    } else if(j==1)
    {
        return 0;
    }
}
如果
x
是一个指针,并且
&x
给出了位置,为什么我要在main中使用
&x
,而在函数中只使用
x


也不确定返回0或返回1是否是结束函数的正确方法。

正如您所提到的:

fact(&x, j); //this is what i mean, remove the "&" and it works, but why?
这是将指向
int*
的指针(或指向
int
的指针)传递到
事实

因为
x
main
中的
int
fact
中的
int*
,所以您只需将
x
fact
中传递到
fact

当您使用
*x
访问
fact
x
中存储的
int
时,您应该使用
x
获取指向该
int
的指针

如果函数成功,则始终在函数末尾返回1,以便
if(func())
工作


作为旁注,您可能应该
返回
事实
中递归调用的结果函数的第一个参数是指向整数的指针,而指针是一个保存地址的变量,因此在调用函数时需要传递地址。这就是为什么要传递&x作为函数(&)给出变量的地址



另一方面,在函数内部,您有一个指针,其中包含指向整数的地址,因此,如果您希望遵从此指针,则应使用(*)在指针名称之前。这就是为什么只在函数内部使用x

更常见的是返回阶乘。x已经是事实内部的指针。x是指向一个指针的指针,它不是您想要的。这与x不同。在main中,x指的是main中声明为x的变量,即int。事实上是int*类型的参数x。请编译时启用警告。编译器非常擅长在事情不太正确时给出提示(如缺少返回语句…)简单的答案(除了缺少返回)
&x
失败是因为函数已接收到指针。
&x
是该指针的地址-指向指针的指针。指向int的指针与指向int的指针不同。欢迎使用C指针地狱。