所以,我只是用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,但我没有发现类似的主题,也没有帮助我。
答案 0 :(得分:1)
即使你是初学者,你仍然应该努力告诉我们哪些行给你错误,因为要确切地说出19号是哪一行并不容易。
我认为这条线给你带来了麻烦。
if (numbers, point){ // bad
你可能打算调用一些以numbers
和point
为参数的函数。就像现在一样,这个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)
此代码中存在一些问题:
i
值变量未初始化i
的垃圾值不为零,则为无限循环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);
此处,*p
是h
的值,原因非常简单
p
将h
的地址存储在内存中,当您说h = 5
时,计算机会更改内存中 h地址处的值。由于p
碰巧将地址本身存储在其中,因此可以简单地获取在那里找到的值。简而言之,p
与h
,点无关。