This question already has answers here:
Passing an array as an argument to a function in C
(10个回答)
2年前关闭。
在下面的代码中,有一个我不理解的问题。在这些方面:
尽管我没有使用指针,但在GCD函数之后,数组A [n]的元素已更改。因此,第二个功能无法正常工作。因此,如果我颠倒了上述两行的顺序,则这次GCD功能将无法正常工作。我怎么了
与写作具有相同的含义:
因此,尽管您没有显式编写它,但仍在传递指针时。
有关更多信息,我真的建议阅读this。
此外,您可以在SO here和here上找到其他答案
(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 here和here上找到其他答案
关于c - 为什么此守则使用“按引用致电”? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43700359/
10-12 14:00