警告:指针和整数之间的比较[默认启用]

时间:2014-10-01 16:07:48

标签: c

所以,我只是用C语言练习(我是初学者),但我现在仍然坚持这个程序:

#include <stdio.h>
#include <string.h>

int main(){
    int numbers[12] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
    int i;
    int *point;

    point = numbers;

    while(i){

        printf("Write number in ranging 1 - 40: \n");
        scanf("%d", &numbers);

        if (numbers, point){
            printf("Your number is prime number.\n");
        }
        else if ((numbers <= 0) || (numbers >= 41)){
            printf("Only numbers: 1 - 40.\n");
        }
        else{
            printf("Try again.\n");
        }

        i;
    }
    return 0;
}

当我想编译它时,我只是收到此错误消息:

  

test.c:在函数'main'中:

     

test.c:19:38:警告:指针和整数之间的比较[默认启用]

我环顾了Stack Overflow,但我没有发现类似的主题,也没有帮助我。

3 个答案:

答案 0 :(得分:1)

即使你是初学者,你仍然应该努力告诉我们哪些行给你错误,因为要确切地说出19号是哪一行并不容易。

我认为这条线给你带来了麻烦。

if (numbers, point){    // bad

你可能打算调用一些以numberspoint为参数的函数。就像现在一样,这个if语句总是会计算为true,因为你使用的是逗号运算符,它只使用右边的thing的值,恰好是一个非空指针(point) 。怎么样:

if is_a_prime(numbers, point)

继续前进,实际导致错误的行很可能是这一行:

 else if ((numbers <= 0) || (numbers >= 41)){    // bad

由于numbers是一个数组,因此编写numbers <= 0没有多大意义。也许您打算写numbers[0] <= 0*point <= 0,或者您想使用for循环迭代数组中的每个数字以确保它是正数。

另外,(感谢isedev看到这一点),在访问之前,你永远不会将i设置为任何值,因此您的程序将具有未定义的行为。尝试在顶部附近写i = 1;之类的内容。

答案 1 :(得分:0)

此代码中存在一些问题:

  1. 您的i值变量未初始化
  2. 如果i的垃圾值不为零,则为无限循环
  3. 在if条件下,您需要进行逻辑操作
  4. 您正在使用scanf()而不是您使用的指针正在使用指向指针的指针

答案 2 :(得分:0)

首先,这个程序很可能不会运行。特别是因为当我未初始化时(即垃圾)你正在说while (i)。它可能是零或其初始地址恰好指向的任何其他值。

其次,if (numbers, point)是什么意思?这并不意味着什么 此外,point numbers,因此没有理由对它们进行比较。

第三,如果要检查素数,请使用模运算符。与this一样。

最后,指针不是整数或数组。当你说point = numbers只将numbers的地址存储在内存中point,并使用指针算术时(因为pointer[3]array[3]意味着相同的事情〜pointer + (3 * sizeof(datatype))),您可能认为指针是一个数组,但它不是。这是一个例子:

int h, *p;
h = 5;
*p = &h;
printf("*p: %d\n", *p);
h = 8;
printf("*p: %d\n", *p);

此处,*ph的值,原因非常简单 ph的地址存储在内存中,当您说h = 5时,计算机会更改内存中 h地址处的值。由于p碰巧将地址本身存储在其中,因此可以简单地获取在那里找到的值。简而言之,ph,点无关。