在C99中的除法中使用指针,错误:到二进制的操作数无效

在C99中的除法中使用指针,错误:到二进制的操作数无效,c,pointers,c99,C,Pointers,C99,这个问题看起来确实很愚蠢,但我总是浪费很多时间,测试/错误直到它起作用,处理这类问题 我需要一个指针从函数返回一个值,然后我需要除以这个值,但我有编译器错误: 二进制操作数无效/(有'int*'和'int') 以下代码中的示例: void test(int *x, int y) { *x = *x+y; } int main() { int *x = 20; int y = 1; test(&x, y); printf("x: %i", x)

这个问题看起来确实很愚蠢,但我总是浪费很多时间,测试/错误直到它起作用,处理这类问题

我需要一个指针从函数返回一个值,然后我需要除以这个值,但我有编译器错误:

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

以下代码中的示例:

void test(int *x, int y)
{
    *x = *x+y;
}

int main()
{
    int *x = 20;
    int y = 1;

    test(&x, y);

    printf("x: %i", x);

    float res = x / 2; // error: invalid operands to binary / (have 'int *' and 'int')

    //float res = *x / 2; // application crash with this one. (GCC native Android)
}

我尝试使用“&”,但它不起作用(x=0),我尝试将其转换为int,只获取指针地址,等等。

您当前的问题是您已将
x
声明为指向int的指针,但您试图将其用作int。要简单地更正最后一行,请取消引用指针(就像您在
test()中正确执行的操作一样)
):

现在,您似乎真的尝试过了,但出现了一个错误,这并不奇怪,因为您的
x
初始化得很糟糕:

int *x = 20;
这不会创建int值20并使x指向它。它将x设置为指向由整数值20表示的内存地址。这可能是保留内存,这就是为什么在尝试取消引用时会出现错误

(在
test()
中不会出现该错误,因为您已将
x
的地址作为参数传递。因此,在那里取消引用它实际上会使您得到20个-可能)

要使指针工作,请执行以下操作之一:

int x = 20;
...
test(&x, y)
...
float res = x / 2;
或:

但你真的让这太难了。因为您只需要从函数中输出一个值,所以只需让函数返回该值即可。这样,您就根本不需要乱用指针了:

int test(x,y) { return x+y; }
...
int x = 20;
...
x = test(x,y);
...
float res = x / 2;

(最后,我相信,在任何情况下,如果希望得到浮点结果而不是整数,您都希望在最后一行中使用
2.0
,而不仅仅是
2

int*x=20
表示:
x
是指向存储在地址
20
处的
int
的指针。当您遵从它时,CPU将尝试从地址
20
读取
int
值,但地址
20
在当前进程空间中是无效地址,因此程序崩溃

您可能想说的是:
x
是指向
int
的指针,它指向的
int
的值是
20
,对吗?嗯,这应该是:

int someInt = 20;
int * x = &someInt;

现在
x
指向存储其值的任何地址
someInt
(实际上它位于主函数的堆栈空间中,但这只是一个侧节点),而存储在该地址的值实际上是
20

谢谢Mat,我编辑了这个问题。如果只是交叉编译导致崩溃,也许我应该更改标题?
int*x=20
使
x
成为指向地址20的指针,在地址20中存储
int
可能是不合法的。你希望这样做能达到什么目的?指针需要指向某个地方。这在每个平台上都是无效的代码,尽管在某些平台上可能很幸运。它只能从更大的函数返回值。使用
int*x
时,您有
x
是一个指针。。。
int*x=20您希望该指针为
20
<代码>20
??地址20是什么,假设你的计算机不想让一个指针有那个值?指针的除法是什么意思?这就像问鱼的平方是多少,或者说是所有恐惧总和的一半。谢谢你的澄清,戴夫。
int test(x,y) { return x+y; }
...
int x = 20;
...
x = test(x,y);
...
float res = x / 2;
int someInt = 20;
int * x = &someInt;