我知道这个解决方案存在很多解决方案,但在环顾四周之后我还没有找到任何涉及指针的解决方案
现在它不停地发出警告,根本没有输出,我做错了什么?
#include <stdio.h>
int findbig (int a[], int n)
{
int max = a[0];
for (int i = 1; i < n; i++)
{
if (a[i] > max)
{
max = a[i];
}
}
return max;
}
int main (void)
{
int n;
printf("How many numbers? \n");
scanf("%d", &n);
int a[n];
printf("Now enter those %d numbers: \n", n);
for (int i = 1; i < n; i++)
{
scanf("%d", &a[i]);
}
int biggest = findbig (a[n], n);
printf("The biggest number is: %d\n", biggest);
return 0;
}
我的编译器抱怨:
-warning:传递'findbig'的参数1使得整数指针没有强制转换[默认启用]
-note:期望'int *'但参数的类型为'int'
答案 0 :(得分:3)
a[n]
(以及它的等效*(a + n)
形式)是一个int,而不是指向int的指针。它也是你阵列边界的一个。您需要将警告变为错误。你传递一个int,其值被转换为一个指针(地址),这是好的。
您需要像这样调用您的函数:
findbig(a, n);
无论您的签名如何,findbig
都会收到指向int的指针。你不能将数组传递给C中的函数(或从中返回它们)。它们会降级为指向第一个元素的指针。
另外,在填充数组时,您总是跳过第一个元素,因此用户说“我想输入N个数字”,但您只允许他们输入n-1
。当您使用a[0]
作为初始max
数字时,这也是有问题的,但该元素的值是不确定的。
它可能是任何东西,即一些巨大的数字,然后你的功能会产生奇怪的结果。将数组初始化为0(int a[n] = {0};
)或将循环开始为0(更好)。
答案 1 :(得分:0)
通过索引a
,执行a[n]
,您将获得第n个索引中数组a的值,该索引是int type
。您需要使用数组“pointer”变量调用findbig(....);
函数,而不对其进行索引,方法如下:
findbig(a, n);
答案 2 :(得分:-2)
这条线错了。
int a[n]
应使用常量值初始化数组,因为在执行程序之前会分配数组的空间。所以,变量不起作用。