This question already has answers here:
Passing an array as an argument to a function in C
                                
                                    (10个回答)
                                
                        
                                2年前关闭。
            
                    
在下面的代码中,有一个我不理解的问题。在这些方面:

gcd = GCD(n, A);
lcm = LCM(n, A);


尽管我没有使用指针,但在GCD函数之后,数组A [n]的元素已更改。因此,第二个功能无法正常工作。因此,如果我颠倒了上述两行的顺序,则这次GCD功能将无法正常工作。我怎么了

/*
    Finding the greatest common divisor and the least common multiple in an array.
*/

#include <stdio.h>

int GCD(int n, int A[]);
int LCM(int n, int A[]);
int main()
{
    int n, gcd, lcm;
    printf("Length of the array?: ");
    scanf("%d", &n);
    int A[n];

    for (int i = 0; i < n; i++)
    {
        printf("Element #%d: ", i+1);
        scanf("%d", &A[i]);
    }

    gcd = GCD(n, A);
    lcm = LCM(n, A);

    printf("\ngcd: %d\nlcm: %d\n", gcd, lcm);

    return 0;
}

int GCD(int n, int A[]) // Greatest common divisor
{
    int gcd = 1, j = 1, flag, ones = 0;

    while (1)
    {
        flag = 0;

        for (int i = 0; i < n; i++)
        {
            if (A[i] % j == 0)
            {
                A[i] /= j;
                flag++;

                if (A[i] == 1)
                    ones++;
            }
        }

        if (flag == 0 || j == 1)
            j++;
        else
            gcd *= j;

        if (ones == n)
            return gcd;
    }
}

int LCM(int n, int A[]) // Least common multiple
{
    int lcm = 1, j = 2, flag = 0, ones = 0;

    for (int i = 0; i < n; i++)
        if (A[i] == 1)
            flag++;

    if (flag != 0)
        return 1;

    while (1)
    {
        for (int i = 0; i < n; i++)
        {
            if (A[i] % j == 0)
            {
                A[i] /= j;
                flag++;

                if (A[i] == 1)
                    ones++;
            }
        }

        if (flag == n)
            lcm *= j;

        if (flag == 0)
            j++;

        if (ones == n)
            return lcm;

        flag = 0;
    }
}

最佳答案

在大多数情况下,C语言中的数组会转换为指向数组本身第一个元素的指针。传递给函数的更多详细信息始终会转换为指针。

这是来自K&R2nd的引用:


  将数组名称传递给函数时,传递的是
  初始元素的位置。在调用的函数中,此
  参数是局部变量,因此数组名称参数是
  指针,即包含地址的变量。


写作:

int GCD(int n, int A[]);


与写作具有相同的含义:

int GCD(int n, int * A);


因此,尽管您没有显式编写它,但仍在传递指针时。

有关更多信息,我真的建议阅读this

此外,您可以在SO herehere上找到其他答案

关于c - 为什么此守则使用“按引用致电”? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43700359/

10-12 14:00