无效操作数到二进制/(有'int *'和'int')?

时间:2011-12-10 23:57:21

标签: c header-files operands

每次我尝试这个:

long crypt(int *integer)
{
printf("Enter five digit integer:\n");  
scanf("%i",integer);

int digit1=integer/10000;
int digit2=(integer%10000)/1000;
int digit3=(integer%1000)/100;
int digit4=(integer%100)/10;
int digit5=(integer%10)/1;

const char *digit1c[10];
const char *digit2c[10];
const char *digit3c[10];
const char *digit4c[10];
const char *digit5c[10];

(还有更多,但这似乎是问题,我会根据要求添加其余部分。)

然后它返回此错误:

math2.h:44:20: error: invalid operands to binary / (have ‘int *’ and ‘int’)
math2.h:45:21: error: invalid operands to binary % (have ‘int *’ and ‘int’)
math2.h:46:21: error: invalid operands to binary % (have ‘int *’ and ‘int’)
math2.h:47:21: error: invalid operands to binary % (have ‘int *’ and ‘int’)
math2.h:48:21: error: invalid operands to binary % (have ‘int *’ and ‘int’)

我知道它与我用来初始化数字的运算符有关,我确实尝试将它们的类型更改为“int *”,但这不起作用。 那么这里到底发生了什么?

3 个答案:

答案 0 :(得分:13)

integer指针intint*),因此当您想要使用它指向的int时,您需要取消引用它:

int digit1=(*integer)/10000; // and so on...

答案 1 :(得分:4)

参数integer不是int个对象;它是一个int*对象,即一个指针。 (并且integer是指针对象的误导性名称。)

如果你改变:

int digit1=integer/10000;

int digit1 = *integer / 10000;

并对其余代码进行相应的更改,至少会编译。 integer是一个指针; *integer是它所指向的int对象。

(另外,二元运算符周围的空格会使你的代码更容易阅读。使用空格的另一个好理由是,如果除法被颠倒了,那么:

int digit1=10000/*integer;

会引入/* ... */评论。)

答案 2 :(得分:4)

此处的问题是integer的类型是int *,这是一个不支持/%的运算符的指针。您的问题有两种解决方案。

  1. 取消引用integer,每次使用*运算符时都使用int digit1=(*integer)/10000;运算符。
    例如integer

  2. int更改为&类型。您必须更改函数的签名,并且必须更改scanf以使用scanf("%i",&integer);运算符{{1}}