【问题标题】:the defined variable is different定义的变量不同
【发布时间】:2018-11-12 18:56:09
【问题描述】:

为什么average函数中的变量与main函数中的相同变量不同?刚学,不知道怎么解决。

#include <stdio.h>
#define  SIZE (sizeof(number)/sizeof(int))

int number[] = {5,65,84,25,644,2};

int average(int *number)
{
    printf("size = %ld\n",SIZE);
    int sum=0;
    for(int i=0;i<=SIZE ;i++)
    {
    sum += number[i];
    }
    return sum/SIZE;
}

int main()
{
printf("average : %d\n",average(number));
printf("number of elements: %ld\n", SIZE);


return 0;
}

【问题讨论】:

  • 如果给出的答案之一解决了您的问题,您应该accept it

标签: c


【解决方案1】:

您使用宏(即#define ...)来指定SIZE。宏在您使用它的任何地方都会“以文本方式”扩展,并在相应的上下文中进行解释,即它的含义取决于您放置它的位置。

所以在 main 中,作为宏的一部分的number 指的是全局变量number,而在函数average 的上下文中,它指的是函数参数number(它隐藏了同名的全局变量)多变的)。

无论如何,不​​可能从指针变量中推断出任何数组大小。您必须将元素的数量作为额外参数传递。

【讨论】:

  • 哇!我没有看到宏错误。为此 +1
  • 不客气。如果有帮助,请不要忘记按绿色箭头将其中一个答案标记为“已接受”。谢谢!
【解决方案2】:

main 中,number 是一个全局变量,它是一个数组。所以sizeof(number) 为您提供了整个数组的大小(以字节为单位)。

然而,在average 函数中,number 是函数的参数,类型为int *。所以sizeof(number) 在这种情况下会给你指针的大小,而不是数组的大小。

要么不传递参数而只使用全局,要么将数组的大小作为单独的参数传递给函数。

【讨论】:

  • 这是为什么使用全局变量会出现问题的一个例子吗?
  • @RandomDavis 在某种程度上是的,因为它说明了内部范围内的变量如何屏蔽更高范围内的同名变量。
【解决方案3】:

您已经定义了一个全局变量number,它是一个数组。

在函数 average 中,您定义了另一个具有相同名称/标识符 number 的变量(尽管类型不同,即指针)。

现在,当您在主函数中使用number 时,您实际上使用的是指针number,而不是全局变量number。这也称为变量隐藏。

如果您想使用全局变量,请将average 函数的参数名称更改为其他名称,或者您可以采取类似this 之类的方法。

快乐编码;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多