【问题标题】:passing argument makes pointer from integer传递参数使指针从整数
【发布时间】:2013-02-16 05:53:19
【问题描述】:

我找不到我的问题。一直给我这些错误:

"c:2:5: note: expected 'int *' but argument is of type 'int'"
"c:28:1: warning: passing argument 1 of 'CountEvenNumbers' makes pointer from
   integer without a cast [enabled by default]"

代码如下:

1 #include <stdio.h>
2 int CountEvenNumbers(int numbers[], int length);
3 int main(void)
4 {
5 int length;
6 int X;int Z; int Y; int W;
7 X=0;Y=0;Z=0;W=0;
8 printf("Enter list length\n");
9 scanf("%d",&length);
10 int numbers[length];
11 
12 if (length<=0)
13 .   {printf("sorry too low of a value\n");
14 .   .   return 0;}
15 else
16 .   {
17 .   printf("Now, enter %d integers\n",length);
18 .   for (X=0;X<length;X++)
19 .   .   {scanf("%d",&Y);//X is position in array, Y is value.
20 .   .   numbers[X]=Y;
21 .   .   }
22 .   printf("The list reads in as follows:\n");
23 .   for (W=0;W<length;W++)
24 .   .   {Z=numbers[W];
25 .   .   printf("%d ",Z);}
26 .   printf("\n");
27 .   }
28 CountEvenNumbers( numbers[length] , length );
29 return 0;
30 }
31 
32 int CountEvenNumbers(int numbers[], int length)
33 {
34 .   int odd_count;int even_count;int P;int Q;
35 .   Q=0; odd_count=0;even_count=0;
36 .   for (P=0;P<length;P++)
37 .   .   if (numbers[Q]==0)
38 .   .   .   {even_count++;
39 .   .   .   Q++;}
40 .   .   else if ((numbers[Q]%2)!=0)
41 .   .   .   {odd_count++;
42 .   .   .   Q++;}
43 .   .   else
44 .   .   .   {even_count++;
45 .   .   .   Q++;}
46 .   printf("There are %d even numbers in the series\n",even_count);
47 .   return 0;
48 }

【问题讨论】:

  • 感谢您在代码中包含行号!
  • @NikBougalis:行号意味着我不能轻易复制粘贴代码并在我自己的系统上尝试。显示缩进的点加剧了问题。在错误消息指示的行上添加 cmets 就足够了。 (来自未来的问候!)
  • Future me 同意行号会阻止有效的复制粘贴。 StackOverflow 添加代码块的好选择?

标签: c arrays pointers casting integer


【解决方案1】:

你的问题的答案是交换这个:

CountEvenNumbers(numbers[length], length);

为此

CountEvenNumbers(numbers, length);

但是,如果您继续编码,您可能会发现一项非常宝贵的技能是破译警告/错误消息:

"c:2:5: 注意:预期为 'int *' 但参数的类型为 'int'"
"c:28:1: 警告:传递 'CountEvenNumbers' 的参数 1 使指针来自 没有强制转换的整数 [默认启用]"

那是什么意思?它指出在第 28 行 (CountEvenNumbers( numbers[length] , length ); ) 它希望您对参数 1 进行强制转换,这意味着您向它传递了一些它没有预料到的东西。所以你知道第一个论点有问题。

这里的诀窍是另一行:expected 'int *' but argument is of type 'int' 它说“我想要一个指向整数的指针,但你只给了我一个整数”。这样你就知道你传递了错误的类型。

所以你应该问自己的是,参数 1 是什么类型?你知道如果你想访问数组中的一个元素,你需要使用[]'s,(你在代码的第20和25行这样做了),所以通过将numbers[length]传递给你的函数,你试图将单个元素1 传递给它,而不是像它期望的那样传递一个完整的数组。

另一半是expected 'int *',为什么你的函数会期望得到一个指向int的指针?那是因为在 C 中,当您将一个 (type) 数组传递给它 decays 到一个指向 (type) 的指针时。

1 当然 numbers[length] 不是真正的元素 in 无论如何,它会溢出它。

【讨论】:

  • 谢谢!!!我知道它与那个数组有关。我不确定如何解决它。我尝试了几种不同的方法。只是没有这个。谢谢。
【解决方案2】:

在第 28 行,您尝试在数字的索引“长度”处传递整数。你应该只传递数字本身,所以像CountEvenNumbers(numbers, length);

【讨论】:

    【解决方案3】:

    试试这个。

    #include <stdio.h>
    #include <stdlib.h>
    
    int CountEvenNumbers(int numbers[], int length);
    int main(void)
    {
        int length;
        int X;int Z; int Y; int W;
        X=0;Y=0;Z=0;W=0;
        printf("Enter list length\n");
        scanf("%d",&length);
    
        int *numbers = (int*) calloc(length, sizeof(int)); //***************
    
    
        if (length<=0)
        {printf("sorry too low of a value\n");
        return 0;}
        else
        {
            printf("Now, enter %d integers\n",length);
            for (X=0;X<length;X++)
            {scanf("%d",&Y);//X is position in array, Y is value.
            numbers[X]=Y;
            }
            printf("The list reads in as follows:\n");
            for (W=0;W<length;W++)
            {Z=numbers[W];
            printf("%d ",Z);}
            printf("\n");
        }
        CountEvenNumbers( numbers , length ); //**************
        free (numbers);
        return 0;
    }
    
    int CountEvenNumbers(int numbers[], int length)
    {
        int odd_count;int even_count;int P;int Q;
        Q=0; odd_count=0;even_count=0;
        for (P=0;P<length;P++)
            if (numbers[Q]==0)
            {even_count++;
        Q++;}
            else if ((numbers[Q]%2)!=0)
            {odd_count++;
        Q++;}
            else
            {even_count++;
            Q++;}
            printf("There are %d even numbers in the series\n",even_count);
            return 0;
    }
    

    【讨论】:

      【解决方案4】:

      阅读 C 教程,真的。 array[index] 下标/索引数组,因此它产生数组中的indexth 元素。如果您想传递要对其自身进行操作的数组(嗯,而不是指向其第一个元素的指针),那么只需写下它的名称:

      CountEvenNumbers(numbers, length);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-08
        • 2012-05-03
        相关资源
        最近更新 更多