gpt4 book ai didi

c - 为什么此代码使用 "call by reference"?

转载 作者:行者123 更新时间:2023-11-30 14:57:44 26 4
gpt4 key购买 nike

在下面的代码中,有一个我不明白的问题。在这些行中:

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

尽管我没有使用指针,但数组 A[n] 元素在 GCD 函数之后已经发生了变化。因此,第二个功能无法正常工作。所以,如果我颠倒上面两行的顺序,这次 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 :

When an array name is passed to a function, what is passed is the location of the initial element. Within the called function, this argument is a local variable, and so an array name parameter is a pointer, that is, a variable containing an address.

写作:

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

与写作的含义相同:

int GCD(int n, int * A);

因此,尽管您没有明确地编写它,但它就像您传递指针一样。

有关更多信息,我强烈建议阅读 this .

此外,您还可以在SO here上找到其他答案和 here

关于c - 为什么此代码使用 "call by reference"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43700359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com