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



这个问题看起来确实很愚蠢,但我总是浪费很多时间,在解决这种问题之前进行测试/错误。

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

invalid operands to binary / (have 'int *' and '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()中正确地做的那样(:

float res = *x / 2;

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

int *x = 20;

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

(你不会在test()中得到这个错误,因为你已经传递了x的地址作为参数。所以在那里取消引用它实际上确实会得到20——可能。(

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

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

或:

int *x = malloc(sizeof(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;

(最后,我相信,在任何情况下,如果你想得到一个浮点结果而不是int,你都想在最后一行使用2.0,而不仅仅是2。(

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

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

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

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