传递参数2使得指针来自整数而没有强制转换

时间:2014-02-20 14:45:14

标签: c

我有这个功能:

int second(int x,int c[100])
{
    int b,e=0;
    for(b=0;b<x;b++)
        {
        if(c[b]!=(65||117))
        e++;
        }
        return (e);
}  

此循环将检查数组中的数字数不相等 到65或117,要增加的值是计算多少
数字是那些,这个值将返回到主函数。

现在我想在main函数中使用返回的值。 这是我正在使用的语法:

h=second(x,c[100]);

我收到此错误:

"passing argument 2 of second makes pointer from integer without a cast"

如何让函数返回该值?

4 个答案:

答案 0 :(得分:5)

要了解正在发生的事情,需要了解以下事项。

int second(int x,int c[100])中,参数c声明为数组为100 int会自动转换为声明c指针int。这种对数组的特殊处理始终应用于函数参数。 (它不适用于参数的子部分。例如,指向数组的指针不会转换为指向指针的指针。)

在您的计划中的某个地方,您可能会有像int c[100];这样的行。该行确实将c声明为100 int的数组。

h=second(x,c[100]);中,表达式c[100]引用数组c的元素100。因此,这个表达式是单个int。您不应该将int传递给函数,因为它期望指向int。您可能希望将指针传递给数组的第一个元素。这个的C语法是&c[0]。 C提供了一些帮助,可以将其缩写为c。如果您编写h = second(x, c);,则c将自动从数组转换为指向其第一个元素的指针。

只要表达式(包括任何子表达式)是一个数组且不是sizeof,一元&_Alignof的操作数且不是字符串,就会发生此自动转换用于初始化数组的文字。

此外,if(c[b]!=(65||117))不会测试c[b]是否不等于65或117.要执行此测试,您应使用if (c[b] != 65 && c[b] != 117)。你写它的方式,65||117是一个表达true if either 65 or 117 is true的表达式。出于这些目的,非零值为真,因此65||117为真。同样出于这些目的,true变为整数1(并且false将为0)。因此,此测试为if (c[b] != 1),这不是您想要的。

答案 1 :(得分:3)

你想要

h=second(x,c);

你现在正在做的是尝试在索引100处传递元素,这很糟糕。你想传递数组。

答案 2 :(得分:2)

你正在以错误的方式传递阵列 你应该这样做:h=second(x,c);

function(int a , int array[])表示2nd argument是数组的base address 对于数组,基址实际上是数组的名称。

示例数组[100] 的基地址为array

答案 3 :(得分:2)

您的通话错误,不应包含括号。只是做:

h = second(x, c);

此外,还有

if(c[b]!=(65||117))

可能用英文读,这不是C的工作原理。

一定是

if(c[b] == 65 || c[b] == 117)

||运算符分隔整个表达式,而不仅仅是左侧的替代。