Почему эта факторная функция не работает? - PullRequest
0 голосов
/ 07 июня 2019

Я пытался выяснить, как сделать факториал самостоятельно, так что это грязно, но я был запутан в некоторых аспектах, таких как этот. В рамках fact () я набираю fact(x,j). И это работает. Однако моя первоначальная попытка, которая имела fact(&x,j), не сработала. Это почему? Должен ли последний параметр работать, потому что я отправляю адрес x, для которого я уже установил n * n-1 в *x = (*x)*j;

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 указывает местоположение, почему я использую &x в основном, но только x внутри функции?

также не уверен, что возвращение 0 или возвращение 1 - это то, что нужно использовать для завершения функции.

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Первый аргумент вашей функции - это указатель на целое число, а указатель - это переменная, которая содержит адрес, поэтому вам нужно передать адрес при вызове функции. Вот почему вы передаете & x для функции как (&) дает адрес переменной


С другой стороны, внутри функции у вас есть указатель, который содержит адрес до целого числа, поэтому, если вы хотите использовать этот указатель как префикс, вы должны использовать (*) передимя указателя. Вот почему вы используете x только внутри функции.

0 голосов
/ 07 июня 2019

Прямо здесь, как вы упомянули:

fact(&x, j); //this is what i mean, remove the "&" and it works, but why?

Это передача указателя на int * (или указателя на указатель на int) на fact.

Поскольку x является int в main и int * в fact, вы должны просто передать x в fact из fact.

каквы используете *x для доступа к int, хранящемуся в x в пределах fact, вы должны использовать x, чтобы получить указатель на этот int.

Всегда return 1 вконец функции, если она завершается успешно, так что if(func()) работает.

В качестве примечания, вы, вероятно, должны return результат рекурсивного вызова из fact.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...